我一生无法找出导致此不匹配错误的VBA Excel的原因吗?

时间:2018-06-26 18:00:46

标签: excel vba excel-vba vlookup type-mismatch

我有这段代码会导致失配错误,我无法弄清楚为什么我之前会因失配错误而使它工作,而试图对其进行修复,我无法使其恢复工作。合并表中的值都是数字。基本上我想做的是,当将值输入到单元格中时,将执行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的成功帮助,我进行了更多研究,并在下面发布了解决我问题的方法。

3 个答案:

答案 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值,因此无法隐式转换为StringLong或其他任何值。可以包含此数据的唯一类型是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(与RowsColomnsNamesCells一样的调用),因为它们完全是合格的相同的代码根据其写入位置的不同而表现不同。通过使用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)

我弄清楚了最后一个问题是...由于以前的文档编辑器的某种原因,查找列被格式化为文本。之所以只能使用某些查找值,是因为即使我将整个列格式化为数字,也只有在我编辑了单元格之后,所述值才重新格式化为数字。我不想编辑每个单元格,所以做了一些研究,发现了如何刷新整个列的格式。

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

  1. 选择整个列
  2. 根据需要设置列格式
  3. 转到“数据”功能区,然后选择“文本到列”
  4. 确保已选择“定界”,单击“下一步”
  5. 取消选中所有定界符,单击“下一步”,然后单击“完成”