Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我一辈子都不知道是什么导致了VBA Excel的不匹配错误?_Vba_Excel_Vlookup_Type Mismatch - Fatal编程技术网

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

我知道最后一个问题是什么。。。出于某种原因,在上一个文档编辑器中,查找列的格式为文本。之所以只有一些查找值起作用,是因为即使在我将整个列格式化为数字后,所述值也只有在编辑单元格后才重新格式化为数字。我不打算编辑每个单元格,所以我做了一些研究,找到了如何刷新整个列的格式

我通过执行以下操作刷新了该列:

  • 选择整个列
  • 根据需要设置列的格式
  • 转到数据功能区并选择“文本到列”
  • 确保选中了Delimited,请单击Next
  • 取消选中所有分隔符,单击“下一步”,然后单击“完成”

  • 我知道最后一个问题是什么。。。出于某种原因,在上一个文档编辑器中,查找列的格式为文本。之所以只有一些查找值起作用,是因为即使在我将整个列格式化为数字之后,所述值也只有在我编辑之后才重新格式化为数字