重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

VBA実行後A1セルにカーソルを移動するため

Application.Goto Range("A1")
End Sub

という方法と

Application.Goto Reference:=Range("A1")
End Sub

という方法があると思うのですがどのような違いがあるのですか?
機能的には全く同じだと思うので処理的な違いですか?
またその他にも同様の動作をさせるコマンドはありますか?

よろしくお願いします。

A 回答 (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秒ほどの違いは、かなり大きい差だと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/25 09:31

 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などは、基本的なことのようですが、明確なエラーがないので、ここらの話は、若干、その説明に不安が残ります。
    • good
    • 0

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は指定したセルをアクティブセルにするというそれぞれの機能はちがいます。
    • good
    • 0

Goto メソッドはReferenceを省略してもかまわないようです


また開くときにA1に移動させるなら下記もありと思います
Private Sub Workbook_Activate()
Range("A1").Select
または
Range("A1").Activate
End Sub

この回答への補足

ありがとうございます。
ただの省略形なんですね。。。
では
Application.Goto Reference:=Range("A1")

Range("A1").Select

Range("A1").Activate

の3つにはどのような違いがあるのですか?

補足日時:2005/04/22 14:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!