Excel VBA 用公式中的字符串求值
Excel VBA Evaluate with String in Formula
我正在尝试让 VBA 在循环中计算公式。失败的部分是 Evaluate() 函数本身,或者至少是我正在使用的语法。
Worksheets("Sheet2").Range("C2").Offset(All, 0) = _
Evaluate("((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I,ROW(PercentMet!$I:$I301)-ROW(PercentMet!$H),0)),PercentMet!$I:$I301,PercentMet!$G:$G301)/SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G,ROW(PercentMet!$G:$G301)-ROW(PercentMet!$G),0)),--(PercentMet!$I:$I301<>""NA""))))")
失败的部分是公式末尾的“"NA"”。使用此公式,每个单元格等于#VALUE!
如果我删除 Evaluate 部分,公式将按我想要的方式运行,但我需要 Evaluate,因为我循环遍历各种过滤器并且每个值都是唯一的。
完整代码如下:
Sub EthFilter()
Application.ScreenUpdating = False
Dim EthName As Range, GradeName As Range, Rate As Variant, Grade As Variant
Dim One As Integer, Zero As Integer, All As Integer
Set EthName = Worksheets("Sheet2").Range("J1")
Set GradeName = Worksheets("Sheet2").Range("K1")
One = 0
All = 0
For Each Raeth In Range("J1:J7")
Zero = 0
Rate = EthName.Offset(One, 0)
With Worksheets("PercentMet")
.AutoFilterMode = False
With .Range("$A:$O301")
.AutoFilter Field:=6, Criteria1:=Rate
For Each Grades In Range("B2:B9")
Grade = GradeName.Offset(Zero, 0).Value
With Worksheets("PercentMet")
With .Range("$A:$O301")
.AutoFilter Field:=5, Criteria1:=Grade
Worksheets("Sheet2").Range("C2").Offset(All, 0) = _
Evaluate("((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I,ROW(PercentMet!$I:$I301)-ROW(PercentMet!$H),0)),PercentMet!$I:$I301,PercentMet!$G:$G301)/SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G,ROW(PercentMet!$G:$G301)-ROW(PercentMet!$G),0)),--(PercentMet!$I:$I301<>""NA""))))")
End With
End With
All = All + 1
Zero = Zero + 1
Next Grades
End With
End With
One = One + 1
Next Raeth
Application.ScreenUpdating = True
结束子
如果公式的长度有问题,那么可以代替这个(为清楚起见添加换行符):
Worksheets("Sheet2").Range("C2").Offset(All, 0) = Evaluate(
"((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I,ROW(PercentMet!$I:$I301)-
ROW(PercentMet!$H),0)),PercentMet!$I:$I301,PercentMet!$G:$G301)/
SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G,ROW(PercentMet!$G:$G301)-
ROW(PercentMet!$G),0)),--(PercentMet!$I:$I301<>""NA""))))")
您可以使用这种形式:
Worksheets("Sheet2").Range("C2").Offset(All, 0) = Worksheets("PercentMet").Evaluate(
"((SUMPRODUCT(SUBTOTAL(2,OFFSET($I,ROW($I:$I301)-
ROW($H),0)),$I:$I301,$G:$G301)/
SUMPRODUCT(SUBTOTAL(9,OFFSET($G,ROW($G:$G301)-
ROW($G),0)),--($I:$I301<>""NA""))))")
由于所有输入都来自同一个 sheet,您可以使用 sheet 的 Evaluate
方法,公式将在 [=22= 的上下文中计算].
默认 Application.Evaluate
版本使用执行时处于活动状态的 sheet。
我正在尝试让 VBA 在循环中计算公式。失败的部分是 Evaluate() 函数本身,或者至少是我正在使用的语法。
Worksheets("Sheet2").Range("C2").Offset(All, 0) = _
Evaluate("((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I,ROW(PercentMet!$I:$I301)-ROW(PercentMet!$H),0)),PercentMet!$I:$I301,PercentMet!$G:$G301)/SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G,ROW(PercentMet!$G:$G301)-ROW(PercentMet!$G),0)),--(PercentMet!$I:$I301<>""NA""))))")
失败的部分是公式末尾的“"NA"”。使用此公式,每个单元格等于#VALUE!
如果我删除 Evaluate 部分,公式将按我想要的方式运行,但我需要 Evaluate,因为我循环遍历各种过滤器并且每个值都是唯一的。
完整代码如下:
Sub EthFilter()
Application.ScreenUpdating = False
Dim EthName As Range, GradeName As Range, Rate As Variant, Grade As Variant
Dim One As Integer, Zero As Integer, All As Integer
Set EthName = Worksheets("Sheet2").Range("J1")
Set GradeName = Worksheets("Sheet2").Range("K1")
One = 0
All = 0
For Each Raeth In Range("J1:J7")
Zero = 0
Rate = EthName.Offset(One, 0)
With Worksheets("PercentMet")
.AutoFilterMode = False
With .Range("$A:$O301")
.AutoFilter Field:=6, Criteria1:=Rate
For Each Grades In Range("B2:B9")
Grade = GradeName.Offset(Zero, 0).Value
With Worksheets("PercentMet")
With .Range("$A:$O301")
.AutoFilter Field:=5, Criteria1:=Grade
Worksheets("Sheet2").Range("C2").Offset(All, 0) = _
Evaluate("((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I,ROW(PercentMet!$I:$I301)-ROW(PercentMet!$H),0)),PercentMet!$I:$I301,PercentMet!$G:$G301)/SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G,ROW(PercentMet!$G:$G301)-ROW(PercentMet!$G),0)),--(PercentMet!$I:$I301<>""NA""))))")
End With
End With
All = All + 1
Zero = Zero + 1
Next Grades
End With
End With
One = One + 1
Next Raeth
Application.ScreenUpdating = True
结束子
如果公式的长度有问题,那么可以代替这个(为清楚起见添加换行符):
Worksheets("Sheet2").Range("C2").Offset(All, 0) = Evaluate(
"((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I,ROW(PercentMet!$I:$I301)-
ROW(PercentMet!$H),0)),PercentMet!$I:$I301,PercentMet!$G:$G301)/
SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G,ROW(PercentMet!$G:$G301)-
ROW(PercentMet!$G),0)),--(PercentMet!$I:$I301<>""NA""))))")
您可以使用这种形式:
Worksheets("Sheet2").Range("C2").Offset(All, 0) = Worksheets("PercentMet").Evaluate(
"((SUMPRODUCT(SUBTOTAL(2,OFFSET($I,ROW($I:$I301)-
ROW($H),0)),$I:$I301,$G:$G301)/
SUMPRODUCT(SUBTOTAL(9,OFFSET($G,ROW($G:$G301)-
ROW($G),0)),--($I:$I301<>""NA""))))")
由于所有输入都来自同一个 sheet,您可以使用 sheet 的 Evaluate
方法,公式将在 [=22= 的上下文中计算].
默认 Application.Evaluate
版本使用执行时处于活动状态的 sheet。