Can';我一辈子都不知道是什么导致了VBA Excel的不匹配错误?
我有这段代码,它导致了一个不匹配的错误,我不明白为什么我以前让它在不匹配的错误下工作,为了修复它,我无法让它恢复工作。合并工作表中的值都是数字。基本上我想做的是,当一个值被输入到一个单元格中时,会执行一个Can';我一辈子都不知道是什么导致了VBA Excel的不匹配错误?,vba,excel,vlookup,type-mismatch,Vba,Excel,Vlookup,Type Mismatch,我有这段代码,它导致了一个不匹配的错误,我不明白为什么我以前让它在不匹配的错误下工作,为了修复它,我无法让它恢复工作。合并工作表中的值都是数字。基本上我想做的是,当一个值被输入到一个单元格中时,会执行一个VLookup,将一个值输入到相邻的单元格中,一旦我开始工作,同一行中会有更多的单元格。如果你们中有人想修东西,就告诉我 Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Dim L
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的成功帮助,我做了更多的研究,并将解决问题的方法发布在下面
如果vlookup
产生xlErrNA
即#N/A
,那么VBA无法将其结果强制转换为Long
,而您得到的恰恰是:类型不匹配错误-因为xlErrNA
是一个错误
值,不能隐式转换为字符串
、Long
或任何东西。唯一可以包含此数据的类型是变量
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
此外,这看起来是一个关闭:
ActiveCell
可能与被修改的单元格Target
不同。您可能需要这样做:
LookupValue = Target.Value
我还建议显式限定非限定的范围
(与行
、列
、名称
、和单元格
)调用,因为完全相同的代码根据其写入位置的不同而表现不同。通过使用Me
对它们进行限定,可以使代码更加明确。说它做什么,做它说什么的代码总是更好的代码
工作表(“合并”)
是一种气味:如果工作表在编译时存在于此工作簿中
,请为其指定一个代码名(即设置其(名称)
属性),并直接使用该标识符:
result = Application.VLookup(LooupValue, MergeSheet.Range("D:BD"), 2, False)
如果工作表仅在运行时存在(例如,它位于宏打开的工作簿中),则您应该在打开该文件的位置附近有一个对该工作簿的引用,例如Set book=Application.Workbooks.Open(path)
-使用该引用来限定工作表
成员调用,而不是隐式引用ActiveWorkbook
当您仅在E
列中查找值时,查找范围D:DB
过大。如果硬编码的2
存在,我会将查找范围设置为d:E
如果vlookup
产生xlErrNA
即#N/A
,那么VBA无法将其结果强制转换为Long
,而您得到的恰恰是:类型不匹配错误-因为xlErrNA
是一个错误
值,不能隐式转换为字符串
、Long
或任何东西。唯一可以包含此数据的类型是变量
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
此外,这看起来是一个关闭:
ActiveCell
可能与被修改的单元格Target
不同。您可能需要这样做:
LookupValue = Target.Value
我还建议显式限定非限定的范围
(与行
、列
、名称
、和单元格
)调用,因为完全相同的代码根据其写入位置的不同而表现不同。通过使用Me
对它们进行限定,可以使代码更加明确。说它做什么,做它说什么的代码总是更好的代码
工作表(“合并”)
是一种气味:如果工作表在编译时存在于此工作簿中
,请为其指定一个代码名(即设置其(名称)
属性),并直接使用该标识符:
result = Application.VLookup(LooupValue, MergeSheet.Range("D:BD"), 2, False)
如果工作表仅在运行时存在(例如,它位于宏打开的工作簿中),则您应该在打开该文件的位置附近有一个对该工作簿的引用,例如Set book=Application.Workbooks.Open(path)
-使用该引用来限定工作表
成员调用,而不是隐式引用ActiveWorkbook
当您仅在
E
列中查找值时,查找范围D:DB
过大。如果硬编码的2
将保留,我会将查找范围设置为d:E
我还会将值设置嵌套在检查交叉点的“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
我还将值设置嵌套在检查交叉点的“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
我知道最后一个问题是什么。。。出于某种原因,在上一个文档编辑器中,查找列的格式为文本。之所以只有一些查找值起作用,是因为即使在我将整个列格式化为数字后,所述值也只有在编辑单元格后才重新格式化为数字。我不打算编辑每个单元格,所以我做了一些研究,找到了如何刷新整个列的格式 我通过执行以下操作刷新了该列:
我知道最后一个问题是什么。。。出于某种原因,在上一个文档编辑器中,查找列的格式为文本。之所以只有一些查找值起作用,是因为即使在我将整个列格式化为数字之后,所述值也只有在我编辑之后才重新格式化为数字