[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『[ ]って何?』(stem)
でコタさんが回答されていました。 Range("A1").Value = [MIN(C4,C23)] & "日" この[]って何ですか???
試しに Range("A2").Value = [sum(d1:d2)] Range("A3").Value = [vlookup(b1,c1:d2,2,0)] と、やってみたらうまくいきました。 もしかして WorksheetFunctionの代わり??
こんにちは。
> この[]って何ですか??? Evaluate メソッドの代わりなのです。
以下手抜きして、Excel(2003)ヘルプの抜粋を。
Evaluate メソッド
使用する名前を、オブジェクトまたは値に変換します。
expression.Evaluate(Name) expression Application オブジェクトでは省略可能です。Chart オブジェクト、および Worksheet オブジェクトでは必ず指定します。 対象となる Application、Chart、Worksheet オブジェクトへのいずれかを返すオブジェクト式を指定します。
Name 必ず指定します。文字列型 (String) の値を使用します。Excel の名前付け規則に従って、対象オブジェクトの名前を指定します。
解説 このメソッドでは、次のような種類の名前を使用できます。
A1 形式の参照。単一セルに対する A1 形式の参照であれば、特に制限はありません。ただし、このメソッドでは、参照は常に絶対参照として扱われます。 範囲。参照とともに使うことのできる演算子には、セル範囲を表す参照演算子 (:)、セル参照の共通部分を表す参照演算子 (スペース)、および、 セル参照の複数選択を表す参照演算子 (,) があります。 定義された名前。コード記述時の言語で、定義された名前を指定します。 外部参照。外部参照には、感嘆符 (!) を使います。外部参照は、単一のセルに対する参照でも、他のブックで定義された名前でもかまいません。 たとえば、Evaluate("[BOOK1.XLS]Sheet1!A1") のように指定します。 メモ Evaluate メソッドの代わりに角かっこを使っても、同じ結果が得られます ([A1:C5] など)。たとえば、次の 3 組のコードでは、 組ごとにそれぞれ同じ動作を表します。
[a1].Value = 25 Evaluate("A1").Value = 25
trigVariable = [SIN(45)] trigVariable = Evaluate("SIN(45)")
Set firstCellInSheet = Workbooks("BOOK1.XLS").Sheets(4).[A1] Set firstCellInSheet = _ Workbooks("BOOK1.XLS").Sheets(4).Evaluate("A1")
角かっこを使用すると、コードの記述を簡単にすることができます。Evaluate メソッドでの利点は、引数が文字列であることです。つまり、 引数として指定する文字列をコード内で生成したり、あるいは、Visual Basic の変数を使うことができます。
使用例 次の使用例は、シート 1 のセル A1 のフォントに、太字を設定します。
Worksheets("Sheet1").Activate boldCell = "A1" Application.Evaluate(boldCell).Font.Bold = True
(コタ)
むむ!むずかしい! ですがEvaluateを調べればいいことがわかりました。 本日の課題はこれ! にします。 有難うございました。 (stem)
Range("A1").Value = [Row()] 上記はあまり意味のないことですが、WorksheetFunctionでもできなかった関数が動きます。。 コードが短くできることよりも、驚きです。。 もっともっと、ツールを知らねば・・・少し眠い。。 (kei)
こんなページがありました。ご参考まで。
Evaluateメソッド活用術 http://www.clayhouse.jp/vba/vba01.htm
(コタ)
こんな過去ログも。 [[20070212134849]]『Evaluate Method の研究』(seiya) (純丸)(o^-')b
変数は、使えないのと書いて有りましたが、使えないのでしょか?(ゆめ)
[]ですとすでに内部が文字列として認識なので使えませんが 省略せずにApplication.Evaluate("式" & 変数 & "式")のようにすれば使えます。 (momo)
>変数は、使えないのと書いて有りましたが、使えないのでしょか? VBAコード内で定義した変数は、[ ]の中では使えませんね。 ただ、ちょっと毛色が違うかもしれませんが、名前として定義した「変数」は使えます。
↓使うメリットがあるのか分かりませんが、こんな感じです。 Sub test1() Dim v Names.Add Name:="Cmax", _ RefersTo:="=C" & [C65536].End(xlUp).Row v = [A1:Cmax].Value MsgBox UBound(v, 1) MsgBox [SUM(C1:Cmax)] End Sub
(コタ)
何故?と思いましたが、理由がわかりました。
Application.Evaluate("式" & 変数 & "式")で、やってみます。
momoさん 有り難うございました。(ゆめ)
>名前として定義した「変数」は使えます。
すごいな!
例題をじっくり解読して、自分のものにします。
有り難うございました。(ゆめ)
[C65536]のようなセル参照、定義された名前への参照は ショートカットによる記述である、とExcel2003のヘルプで解説されています。 VBAヘルプで「ショートカットを使ってセルを参照する」に記述があります。 Evaluateメソッドとの関連は考えたことありませんが、セル参照式を Evaluateメソッドの機能で実行していると考えれば納得が出来ます。 (みやほりん)(-_∂)b
Evaluateに夢中のstem です 習得には未だ、程遠いです。 世界が一個開けそうな、開けなさそうな(能力的に) 現況報告でした。 (stem)
一応、補足的に 決してEvaluateを否定はしませんし、とても便利に使う場面もあります。 ですが、一概に有利とは言えないと思っています。
リンク先にもありましたが配列のループ処理が必要ない。という事ですが ループしない事がそのまま高速かというとそうではないです。
たとえば、単純にA1:A30000の文字とB1:B30000の文字を連結してC1:C30000に返すだけのコードで
Sub test1() With Range("C1:C30000") .ClearContents .Value = [A1:A30000&B1:B30000] End With End Sub
とするよりも
Sub test2() Dim tbl As Variant, buf(1 To 30000, 1 To 1) As String, i As Long tbl = Range("A1:B30000").Value For i = 1 To UBound(tbl) buf(i, 1) = tbl(i, 1) & tbl(i, 2) Next i With Range("C1:C30000") .ClearContents .Value = buf End With End Sub
のように、普通に配列をループで回す方がより処理は高速です。
ちなみに
Sub test3() With Range("C1:C30000") .ClearContents .Formula = "=A1&B1" .Value = .Value End With End Sub
これよりも、配列ループの方が早い結果でした。 でも、面白い事に.Value = .Valueの前にClearContentsすると どのコードよりも早い結果でした。
Sub test4() With Range("C1:C30000") .ClearContents .Formula = "=A1&B1" .ClearContents .Value = .Value End With End Sub
私の環境では test1 : 1.13秒 test2 : 0.58秒 test3 : 0.74秒 test4 : 0.14秒
この結果の方が興味深いような気もします。
要するに使いどころを見極めるのが良いのではないでしょうか? という印象でした。
(momo)
momoさん、test4はクリアされたままだから? 速いのでは?? (kei)
あ・・・おバカですね^^; test4は、ミスです。失礼しました。 (脳みそが夏バテですかね)
ただ、いずれにしても配列のループは意外と速い。 という事は覚えておくと良いかも?です。
(momo)
Sub test1() With Range("C1:C30000") .ClearContents .Value = [A1:A30000&B1:B30000] End With End Sub
これ、[A1:A30000*B1:B30000] 算術演算だとそんなに変わらないですね 私の環境だと若干でしたが、test1が速かったかなあ・・・。
私もだいぶ前に検索でいくつかの比較をしたことがありました。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=16648;id=excel
この時は、一番ではないけれど、Evaluateもよく健闘しているなあ という印象でしたが・・・。
Evaluateに関しては・・・・、 私も一時期今のstemさんのように夢中になっていたことがありました。
Evaluateを使ってループしないでコード作ろうなんてね!!
でも、中の数式がこんなに複雑になるんじゃあ、メンテが大変だと思い直し、 仕事でほどほどにしています。 でも、役には立ちますね!!
以前にも記述しましたが、
実務では、[]は、使う箇所が限定されると思いますよ!! (こういうサイトの簡単な例題コード掲載時には使っていますが)。
これは、[]を使ってしまうと[]の中身を文字列のように & を使って編集できないからです。
固定で決まっている セル(A1)ならば、Range("A1") より、[A1]のほうが楽なのですが、 Excel/VBA内でRange("・・・")という表記をしなくても済むことは殆どありませんから、 同じ種類のオブジェクトを違う表記で扱うことを防ぐために[A1]という表記を私はしていません。
使う場合は、私の場合は、現在時刻を取得する場合ぐらいです。
vbaにも、Now()関数がありますが、すこしでも詳細に時刻を取得したい時に ワークシート関数のNow()をVBAコード内で表記する時に [now()] という表記を使います。
EValuateのセル専用版がRangeですね
Sub test() Range("offset(a1,0,0,10,1)").Select End Sub
ichinose
ちょっと気になったので、test1とtest2の中間のコードで試してみました。
'test1.5 Sub test1o5() Dim tbl As Variant, buf(1 To 30000, 1 To 1) As String, i As Long With Range("C1:C30000") .ClearContents tbl = [A1:A30000&B1:B30000] For i = 1 To UBound(tbl) buf(i, 1) = tbl(i, 1) Next i .Value = buf End With End Sub
配列の中で結合する(test2)のと、結合したものを配列に書き出す(test1.5)のでは、 どれぐらい変わるのか、という実験です。 (ちなみに、A列は"あいうえお"、B列は"かきくけこ"にしました)
結果は私の環境(XP,2003)ですと、↓のようになりました(単位はミリ秒)。 [A1:A30000&B1:B30000]というのは、どういう状態になってるんでしょうかね。
[1] 回目 test1 test1.5 test2 [2] 1 281 109 125 [3] 2 282 109 125 [4] 3 265 110 125 [5] 4 281 109 125 [6] 5 281 110 125 [7] Av 278 109.4 125
でも、みなさん書かれているように、実戦でそれほど使うものでもないでしょうから あまり気にしませんが。あくまで実験です。^^
(コタ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.