[[20070212134849]] 『Evaluate Method の研究』(seiya) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Evaluate Method の研究』(seiya)

 いつもお世話になってます。

 そのお礼になればと「配列数式」のVBAでの活用拡大の意味をこめて一席...

 [A1] = [B1] などという記述をたまに目にしますが、意味わかりますか?

 Range("a1") = Evaluate("b1") なのです。

 このスレッドは Evaluate Method の研究をしましょう。

 そもそも、Evaluate といえば、シートに入力する数式をそのままの形で
 計算してくれることで知られていると思います。

 これには隠れた性質があり、2次元配列を受けて計算できるのです。(ここがポイント)

 たとえば、ある範囲に正の数値が入力されていて、それらを負に変化することも
 ループしないで可能になるのです。

 Sub Example1()
 Range("a1:b5").Value = [{1,2;3,4;5,6;7,8;9,10}] 'Evaluate("{1,2;3,4;5,6;7,8;9,10}")
 MsgBox "A1:B5 にデータを生成"
 Range("a1:a5").Value = [a1:a5*-1] 'Evaluate("a1:a5*-1")
 End Sub

 配列数式であれば、ループしないで、しかもシート上で計算しなくてもよい。
 ということになります。

 配列関数以外を一緒に使用すると、例えば、
 Sub Example2()
 Range("a1:a5").Value = [{"ab";"cd";"ef";"gh";"ij"}]
 MsgBox "大文字にしたい"
 Range("a1:a5").Value = Evaluate("Upper(a1:a5)")
 End Sub

 ではだめなのです。なぜ?....配列数式にする必要があります。

 Range("a1:a5").Value = Evaluate("if(row(1:5),upper(a1:a5))")
 に変更すると、ほら....row(1:5)でダミー配列を作成してやれば...

 お分かりいただけますか?
 配列数式が得意の人は挑戦してみてください。

 なんだか凄いスレッドを発見b
 いやいや、これは本当にためになりますね〜
 
 まずは、、、
 >そもそも、Evaluate といえば、シートに入力する数式をそのままの形で
 >計算してくれることで知られていると思います。
 ココから知らなかったwww
 
 >配列数式であれば、ループしないで、しかもシート上で計算しなくてもよい。
 >ということになります。
 ここが凄いですね〜
 
 ちょっと弄ってみました^^
 
