[英]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.