Excel VBA使用公式中的string进行评估

我试图让VBA评估一个公式,因为它经历了一个循环。 失败的部分是Evaluate()函数本身,或者至less是我正在使用的语法。

Worksheets("Sheet2").Range("C2").Offset(All, 0) = _ Evaluate("((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I$2,ROW(PercentMet!$I$2:$I$27301)-ROW(PercentMet!$H$2),0)),PercentMet!$I$2:$I$27301,PercentMet!$G$2:$G$27301)/SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G$2,ROW(PercentMet!$G$2:$G$27301)-ROW(PercentMet!$G$2),0)),--(PercentMet!$I$2:$I$27301<>""NA""))))") 

公式结尾的失败部分是“”NA“”。 使用这个公式,每个单元格相当于#VALUE!

如果我删除评估部分公式工作正常,但我需要评估,因为我通过各种filter循环,每个值是唯一的。

整个代码如下:

 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$1:$O$27301") .AutoFilter Field:=6, Criteria1:=Rate For Each Grades In Range("B2:B9") Grade = GradeName.Offset(Zero, 0).Value With Worksheets("PercentMet") With .Range("$A$1:$O$27301") .AutoFilter Field:=5, Criteria1:=Grade Worksheets("Sheet2").Range("C2").Offset(All, 0) = _ Evaluate("((SUMPRODUCT(SUBTOTAL(2,OFFSET(PercentMet!$I$2,ROW(PercentMet!$I$2:$I$27301)-ROW(PercentMet!$H$2),0)),PercentMet!$I$2:$I$27301,PercentMet!$G$2:$G$27301)/SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G$2,ROW(PercentMet!$G$2:$G$27301)-ROW(PercentMet!$G$2),0)),--(PercentMet!$I$2:$I$27301<>""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$2,ROW(PercentMet!$I$2:$I$27301)- ROW(PercentMet!$H$2),0)),PercentMet!$I$2:$I$27301,PercentMet!$G$2:$G$27301)/ SUMPRODUCT(SUBTOTAL(9,OFFSET(PercentMet!$G$2,ROW(PercentMet!$G$2:$G$27301)- ROW(PercentMet!$G$2),0)),--(PercentMet!$I$2:$I$27301<>""NA""))))") 

你可以使用这种forms:

 Worksheets("Sheet2").Range("C2").Offset(All, 0) = Worksheets("PercentMet").Evaluate( "((SUMPRODUCT(SUBTOTAL(2,OFFSET($I$2,ROW($I$2:$I$27301)- ROW($H$2),0)),$I$2:$I$27301,$G$2:$G$27301)/ SUMPRODUCT(SUBTOTAL(9,OFFSET($G$2,ROW($G$2:$G$27301)- ROW($G$2),0)),--($I$2:$I$27301<>""NA""))))") 

由于所有input来自同一张工作表,因此可以使用该工作表的Evaluate方法,并且将在该工作表的上下文中评估公式。

在执行时,默认的Application.Evaluate版本使用活动的任何表单。