【发布时间】:2019-03-01 11:15:44
【问题描述】:
我在一个工作簿中处理两个不同的工作表。我的任务是从 Sheet1 中查找产品的型号#,在 Sheet2 中找到相同的型号#,并获取该产品的成本,该产品位于几列之外。
所以很自然地,我尝试使用 Vlookup,因为这个功能对于这个查询来说已经足够了。
我将在下面发布我的代码,然后解释我面临的问题。我是 VBA 新手,搜索了许多不同的 Stack 帖子,并尝试了各种解决方案,但均无济于事。
Private Sub CommandButton1_Click()
Dim tbdCell As Range
Dim model As Range
Dim cell As Range
Dim PAsheet As Worksheet
Dim DB As Worksheet
Dim target As Variant
Set DB = Worksheets("Database")
Set PAsheet = Sheets("Pricing Agreement")
Set tbdCell = Range("N2:N4700")
On Error GoTo ErrHandler:
For Each cell In tbdCell
Set model = cell.Offset(0, -6)
cell = WorksheetFunction.VLookup((CStr(model)), PAsheet.Range(CStr("C2:D2000")), 6, True)
Next cell
Exit Sub
ErrHandler:
Select Case Err.Number
Case 0
Case 1004
cell = "missing"
Resume Next
Case Else
MsgBox Err.Number & vbNewLine & Err.Description
Exit Sub
End Select
End Sub
所以在调试和测试时,大多数事情都可以正常工作,直到我们到达我使用 Vlookup 函数的那一行。即使数据存在于另一个电子表格中,我总是会收到错误 1004。因此,我需要填写的单元格将始终填写“缺失”,如上面错误处理代码中所述。
我尝试使用该功能的应用程序版本。我尝试使用不同的变量并将它们声明为 Variant 类型。我什至尝试将 table_array 范围设置为仅包含 2 列覆盖的一行,以尝试强制匹配一个特定模型#。到目前为止,为了避免类型不匹配,我将“模型”(模型#)转换为字符串,并将 PAsheet 中的搜索范围转换为字符串。我尝试的最后一件事是不搜索完全匹配(最后一个参数设置为 true)
因此,鉴于未来有关 Vlookup 所基于的数据的问题,我将提供有关两张表如何格式化的必要信息。
您可能需要的信息:
我们从 N 列开始,其中 Sheet1(数据库)中缺少价格。
我将模型设置为同一行中的值,左侧 6 列(H 列)。
使用 MsgBox 进行测试证明这对我有用,并且在调试时,模型变量显示正确的信息,所以这不是问题。
在 PAsheet 中,模型 #s 在 C 列中。最初我从 C2:C2000 左右创建搜索表,但我被引导相信 Vlookup 至少需要一个两列表才能工作,所以我将 C2000 更改为 D2000。现在搜索范围是一个两列的表。
在 PAsheet 中,产品的成本在 H 列,距离 C 列 5。我需要这个值,所以我在 column_index 参数中输入了 6。之前是5,因为我以为你没有算第一列,但我修正了。
最后,我主要使用“False”作为最后一个参数进行测试,但无论哪种方式都不起作用。
所以在尝试了两打以上的变体和策略之后,我仍然会在需要填充的单元格中“丢失”。
那么,我在这里做错了什么?提前致谢。
【问题讨论】:
-
您的列索引需要为 2。您正在搜索列
C:D,此范围内没有第 6 个索引 -
所以如果我的必要信息在 6 列之外,我应该从列
C:H更改搜索? @urdearboy -
是的。第三个参数应始终介于 2 和搜索范围的列跨度之间。因此,对于
C:D,第三个参数的唯一有效值是 2,因为 2 也是您的列跨度 -
感谢@urdearboy,您的解决方案奏效了!我想我从根本上误解了 column_index 必须包含在 table_array 中。我以为他们没有关系。然而,这确实解释了为什么 table_array 必须至少有 2 列宽