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

用户名

我试图使用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,可以让您看到第二个匹配返回错误。

其他几点:

  • 如果您以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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章