[[20100824121410]] 『[ ]って何?』(stem) ページの最後に飛ぶ

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

 

『[ ]って何?』(stem)
[[20100824104201]]
 でコタさんが回答されていました。
  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

こんにちは 過去ログの『Evaluate Method の研究』を拝見しました。

変数は、使えないのと書いて有りましたが、使えないのでしょか?(ゆめ)


 []ですとすでに内部が文字列として認識なので使えませんが
 省略せずに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.