Excel VBA質問箱 IV

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

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


12892 / 13646 ツリー ←次へ | 前へ→

【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 お礼

【8117】Evaluateとは???
質問  kawata  - 03/10/1(水) 9:05 -

引用なし
パスワード
   kawataです、よろしくお願いします。
(Windows2000/Excel2000)

【8037】Arrayへのデータ追加について 
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=8037;id=excel

で質問させていただきました件で、
(ichinoseさん、bykinさん、ありがとうございました)

ichinoseさんの回答で、

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

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

ぜひ、この部分の意味を教えてください、よろしくお願いします。
とりあえず、Evaluate、とSumProductのHelpはチェック済みです。

ここんとこ、せんでもいいものを無理やり配列使って、かえって
コードが増長になっている感じもありますが、理解がすすむ度に
・・・・・なかなかいいものです(^^;。

【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

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

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

【8121】Re:Evaluateとは???
お礼  kawata  - 03/10/1(水) 13:49 -

引用なし
パスワード
   kawataです、よろしくお願いします。

ichinoseさん、何度もすいません、ありがとうございます。

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

はい、了解です、With 〜 End Withをコメントアウトしての
動作確認はしましたです。

>EvaluateのHelpをみると、
>「使用する名前を、オブジェクトまたは値に変換します。」とありますが、
>私は、「指定された文字列式を評価した結果を返します」という風に理解しています。

教えていただいても、あっ、なるほど!・・・・とこない(−_−メ。
とんでもなく、そういう風に理解するには(私の限界かな(^^;)。

>そして、この文字列式内でワークシート関数も有効なため
>
>cnt = Application.Evaluate( _
>      "=SumProduct((a1:a10 >= 5) * (a1:a10 <= 7))")

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

という疑問もありました。

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

はい、true * true が成立した3つの和(^^;。
これを理解するのにも時間かかりましたです。しかし、配列を使っていくうえで
避けては通れないような、もうひとつ頑張って確実にものにします。

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

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

ありがとうございます。Helpを書き換えたい気持ちです。
これから、再度提示いただいたコードを解析していきます。
まだまだ、私の中では、ボンヤリだったのが、少し晴れてきたかな
・・・ぐらいですが(^^;。

ありがとうございました!!、またよろしくお願いします。

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