具有excel IF,索引,匹配功能的复杂VBA功能

问题描述 投票:0回答:2

请帮我创建具有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”的Sheet“Sal-data”中的当前Grid为2,则新Grid将为3,但“b”Grid 3的“Grid”表中的值为0(零),则Grid不应增加。在这种情况下,如果“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   

比你提前。

excel vba excel-formula
2个回答
0
投票

一,你不需要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)

enter image description here


这允许仅使用网格范围,不需要以不同方式指定第一行和列:

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)

enter image description here


网格表:供参考

enter image description here


0
投票

未经测试:

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)从中找出查找范围

© www.soinside.com 2019 - 2024. All rights reserved.