[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.