【问题标题】:Excel VBA not able to trace all rows that was changed via copy & PasteExcel VBA 无法跟踪通过复制和粘贴更改的所有行
【发布时间】:2021-03-05 07:21:57
【问题描述】:

我是 VBA 新手,我需要在 excel 中跟踪所有修改的行。 excel 文件预计将有数百万条记录,而用户预计只有少数列或行会被修改。为了节省时间,我计划只将修改后的记录更新回 sql rest 删除它。我设法让下面的代码按照预期工作,但前提是用户手动修改。如果用户复制并粘贴多行,则仅将第一条记录标记为已修改,其余则不标记。

我要求通过手动或复制粘贴到该工作簿中来跟踪任何更改

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rw As Long
    Dim cw As Long
    rw = [Sheet1!b8].CurrentRegion.Rows.Count
    cw = [Sheet1!b8].CurrentRegion.Columns.Count
    lcw = ColumnLetter(cw)
    Dim xrng As Range   
    Set xrng = Range("c1:" &lcw & rw)
    If Not Application.Intersect(xrng, Range(Target.Address)) _
        is Nothing Then
           If Target.Row > 1 Then Cells(Target.Row, 1) = "M"
           End If
    End If  
        
End Sub

Public Function ColumnLetter(ColumnNumber As Long) As String
    ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False), "$")(0)
End Function

【问题讨论】:

  • 不明白你的代码的确切逻辑,但你必须遍历Target的所有行
  • 我的要求是标记每一个用“M”修改的填充行,但我的代码无法复制和粘贴。是的,你已经正确地指出了它我不确定我应该在哪里放置循环。感谢您的回答

标签: excel vba copy-paste


【解决方案1】:

你要用 Intersect 做的事情并不完全干净,但在这里你是一个 sn-p,在第一列用 M 标记所有受影响的行:

Private Sub Worksheet_Change(ByVal Target As Range)
    
     Dim v

     Application.EnableEvents = False
     For Each v In Target
         if v.Row > 1 And v.Column > 1 Then Cells(v.Row, 1) = "M"
     Next
     Application.EnableEvents = True

End Sub

注意事项:

For Each 循环管理多个单元格选择。

需要Application.EnableEvents = False 以防止子在更改Cells(..., 1) 时触发

此代码并不完美,因为它覆盖Cells(..., 1) 的次数是受影响范围包含的列数的倍数。但是如果它不是太慢的话,你可以保持这个简单。试试看吧。

【讨论】:

  • 非常感谢您,这完全符合要求。附加查询是否可以限制该excel中填充的行数和列数,而不是所有行。
  • @Pravin Target 仅包含选定的单元格。单个单元格或受影响的范围。用户可以删除或粘贴超出填充范围的数据块,您也需要对此进行处理。在不充分了解业务需求的情况下,我建议定制 `If v.Row > 1 ...` 行以限制对具有真实数据的行的进一步处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
相关资源
最近更新 更多