我试图使用VBA在单元格位置查找值,在问这个问题之前我已经搜索了google和整个stackoverflow,因为我似乎无法正常工作。
以下是我要使用的代码,请注意,budgetcode引用包含第一列中的一个代码的单元格,mo引用包含数字(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
参数类型。
当用包含数字的mo
=单元格调用Function时,Function类型将它强制转换为String字符串,因为这些字符串也是数字,不会存在于范围内。AN1
1
"1"
Budget!$G$1:$X$1
解决方案是将其Variant
用作函数参数类型。
为了使调试这种类型的错误更加容易,请尝试不要在一行代码中做太多事情。将行拆分为2个xMatch
函数和一个Index
,可以让您看到第二个匹配返回错误。
其他几点:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句