【问题标题】:VBA Vlookup not finding values that existVBA Vlookup 找不到存在的值
【发布时间】: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 列宽

标签: excel vba vlookup


【解决方案1】:

如果您尝试从 Column C 返回第 6 个值,您的范围需要更新为 `PAsheet.Range("C2:H2000")

cell.Value = WorksheetFunction.VLookup(cell.Offset(, -6), PAsheet.Range("C2:H2000"), 6, False)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多