我是编写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
我想跟踪每个单元格的更改,但也允许多次选择,复制和粘贴而不会出现错误消息。
感谢您帮助我,如果您需要更多信息,请告诉我们, 艾米
答案 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