我有这段代码会导致失配错误,我无法弄清楚为什么我之前会因失配错误而使它工作,而试图对其进行修复,我无法使其恢复工作。合并表中的值都是数字。基本上我想做的是,当将值输入到单元格中时,将执行VLookup
以将值输入到相邻的单元格中,一旦我开始工作,同一行中就会有更多的单元格。如果你们中有人想解决问题,请告诉我!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Dim LooupValue As String
Dim sfx As Long
Set KeyCells = Columns(1)
LooupValue = ActiveCell.Value
sfx = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range(Target.Address).Offset(0, 1).Value = sfx
End If
End Sub
编辑:感谢@ Marcucciboy2,@ MathieuGuindon和@BigBen的成功帮助,我进行了更多研究,并在下面发布了解决我问题的方法。
答案 0 :(得分:4)
Dim sfx As Long sfx = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)
如果vlookup
产生xlErrNA
即#N/A
,则VBA无法将其结果强制转换为Long
,您将得到以下确切信息:不匹配错误-因为xlErrNA
是一个Error
值,因此无法隐式转换为String
,Long
或其他任何值。可以包含此数据的唯一类型是Variant
。
Dim result As Variant
result = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)
Dim sfx As Long
If Not IsError(result) Then
sfx = CLng(result)
Else
'lookup yielded no match
End If
此外,它看起来像是一对一的:
LooupValue = ActiveCell.Value
ActiveCell
可能与Target
不同,后者是被修改的单元格。您可能需要此代替:
LookupValue = Target.Value
我还建议进行不合格的Range
(与Rows
,Colomns
,Names
和Cells
一样的调用),因为它们完全是合格的相同的代码根据其写入位置的不同而表现不同。通过使用Me
对它们进行限定,可以使代码更加明确。 说明其功能并按其说的的代码始终是更好的代码。
Worksheets("Merge")
是一种气味:如果工作表在编译时位于ThisWorkbook
中,请为其指定一个代号(即,设置其(Name)
属性)并直接使用该标识符:
result = Application.VLookup(LooupValue, MergeSheet.Range("D:BD"), 2, False)
如果工作表仅在运行时存在(例如在宏打开的工作簿中),则应该在打开该文件的位置附近引用该工作簿,例如Set book = Application.Workbooks.Open(path)
-使用该引用限定Worksheets
成员调用,而不是隐式引用ActiveWorkbook
。
仅在列D:DB
中查找值时,查找范围E
过多。如果该硬编码的2
仍然存在,我将查找范围设为D:E
。
答案 1 :(得分:2)
我还将在“ If”中嵌套值设置,以检查交叉点;否则,每次更改工作表时,都会在后台执行不必要的vlookup。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then
Target.Offset(0, 1).value = Application.VLookup(Target.value, Worksheets("Merge").Range("D:BD"), 2, False)
End If
End Sub
答案 2 :(得分:-1)
我弄清楚了最后一个问题是...由于以前的文档编辑器的某种原因,查找列被格式化为文本。之所以只能使用某些查找值,是因为即使我将整个列格式化为数字,也只有在我编辑了单元格之后,所述值才重新格式化为数字。我不想编辑每个单元格,所以做了一些研究,发现了如何刷新整个列的格式。
我通过执行以下操作刷新了该列: