2016-08-29 21 views
0

VBAでループを経由する式を評価しようとしています。失敗する部分は、Evaluate()関数自体、または少なくとも私が使用している構文です。Excel VBA式で文字列で評価する

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

失敗した部分は、数式の末尾に ""ありません。この式を使用すると、各セルは#VALUEに等しくなります。

評価部分を削除しても、数式は必要に応じて機能しますが、さまざまなフィルタをループしているため評価が必要です。

コード全体は以下である:

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

私はあなたが255文字の制限に反するかもしれないと思います。 – pnuts

+0

私は数式を変数に移動し、同じ出力#VALUEを得ることを評価します。私が291文字に数えるエクセルの式だけを使うと、まだ出力が得られます。何か不足していますか? –

答えて

4

式の長さは、(改行をわかりやすくするために追加された)これに代えて、問題の場合:

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

このフォームを使用できます:

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

すべての入力が同じシートから来ているので、そのシートのEvaluateメソッドを使用することができ、式はそのシートのコンテキストで評価されます。

デフォルトのApplication.Evaluateバージョンは、実行時にアクティブなシートを使用します。

+0

まあ、私はおとなしいでしょう。それはそれを修正した。 –