• ベストアンサー

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

  • 複数のコマンドボタン(VBAで)を一つにまとめたい。

    複数のコマンドボタン(VBAで)を一つにまとめたい。 Private Sub CommandButton1_Click() Application.Goto Reference:=Range("A7"), Scroll:=True End Sub Private Sub CommandButton2_Click() Application.Goto Reference:=Range("A29"), Scroll:=True End Sub Private Sub CommandButton3_Click() Application.Goto Reference:=Range("A51"), Scroll:=True End Sub Private Sub CommandButton4_Click() Application.Goto Reference:=Range("A73"), Scroll:=True End Sub Private Sub CommandButton5_Click() Application.Goto Reference:=Range("A95"), Scroll:=True End Sub Private Sub CommandButton6_Click() Application.Goto Reference:=Range("A117"), Scroll:=True End Sub Private Sub CommandButton7_Click() Application.Goto Reference:=Range("A139"), Scroll:=True End Sub Private Sub CommandButton8_Click() Application.Goto Reference:=Range("A161"), Scroll:=True End Sub Private Sub CommandButton9_Click() Application.Goto Reference:=Range("A183"), Scroll:=True End Sub Private Sub CommandButton10_Click() Application.Goto Reference:=Range("A205"), Scroll:=True End Sub Private Sub CommandButton11_Click() Application.Goto Reference:=Range("A227"), Scroll:=True End Sub 上記のように複数のコマンドボタンを関数化して一つにすることは出来るでしょうか?

  • エクセルのVBAで

    日付を入力したシートでシートを開くと今日の日付のセルがあった場合左上に表示させるモジュールで、 Sub test() Dim R As Range Set R = Range("A:A").Find(Date) If Not R Is Nothing Then Application.Goto reference:=R, scroll:=True End If End Sub のように作成したのですが、うまく働きません。 原因は、日付を表示したセルが、A1に2006/4/1を入力してA2以降のセルはA1+1、A2+1・・・で対応しています。 よって、アクションが働かないのではと推測しているのですが、このことを改善するにはどのようにしたらいいでしょうか? 日付をダイレクトに入力しないのは、2007年にも先頭セルのみの書き換えで対応しようとしたためです。

  • Excel VBA セル範囲に名前をつける

    Excel VBA独学中の初心者です。 セル範囲に名前をつける方法で以下の2つの方法があるようです。 (1) 同じように動作しますが違いは有るのでしょう。 (2) 本質的に考え方または内部動作は違うのでしょうか。 お分かりの方教えていただけますと助かります。 --------------- '方法1 Sub 名前の定義1() Range("sheet1!A2:B3").Name = "名前1" End Sub '方法2 Sub 名前の定義2() Range("A1").Select ActiveWorkbook.Names.Add Name:="名前2", _ RefersTo:="=sheet1!A2:B3" End Sub

  • Gotoを使わずに済みますか?

    VBA超初心者です。ヘルプだけで学習していますが、よくわかりません。印刷する時に、GT4かGU4の値が0の場合はエラーメッセージが出て終了し、いずれも0以外ならばその数値を印刷の開始と終了ページとして取得するプログラムを作ってみましたが、何度やってもうまくいかず、やむなく昔ベーシックで習ったGotoを使ってみました。 しかし、過去ログを見ると、Gotoは使わないほうが良いとの事。 この文でGotoをなくす方法をご教授下さい。お願いします。 Sub 印刷() 開始ページ = Range("GT4").Value 終了ページ = Range("GU4").Value If Range("GT4") = 0 Then GoTo 10 If Range("GU4") = 0 Then GoTo 20 入力結果 = MsgBox((開始ページ) & "ページから" & (終了ページ) & "ページを印刷しますか?", vbYesNo) If 入力結果 = vbYes Then ActiveWindow.SelectedSheets.PrintOut From:=開始ページ, To:=終了ページ, Copies:=1, Collate _ :=True GoTo 30 10: MsgBox ("未入力の項目があ~る!") GoTo 30 20: MsgBox ("入力ミスがあります!") 30: End If End Sub

  • VBA コピーモード中の左上隅セルを、画面の左上の位置にスクロールした

    VBA コピーモード中の左上隅セルを、画面の左上の位置にスクロールしたい! Windows XP Home Edition SP3 Office XP Personal 2002 Excel 2002 「 現在、コピーモード中になってる左上隅セル ( A20 ) 」 の 「 3つ上のセル ( A17 ) 」を Window画面の左上の位置に、スクロールしたいのですが、どおすればよろしいでしょうか? 何卒、ご教示のほどをお願い致します。 Sub スクロール()  Range(A20:B30).Copy  Application.Goto reference:=ActiveWindow.Range(VisibleRange.Item(1).Address), Scroll:=True End Sub

  • 〖緊急〗エクセルのVBAについて質問です。

    エクセルのVBAを使用して、下記の動作を実行したいのですがうまくいきません。 おしえてください。 sheet1に移動したいシート名の一覧を作成し、一覧を参照してシートを移動したいです。 RangeにカーソルをあてるとA1に入力したシート名前が反映しているようなのですが・・・。 sheet1のセルA1に移動させたいシート名を入力しています。 Sub Worksheet() Worksheets(Range("A1")).Activate End Sub ※❝インデックスが有効範囲にありません❞とエラーがでます。 ※同一のBOOK内での作業です。 よろしくおねがいします。

  • EXCELVBAについて質問です。

    VBAにて、全てのシートを選択しA1セルをアクティブにするコードを作りたいのですが、計算後、表示位置がばらばらになってしまいます。 Sub シートをすべて選択後A1セルへ移動() Worksheets.Select Application.Goto reference:=Range("a1"), scroll:=True Sheets(1).Select Sheets(1).Range("A1").Activate End Sub 上記のコードなのですが、非アクティブシートは移動せず、セルA1へ移動するのはアクティブシートのSheets(1)のみとなります。 ファイルにあるシート全てをA1に移動後ウィンドウもA1に移動するような命令文はあるのでしょうか?

  • Excelでマクロを使いセルの内容をコピー貼り付け

    A1セルに111と入力してあるとします。 この時B1にaaa111aaaと入力するマクロを作りたいです。 A1に222があるとB1はaaa222aaaと入力したいです。 これをマクロで作ったのですが、次のようになり、A1の内容にかかわらず常にaaa111aaaとなってしまいます。 Sub Macro1() Range("A1").Select ActiveCell.FormulaR1C1 = "111" Range("B1").Select ActiveCell.FormulaR1C1 = "aaa111aaa" Range("B2").Select Application.Goto Reference:="Macro2" End Sub これのいらない行を削除し、コピーはA1の内容となるように修正して次のようにしました。 Sub Macro1() ActiveCell.FormulaR1C1 = Range("A1") Range("B1").Select ActiveCell.FormulaR1C1 = "aaa111aaa" Application.Goto Reference:="Macro2" End Sub まだペーストするときにA1の内容とならず直接入力となっています。 これをどう変更すればいいでしょうか?

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • エクセルVBAのテキスト保存の仕方

    次のようなマクロがあり、最後の行でできあがった表をクリップしています。 現在そのクリップボードの表をテキストに手動で貼り付けてその都度保存しているのですが これを自動的にテキスト保存できればと思っています。 更にファイル名は左上1セルめ(この場合多分A1000のセル)にある文字列の最初から10文字をファイル名にしたいです。 マクロはよく知らないので記述の仕方を教えてください。 ※このマクロはマクロの記録により自動作成したものです。 よろしくお願いします。 (office2013/Windows7) Sub rep1000行削除集約() Dim i As Long Range("AC1.AI650").Copy Range("A1000").PasteSpecial Paste:=xlPasteValues Range("A1000:A2000").Value = Range("A1000:A2000").Value Range("A1000:A2000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete Application.Goto Reference:="R1000C1" Range("A1000:G1000").Select Range(Selection, Selection.End(xlDown)).Select Application.CutCopyMode = False Selection.Copy End Sub

このQ&Aのポイント
  • 同棲中の年下彼氏が携帯を開いたまま寝ちゃっていたところ、彼が女性とのやり取りをしていることを発見しました。
  • そのやり取りの内容から、彼がその女性に興味を持っている可能性が高いです。
  • 最近の喧嘩や落ち込むことが多かったため、浮気の可能性が心配です。大切にされていないと感じています。相談者は周囲に相談しようか迷っています。
回答を見る

専門家に質問してみよう