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