请帮我创建具有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
比你提前。
一,你不需要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)
从中找出查找范围