Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


73102 / 76738 ←次へ | 前へ→

【8119】Re:Evaluateとは???
回答  ichinose  - 03/10/1(水) 13:24 -

引用なし
パスワード
   ▼kawata さん:
こんにちは。

>【8037】Arrayへのデータ追加について 
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=8037;id=excel
>
>で質問させていただきました件で、
>(ichinoseさん、bykinさん、ありがとうございました)
>  With Range("a1:a10")
>    cnt = Application.Evaluate( _
>      "=SumProduct((a1:a10 >= 5) * (a1:a10 <= 7))")
>  End With

>というのがありました、で、HELPと格闘してその意味を調べているの
>ですが、HELPをどうひっくり返しても、意味が理解できません(^^;。

Withステートメントが不要でした。
これを悩んでおられたなら、申し訳ありません。消し忘れです。
↑ではないとして・・・、

EvaluateのHelpをみると、
「使用する名前を、オブジェクトまたは値に変換します。」とありますが、

私は、「指定された文字列式を評価した結果を返します」という風に理解しています。

結構、優れものメソッド?

例えば、

  MsgBox Application.Evaluate("3+5")

とすれば、8が表示されますよね?
そして、この文字列式内でワークシート関数も有効なため

cnt = Application.Evaluate( _
      "=SumProduct((a1:a10 >= 5) * (a1:a10 <= 7))")

このコードでセルA1〜A10が1〜10だった場合、3という結果が変数cntに格納されます(Sumproductを使用すれば3という結果が得られる理由はよろしいですよね?)。


さらに文字列式を評価した結果が配列だった場合には配列をも返してくれます。
(かなりの高確率で・・という表現に留めておきますが)

Sub test()
  ans = Application.Evaluate("a1:a10")
  For idx = LBound(ans, 1) To UBound(ans, 1)
    MsgBox ans(idx, 1)
    Next
End Sub

これで1〜10が表示されるはずです。

例えば 前回の
>Sub test()
>  Dim myarray()
>  jdx = 1
>  For idx = 1 To 10
>    With Cells(idx, 1)
>     If .Value >= 5 And .Value <= 7 Then
>       ReDim Preserve myarray(1 To jdx)
>       myarray(jdx) = .Value
>       jdx = jdx + 1
>       End If
>     End With
>    Next idx
>  If UBound(myarray()) > 0 Then
>    Range("b1").Resize(, UBound(myarray())).Value = myarray()
>    End If
>End Sub
Evaluateメソッドを使用すると、
'===================================================
Sub Test()
  Dim ans
  Dim r_ans
  ans = Application.Evaluate("transpose(if((a1:a10>=5)*(a1:a10<=7)=1,text(a1:a10,""@""),""" & Chr(&HFF) & """))")
  If VarType(ans) >= vbArray Then
    r_ans = Filter(ans, Chr(&HFF), False)
    Range("b1").Resize(, UBound(r_ans) - LBound(r_ans) + 1).Value = r_ans
    End If
End Sub

なんて書き方もできました(実務に使用する場合は、細かいエラーチェックが
必要ですが・・、例えば結果が配列ではなかった場合とか・・)。

こんな説明でいかがでしょうか?
0 hits

【8117】Evaluateとは??? kawata 03/10/1(水) 9:05 質問
【8119】Re:Evaluateとは??? ichinose 03/10/1(水) 13:24 回答
【8121】Re:Evaluateとは??? kawata 03/10/1(水) 13:49 お礼

73102 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free