2016-08-29 8 views
0

Ich versuche, VBA zu erhalten, um eine Formel auszuwerten, wie es über eine Schleife geht. Der Teil, der fehlschlägt, ist die Evaluate() - Funktion selbst oder zumindest die Syntax, die ich verwende.Excel VBA Auswerten mit String in Formel

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""))))") 

Der Teil, der fehlschlägt, ist die "" NA "" am Ende der Formel. Mit dieser Formel entspricht jede Zelle #VALUE!

Wenn ich den Evaluate-Teil entferne, funktioniert die Formel wie ich will, aber ich brauche Evaluate, weil ich verschiedene Filter durchlaufen habe und jeder Wert einzigartig ist.

Entire-Code ist unten:

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 

End Sub

+0

Ich denke, dass Sie gegen eine Grenze von 255 Zeichen stoßen können. – pnuts

+0

Wenn ich die Formel in eine Variable verschiebe und auswerte, bekomme ich die gleiche Ausgabe #WERT !. Wenn ich nur die Formel in Excel verwende, die zu 291 Zeichen zählt, bekomme ich immer noch eine Ausgabe. Fehle ich etwas? –

Antwort

4

Wenn die Länge der Formel ein Problem ist, dann statt dessen (Zeilenumbrüche für Klarheit hinzugefügt):

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""))))") 

Sie können dieses Formular verwenden:

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""))))") 

Da alle Eingaben vom selben Blatt kommen, können Sie die Evaluate Methode dieses Blattes verwenden und die Formel wird im Zusammenhang mit diesem Blatt ausgewertet.

Die Standardversion Application.Evaluate verwendet zum Zeitpunkt der Ausführung das jeweils aktive Blatt.

+0

Nun, ich werde verdammt sein. Das hat es behoben. –