Excel,Trying Index,Match,用VBA查找值

我试图在单元格位置使用VBA查找值,我之前search谷歌和所有的stackoverflow这个问题之前,因为我似乎无法得到它的工作。

以下是我正在尝试使用的代码,请注意,预算代码引用包含第一列代码之一的单元格,并且引用包含数字(1-12)或包含短代码(ytd,1qtr, 2qtr,3qtr)。 例如,我想拉2月(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 

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

  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 

这是单元格中的代码,但是我需要在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)) 

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

谢谢,

问题是Function参数types。

当你用mo =单元格AN1调用你的函数时,函数types把它转换为string "1" ,它不在范围Budget!$G$1:$X$1 ,因为这些也是数字

解决方法是使用Variant作为函数参数types。

为了更容易地debugging这种types的错误,尽量不要在一行代码中做太多事情。 将这条线分成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 

称为

 =eBudgetl(Budget!$G$1:$X$5000,Budget!$B$1:$B$5000,Budget!$G$1:$X$1,$F12,AN$1)