Excel,尝试索引,匹配,使用VBA查找值

use*_*159 5 lookup excel vba match

我正在尝试使用VBA在单元格位置查找值,我在搜索谷歌和遍布stackoverflow之后才问这个因为我似乎无法让它工作.

以下是我尝试使用的代码,请注意,budgetcode引用包含第一列中的一个代码的单元格,mo引用包含数字(1-12)或包含短代码的单元格(ytd,1qtr, 2qtr,3qtr).例如,我想在二月份(2)拉出CAD-NS,我应该得到5666.40.

Function eBudgetl(budgetcode As String, mo As String)
eBudgetl = Application.WorksheetFunction.Index(Range("Budget!G1:X5000"), _
   Application.WorksheetFunction.Match(budgetcode, Range("Budget!B1:B5000"), 0), _
   Application.WorksheetFunction.Match(mo, Range("Budget!G1:X1"), 0))
End Function
Run Code Online (Sandbox Code Playgroud)

以下是我希望查找的数据的一部分:

                                       1    2          3       4
CAD-NS      I   Net Sales           5264.0  5666.4  5614.9  5966.6
COSMAT      E   Material            6207.5  3660.0  3661.9  3560.9
COSDL       E   Direct Labor         610.4  105.3   167.1   123.6
CAD-MOIL    E   Indirect Labor       671.2  163.4   181.6   161.7
CAD-MOSAL   E   Salary Overhead      601.0  106.0   101.0   101.0
Run Code Online (Sandbox Code Playgroud)

以下是单元格中的代码,但我需要在VBA中执行.(我需要在vba中执行的原因有时预算代码将包含由逗号分隔的2个以上引用,我将使用vba将它们分开并独立查看每个引用.)

=INDEX(Budget!$G$1:$X$5000,MATCH($F12,Budget!$B$1:$B$5000,0),MATCH(AN$1,Budget!$G$1:$X$1,0))
Run Code Online (Sandbox Code Playgroud)

我非常感谢任何帮助,我已经在这3天了.

谢谢,

chr*_*sen 4

问题在于Function参数类型。

当您使用包含数字的= cell 调用函数时mo函数AN1类型会将其转换为字符串,该字符串不存在于范围内,因为它们也是数字 1 "1"Budget!$G$1:$X$1

解决方案是使用Variant函数参数类型。

为了更容易地调试此类错误,请尽量不要在一行代码中执行太多操作。将该行拆分为 2 个Match函数和一个Index, 将允许您看到第二个匹配返回错误。

其他几点:

  • 如果您将此函数作为UDF调用(即从工作表单元格调用),最好不要对范围进行硬编码。eBudgetl正如所写,当任何数据发生变化时,调用不会自动重新计算。
  • Application对象有一个版本IndexMatch因此WorksheetFunction不需要调用

重构版本来演示:

Function eBudgetl(rData As Range, rBudCode As Range, rMo As Range, budgetcode As Variant, mo As Variant)
    Dim rw As Variant
    Dim col As Variant

    With Application
        col = .Match(budgetcode, rBudCode, 0)
        rw = .Match(mo, rMo, 0)
        eBudgetl = .Index(rData, col, rw)
    End With
End Function
Run Code Online (Sandbox Code Playgroud)

称为

=eBudgetl(Budget!$G$1:$X$5000,Budget!$B$1:$B$5000,Budget!$G$1:$X$1,$F12,AN$1)
Run Code Online (Sandbox Code Playgroud)