繁体   English   中英

Excel VBA在范围的末尾插入/删除行

[英]Excel VBA to insert/delete rows at end of range

我需要根据变量说明插入或删除一些行。

Sheet1有一个数据列表。 使用sheet2格式化后,我想复制该数据,因此sheet2只是一个模板,而sheet1就像一个用户表单。

在for循环之前,我的代码所做的是获取工作表1中仅包含数据的行数以及工作表2中包含数据的行数。

如果用户向sheet1添加更多数据,那么我需要在sheet2的末尾插入更多行,如果用户删除sheet1中的某些行,则这些行将从sheet2中删除。

我现在可以获取每行的行数,因此现在可以插入或删除多少行,但这就是我一直未解决的问题。 我将如何插入/删除正确数量的行。 我也想在白色和灰色之间交替显示行颜色。

我确实认为删除一个工作表sheet2上的所有行,然后使用交替的行颜色插入在工作表sheet1中的相同数量的行可能是一个主意,但是我确实看到了有关在条件格式中使用mod的一些信息。

谁能帮忙吗?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim listRows As Integer, ganttRows As Integer, listRange As Range, ganttRange As Range
    Dim i As Integer


    Set listRange = Columns("B:B")
    Set ganttRange = Worksheets("Sheet2").Columns("B:B")

    listRows = Application.WorksheetFunction.CountA(listRange)
    ganttRows = Application.WorksheetFunction.CountA(ganttRange)

    Worksheets("Sheet2").Range("A1") = ganttRows - listRows

    For i = 1 To ganttRows - listRows
        'LastRowColA = Range("A65536").End(xlUp).Row


    Next i

    If Target.Row Mod 2 = 0 Then
        Target.EntireRow.Interior.ColorIndex = 20
    End If

End Sub

我没有对此进行测试,因为我没有示例数据,但请尝试一下。 您可能需要更改一些单元格引用以适合您的需求。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim listRows As Integer, ganttRows As Integer, listRange As Range, ganttRange As Range
    Dim wks1 As Worksheet, wks2 As Worksheet

    Set wks1 = Worksheets("Sheet2")
    Set wks2 = Worksheets("Sheet1")

    Set listRange = Intersect(wks1.UsedRange, wks1.columns("B:B").EntireColumn)
    Set ganttRange = Intersect(wks2.UsedRange, wks2.columns("B:B").EntireColumn)

    listRows = listRange.Rows.count
    ganttRows = ganttRange.Rows.count

    If listRows > ganttRows Then 'sheet 1 has more rows, need to insert
        wks1.Range(wks1.Cells(listRows - (listRows - ganttRows), 1), wks1.Cells(listRows, 1)).EntireRow.Copy 
       wks2.Cells(ganttRows, 1).offset(1).PasteSpecial xlPasteValues
    ElseIf ganttRows > listRows 'sheet 2 has more rows need to delete
        wks2.Range(wks2.Cells(ganttRows, 1), wks2.Cells(ganttRows - (ganttRows - listRows), 1)).EntireRow.Delete
    End If

    Dim cel As Range
    'reset range because of updates
    Set ganttRange = Intersect(wks2.UsedRange, wks2.columns("B:B").EntireColumn)

    For Each cel In ganttRange
        If cel.Row Mod 2 = 0 Then cel.EntireRow.Interior.ColorIndex = 20
    Next

End Sub

更新

只要重新阅读这行

If the user adds some more data to sheet1 then i need to insert some more rows at the end the data in sheet2 and if the user deletes some rows in sheet1 the rows are deleted from sheet2.

我的解决方案基于用户是否在工作表底部插入/删除行。 如果用户在中间插入/删除行,则最好将整个范围从工作表1复制到已清除的工作表2上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM