【问题标题】:complex VBA function with excel IF, index, match function具有excel IF、索引、匹配函数的复杂VBA函数
【发布时间】:2020-09-24 02:07:07
【问题描述】:

请帮助我使用 excel IF、索引、匹配函数创建 VBA 函数。这是我的excel函数:

=IF(INDEX(Grid!$B$3:$G$6,MATCH('Sal-Data'!$A2,Grid!$A$3:$A$6,0),MATCH('Sal-Data'!$B2+1,Grid!$B$2:$G$2,0))=0,$B2,$B2+1)

我在此处添加了 VBA 代码,但它不起作用,我想要从 Grid Sheet 获得下一个级别的结果。例如,如果 Emp“b”的工作表“Sal-data”中的当前网格为 2,则新网格将为 3,但“b”网格 3 的“网格”工作表中的值为 0(零),则不应增加网格。在这种情况下,如果“b”当前网格为 3,则 b 的下一个网格可能会得到 4,但网格 4 的值为 0,则“b”的网格不应增加,因为没有值。

这是我的 VBA 编码:

Public Function NGrid(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+1, rBudCode, 0)
        rw = .Match(mo, rMo, 0)
        NGrid = .Index(rData, col, rw)

If NGrid= 0 Then
 With Application
col = .Match(budgetcode, rBudCode, 0)
        rw = .Match(mo, rMo, 0)
        NGrid = .Index(rData, col, rw)
Else
With Application
col = .Match(budgetcode+1, rBudCode, 0)
        rw = .Match(mo, rMo, 0)
        NGrid = .Index(rData, col, rw)
End if 
End with 
End Function

 Excel sheet name : Grid

    1   2   3   4   5   6
a   10  11  12  13  0   0
b   20  21  22  0   0   0
c   30  31  32  33  34  0
d   40  41  42  0   0   0


Excel sheet name : Sal-Data

Emp grid    New grid
a   4   = NGrid (...) required VBA function
a   2   
b   1   
b   2   

比你提前。

【问题讨论】:

  • 代码有什么问题,哪里出错,抛出了什么错误?
  • 首先,去掉 If 块中的两个 With Application 语句 - 它们不是必需的,而且无论如何您都没有匹配的 End With 语句,所以代码无法编译。

标签: excel vba excel-formula


【解决方案1】:

一个,你不需要 Else,因为它只是重复第一个。

两个,每个With 都需要一个End With,在这种情况下不需要另一个With Application

三,索引是Row,Column而不是Column,Row

Public Function NGrid(rData As Range, rBudCode As Range, rMo As Range, budgetcode As Variant, mo As Variant)
Dim rw As Long
Dim col As Long

With Application
    col = .Match(budgetcode + 1, rBudCode, 0)
    rw = .Match(mo, rMo, 0)
    NGrid = .Index(rData, rw, col)
    If NGrid = 0 Then
        col = .Match(budgetcode, rBudCode, 0)
        rw = .Match(mo, rMo, 0)
        NGrid = .Index(rData, rw, col)
    End If
End With
End Function

然后确保在 rData 中包含标题行和列:

=NGrid(Grid!$A$1:$G$5,Grid!$A$1:$G$1,Grid!$A$1:$A$5,B2,A2)


这允许只使用网格的范围,无需分别指定第一行和第一列:

Public Function NGrid(rData As Range, budgetcode As Variant, mo As Variant)
Dim rw As Long
Dim col As Long
Dim rBudCode As Range
Dim rMo As Range
With Application
    Set rBudCode = rData.Rows(1)
    Set rMo = rData.Columns(1)
    col = .Match(budgetcode + 1, rBudCode, 0)
    rw = .Match(mo, rMo, 0)
    NGrid = .Index(rData, rw, col)
    If NGrid = 0 Then
        NGrid = .Index(rData, rw, col - 1)
    End If
End With
End Function

所以上面的公式是:

=NGrid(Grid!$A$1:$G$5,B2,A2)


网格表:供参考

【讨论】:

    【解决方案2】:

    未经测试:

    Public Function NGrid(rData As Range, rBudCode As Range, rMo As Range, budgetcode As Variant, mo As Variant)
        Dim rw As Variant, col As Variant
    
        With Application
            col = .Match(budgetcode + 1, rBudCode, 0)
            rw = .Match(mo, rMo, 0)
    
            If Not IsError(rw) Then
                If Not IsError(col) Then
                    NGrid = .Index(rData, col, rw)
                    If NGrid = 0 Then
                        col = .Match(budgetcode, rBudCode, 0)
                        If Not IsError(col) Then
                            NGrid = .Index(rData, col, rw)
                        Else
                            NGrid = "budget?" 'no col match
                        End If
                    End If
                Else
                    NGrid = "budget+1?" 'no col match on +1
                End If
            Else
                NGrid = "mo?" 'no row match
            End If
        End With
    
    End Function
    

    如果您的源数据始终在第一列和第一行中进行查找,那么您实际上只需要传入一个范围:您可以使用 .Rows(1).Columns(1) 从中挑选查找范围

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2014-12-10
      相关资源
      最近更新 更多