我有这个导致不匹配错误的代码,我无法弄清楚为什么我之前在不匹配错误的情况下让它工作,并且试图修复它我无法让它恢复工作。合并表中的值都是数字。基本上我想做的是当一个值输入到一个单元格中时,会有一个 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 的成功帮助,我做了更多的研究并在下面发布了解决我问题的方法。
最佳答案
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
.
关于vba - 我一生都无法弄清楚导致此不匹配错误 VBA Excel 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51048988/