簡體   English   中英

具有excel IF、索引、匹配功能的復雜VBA函數

[英]complex VBA function with excel IF, index, match function

請幫助我使用 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 代碼,但它不起作用,我想要網格表中下一級別的結果。 例如,如果 Emp "b" 的 Sheet"Sal-data" 中的當前網格為 2,則新網格將為 3,但 "Grid" 工作表中 "b" Grid 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   

比你提前。

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

在此處輸入圖片說明


網格表:供參考

在此處輸入圖片說明

未經測試:

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)從中挑選查找范圍

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM