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
对象具有Index
和Match
的版本,因此不需要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)