【问题标题】:Excel VBA to insert/delete rows at end of rangeExcel VBA 在范围末尾插入/删除行
【发布时间】:2012-05-31 03:04:46
【问题描述】:

我需要根据变量的状态插入或删除一些行。

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

【问题讨论】:

  • 一个示例工作簿肯定会有所帮助:)
  • 在 www.wikisend.com 上传示例文件,然后在此处分享链接。确保文件不包含任何机密数据。您也可以上传两张工作表的屏幕截图。
  • 我已经尝试像您说的那样上传电子表格,但它引发了 HTTP500 错误。有没有办法上传一些截图?
  • 您可以选择使用的列,然后从“条件格式”图标中选择“新规则”,而不是检查是否需要在每次工作表更改后更改行颜色。使用以下公式:=MOD(ROW(),2)=0,然后使用格式 -> 填充适当的颜色。

标签: vba excel insert conditional-formatting


【解决方案1】:

我没有对此进行测试,因为我没有样本数据,但请尝试一下。您可能需要更改某些单元格引用以满足您的需要。

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.

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

【讨论】:

  • 我认为不需要删除一行。无论如何,这可以完成工作
  • 我认为不需要删除一行 -> 参见 如果用户删除了 sheet1 中的一些行,那么这些行将从 sheet2 中删除 b> 在您的原始帖子中。另外,我刚刚编辑了代码,只将值粘贴到工作表中,也保留了格式。
  • 我认为使用For 循环来应用格式是低效的。另外,以前格式化的行可能会被以后的删除/插入弄乱。我对这个问题的评论是一种解决方案。这是 VBA 方法(由/ 标记的新行):Dim r As Range / Set r = Sheet1.Range("A:E") / r.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(ROW(),2)=0" / r.FormatConditions(r.FormatConditions.Count).SetFirstPriority / r.FormatConditions(1).Interior.Color = 255 / r.FormatConditions(1).StopIfTrue = False 这只会在特定工作表上运行一次。
  • @Zairja - +1 以获得很好的评论。非常真实。我同意。
猜你喜欢
  • 1970-01-01
  • 2014-11-21
  • 2017-02-15
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多