Sub Example3()
Range("A1:A100").Formula = "=Int(Rand() * 5) + 1"
Range("A1:A100").Value = Range("A1:A100").Value
Range("B1").FormulaArray = "=SUM(IF(A1:A100=1,A1:A100,""""))"
Range("C1") = [SUM(IF(A1:A100=1,A1:A100,""))]
End Sub
 
 こんなイメージでいいのかな???
 
 もう少し弄ってみよう〜♪
 (キリキ)(〃⌒o⌒)b お昼食べてきま〜すw

 う〜〜ん...
 Sub Example4()
      Range("a1:a5").Value = [{"a";"b";"c";"d";"e"}]
      Range("b1").Value = Join([transpose(a1:a5)]," ")
 End Sub

 なぜ? この場合はTranspose関数自体が配列関数だから...

 然しながら、あらかじめ申し上げておきますが、あまり複雑な数式を
 書くことは、現実的とは言えず、ましてや私なんぞには意味がわから
 なくなってしまいます。

 1) 可読性が悪い
 2) 複雑な条件化では対応させるのが難しい

 などの観点から、複雑なものは研究するだけにしましょう。
 勿論、簡単なものはどんどん利用するべきだと思います。
 (seiya)

 上記は、こう言うことでしょうか?
 
Sub Example5()
     Range("a1:e5").Value = [{"a",1,2,3,4;"b",11,12,13,14;"c",21,22,23,24;"d",31,32,33,34;"e",41,42,43,44}]
     Range("a6").Resize(5, 5).Value = [transpose(a1:e5)]
End Sub
 
 (キリキ)(〃⌒o⌒)b

 seiyaさんへ。せっかくすばらしいスレをたてていただくのですから、
 マクロ初級者の人に、もう少し配慮をお願いします。

 最初のところで、
 (1) Sub Example1()で、MsgBox "A1:B5 にデータを生成" となっていながら、
     実際にマクロを走らせると、a1:a5 のデータしか変化しない。
     Range("a1:a5").Value = [a1:a5*-1] 'Evaluate("a1:a5*-1") ←a1:a5 が
     A1:B5の記述違いと思いますが、悩む人がいるかもしれない。

 (2) Sub Example2()  は、A1:A5 が #VALUE! となってしまう。多分、
     Range("a1:a5").Value = ["ab";"cd";"ef";"gh";"ij"}] この構文の
     Range("a1:a5").Value = [{"ab";"cd";"ef";"gh";"ij"}]
                             ^^ { が抜けているせい。
     しかし、その下の文章で「ではだめなのです」と書いてあるので、
     意図的に #VALUE! を出しているのかと思ってしまう。本当のダメ出しは、
     下の構文についてのはず。

 (3) さらに、正しくするはずの下も、構文エラーになる。
     Range("a1:a5").Value = Evaluate("if(row(1:5),upper(a1:a5))"")
     最後の " がひとつ多いせいのようです。

 以上、これを見る人が無駄に悩まないよう、私の気づいた点(悩んだ点でもある)を上げました。
 seiyaさんには失礼をご容赦下さい。これからもご指導、よろしくお願いします。
(純丸)(o^-')b

 純丸さん、

 (1) の件は、A1:B5 にデータを生成して、A1:A5 のみ変換してみただけで、違いがわかればと思って...
 (2)(3) の件はその通りで、修正しました。

 それとこの件は残念ながら初心者には無理かと...
 (seiya)

 


 キリキさん、

 私がここで表現したいのは、

 [ループをしない、しかもシート上で計算をしない]

 なのです。
 つまり、対象はシート上の配列で通常ループを必要とする処理を対象とします。

 キリキさんの処理は
 Range("a6").Resize(5,5).Value = Application.Transpose(Range("a1:e5").Value)
 でもできませんか?

 Example1では通常
 For Each r In Range("a1:a5")
      r.Value = r.Value * -1
 Next
 あるいは、あるセルに-1と入力し、A1:A5に形式を選択して貼り付け
 または、列を挿入して、=A1*-1, フィルダウン 等でしょう?

 Evaluateを使用すると、
 Range("a1:a5").Value = [a1:a5*-1]
 で出来ることを表現したかったのです。

 (seiya)

 難しいですね〜
 でも、何となく面白そうだってことはわかりました^^
 
 Evaluate の [] の中には、変数は使用できないんですよね?
 使い方があるのかな???
 
 (キリキ)(〃⌒o⌒)b

 そうですね、[]を使用すると変数は使用できません。

 これで、このスレを閉じようと思います。
 もともと、このスレは2/12にキリキさんの他のスレへの投稿を発見し
 その前日(2/11)に大変お世話になったことのお礼の意味で立てました。
 (当初の表題は「キリキさん見つけた」でした)

 個人宛のメッセージはよろしくないと思い今の表題に変更しましたが...

 混乱を避けるためにも、今後このようなスレは立てないようにします。
 (seiya)

 はい、わかりました。
 お気を使っていただいて、有り難うございます^^
 
 (キリキ)(〃⌒o⌒)b

 特定の人を意識したスレはまずいでしょうが、ここは「エクセルの学校」です。
 「何々の研究」というスレは、大いに歓迎したいと思いますが、いかがでしょう?
 それが、初級者向けか上級者向けかはあるでしょうが、学ぶ側で選択すれば
 すむことです。「今後このようなスレは立てない」なんておっしゃらず、
 いろいろ教えていただければと思うのですが、、。
(純丸)(o^-')b

 純丸さんへ一票!
 
 (キリキ)(〃⌒o⌒)b

 突然ですが 私も一俵。
(みやほりん)(-_∂)b

 全く門外漢ですが、私も是非。
  ※
 ※※

 (HANA)b

 このスレに投稿された方々へ、

 このスレッドを続行されるのであれば、そうしてください。
 しかし、私は配列数式(数式全般)は得意ではありませんし
 エクセルを使用して動作確認をする環境にありませんので、
 このスレッドをリードすることはできません。

 このメソッドは面白いと思いますし、発展させればそれなりに
 有効利用は可能だと思います。

 HANAさん、「門外漢」ではありませんよ。
 配列数式が内部でどのような計算をしているかを理解していて、
 VBAの2次元配列を理解できれば、VBAの知識がそれほどなくても
 参加は可能です。
 (数式は得意だけどVBAはちょっと、と考えている方々の腕の見せ所でもあります)
 メモリ上にシート(2次元配列)を想定して、そこで計算させる
 ようなイメージでよいと思うのですが...
 Sumproduct等でかなり高度なことができそうな気がします。

 (seiya)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.