• ベストアンサー

VBAのGotoについて

VBA実行後A1セルにカーソルを移動するため Application.Goto Range("A1") End Sub という方法と Application.Goto Reference:=Range("A1") End Sub という方法があると思うのですがどのような違いがあるのですか? 機能的には全く同じだと思うので処理的な違いですか? またその他にも同様の動作をさせるコマンドはありますか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

補足: たぶん、VBAプログラミングする人は、感覚的に、Select と Activateを分けてつかっていらっしゃると思いますが、今回、その感覚的な部分を計数化してみました。 '<標準モジュール> Private Declare Function timeGetTime Lib "winmm.dll" () As Long Sub Select_or_Activate1()  Dim myTime As Long  Dim LapTime As Double  myTime = timeGetTime  For i = 1 To 30000   Cells(i, 1).Activate 'Selectと使い分け  Next i  LapTime = (timeGetTime - myTime) / 1000  MsgBox LapTime End Sub 時間を測るためですから、使用する際には、コメントは削除します。 セルは、A1:A30000の全セルに「a」を一字ずつ入れました。 実行時は、画面は、ワークシートを出したままにします。 結果は、古いPC ですが、 (秒) Activate :97.465, 97.287  Select : 95.818, 96.18 と、思ったとおりSelectが、速いことが分かりました。これは、Rangeオブジェクトに対するものですが、約1秒ほどの違いは、かなり大きい差だと思います。

nanasupra
質問者

お礼

ありがとうございます。 皆様の説明でかなり理解できました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

 Application.Goto Range("A1")  Application.Goto Reference:=Range("A1") の違い。 基本的なことなのですが、Reference:=~ というのは、名前付き引数と言います。 expression.Goto(Reference, Scroll) とあるように、名前付き引数は、その順番を換えることが可能になります。 例:  Application.Goto Scroll:=True, Reference:=Range("A1") 名前付き引数がなければ、  Application.Goto Range("A1"), True と、引数の順番を換えることが出来ません。 それで、Goto というのは、ワークシートの左上のネームボックスに対する動作で、Applicationクラスに属しているから、Rangeオブジェクトのように、アクティブシートに従う必要がありません。つまり、直接、Worksheets(3).Select なしに、シートを越えて、移動することが可能になります。しかし、Bookまでは、またぐことが出来ないようですね。 例: Sub Goto_test()  Worksheets(1).Activate  Application.Goto Range("C1")  MsgBox ActiveSheet.Name & "!" & ActiveCell.Address  Application.Goto Worksheets(3).Range("C1")  MsgBox ActiveSheet.Name & "!" & ActiveCell.Address End Sub Selectメソッド とActivate メソッドの違いというのは、 ヘルプの Activate: Range の説明に、  1 つのセルをアクティブにします。選択範囲の中の単一セルをアクティブに  するときに使います。セル範囲を選択するときは、Select メソッドを使い  ます。 とありますが、私のExcelでは、以下のようなコードでもエラーは起きません。 例: Sub Activate_Test()  Range("A1,A10").Activate  Range("A10:A12").Activate End Sub Activate を用いると、次のA10:A12で、Activate が、その選択した範囲内に掛かっていると、A10:A12 が選択されなくなってしまう、という誤動作がありますね。 やはり、Activate は、ヘルプに従って、1つのセルを選択しアクティブにする時で、Select は、範囲を選択するときに用いるというように考えたほうが無難なようです。 以上が、私の調べた解釈です。Select Activateなどは、基本的なことのようですが、明確なエラーがないので、ここらの話は、若干、その説明に不安が残ります。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

Application.Gotoは、 Application.Goto(reference,scroll) のような引数で指定します。 referrenceもscrollも省略可能ですので Application.Goto Range("A1") は、referenceにRange("A1")を指定したことになります。 また、Reference:=Range("A1") の形式は、名前を指定して引数を渡す方法で、 この場合も、referenceにRange("A1")を指定したことになります。 なので、記法が違うだけで全く同じです。 Application.Goto Reference:=Range("A1") Range("A1").Select Range("A1").Activate の3つは、ほとんど同じというか結果として同じだと思います。 ただ、gotoは、スクロールして位置を変える selectは範囲を選択状態にする(この場合、1つなので、Activateと変わらない) Activateは指定したセルをアクティブセルにするというそれぞれの機能はちがいます。

  • big_fool
  • ベストアンサー率22% (43/193)
回答No.1

Goto メソッドはReferenceを省略してもかまわないようです また開くときにA1に移動させるなら下記もありと思います Private Sub Workbook_Activate() Range("A1").Select または Range("A1").Activate End Sub

nanasupra
質問者

補足

ありがとうございます。 ただの省略形なんですね。。。 では Application.Goto Reference:=Range("A1") Range("A1").Select Range("A1").Activate の3つにはどのような違いがあるのですか?

関連するQ&A