如何在跟踪单个单元格的更改时允许多个单元格选择

时间:2018-06-04 03:09:35

标签: excel vba excel-vba debugging

我是编写VBA代码的新手,我设置了一个代码来跟踪基本excel文件中的更改。从双击单元格时隐藏和重新打开轨道更改历史记录表开始,然后使用workbook_SheetChange指示我要跟踪和完成Workbook_SheetSelectionChange的信息。

如果我只在Masterfile表上选择一个单元格,则此代码可以正常工作。一旦我选择多个单元格,行和列或想要复制和粘贴,我收到运行时错误消息'13' - 类型不匹配。在调试代码时,它会突出显示代码的这一部分:

    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    oldValue = Target.Value
    oldAddress = Target.Address
    End Sub

作为一个全局变量,我写道:         Dim oldValue as As String

我想跟踪每个单元格的更改,但也允许多次选择,复制和粘贴而不会出现错误消息。

感谢您帮助我,如果您需要更多信息,请告诉我们, 艾米

2 个答案:

答案 0 :(得分:0)

您尝试将多个单元格字符串值发送到单个变量(oldValue),这有点像尝试将多个单元格复制到单个单元格中。

一种解决方案可能是创建一个数组,并循环遍历每个单元格并单独处理。这里有一种经过修改的样本,可用于您正在做的事情:

    Dim trackChangesWS As Worksheet
    Set trackChangesWS = Sheet1 'wherever sheet these are being stored.

    Dim MaxArrayCount As Long
    MaxArrayCount = Target.Cells.Count - 1

   'Create Arrays (these could be combined for 1 with two dimensions, 
   'but keeping 2 to match your example)
    ReDim String_Array(0 To MaxArrayCount) As String
    ReDim Address_Array(0 To MaxArrayCount) As String

    Dim rCell As Range
    'loop through cells and capture address and cells
    For Each rCell In Target.Cells
        String_Array(i) = rCell.Value
        Address_Array(i) = rCell.Address
        i = i + 1
    Next rCell

    'set values on some corresponding sheet
    For i = 0 To MaxArrayCount
        trackChangesWS.Range(Address_Array(i)).Value = String_Array(i)
    Next i

答案 1 :(得分:0)

非常感谢你的反馈@PGCodeRider。由于我对VBA很陌生,我不确定如何将上述内容集成到我编写的代码中。我完全理解我造成的错误。跟踪变更的目的是:第一张表是我们的主数据库" Variation Masterfile",A队更新并维护该信息。每个更改都需要在单独的表格中进行跟踪。#34; Tracked Changes"我们的团队B使用反向链接评估并记录所有更改。这是我到目前为止所写的内容,我认为它只是包含上面的数组创建和循环的基础:

Dim oldValue As String
Dim oldAddress As String

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim sSheetName As String
sSheetName = "Variation Masterfile"
If ActiveSheet.Name <> "Tracked Changes" Then
Application.EnableEvents = False
Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = ActiveSheet.Name
Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(0, 1).Value = Target.Address(0, 0)
Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(0, 2).Value = oldValue
Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(0, 3).Value = Target.Value
Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(0, 4).Value = Environ("username")
Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(0, 5).Value = Date
Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(0, 6).Value = Time

Sheets("Tracked Changes").Columns("A:R").AutoFit
Application.EnableEvents = True
End If

If Target.Count > 1 Then Exit Sub
If ActiveSheet.Name <> "Tracked Changes" Then
Application.EnableEvents = False
Sheets("Tracked Changes").Hyperlinks.Add Anchor:=Sheets("Tracked Changes").Range("A" & Rows.Count).End(xlUp).Offset(0, 7), Address:="", SubAddress:="'" & sSheetName & "'!" & oldAddress, TextToDisplay:=oldAddress

Sheets("Tracked Changes").Columns("A:R").AutoFit
Application.EnableEvents = True
End If

If Target.Value <> "" Then
Target.Interior.ColorIndex = 7
End If
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
oldValue = Target.Value
oldAddress = Target.Address
End Sub
相关问题