ActiveX コントロールでのセル選択

このQ&Aのポイント
  • Excel VBA独学中の初心者です。ActiveX コマンドボタンをクリックして他のSheetのセルを選択する方法について教えてください。
  • プログラム1ではエラーが出てしまいましたが、プログラム2では正常に動作しました。なぜこのような違いがあるのか教えてください。
  • ActiveX コントロールを置いているSheetと別のSheetのセルを選択する場合、選択しようとするセルの「Sheet名」を記述する必要があるのか教えてください。
回答を見る
  • ベストアンサー

ActiveX コントロールでのセル選択

Excel VBA独学中の初心者です。 目的:ActiveX コマンドボタンをクリックして他のSheetのセルを選択する 環境例:シートが2個(Sheet1、Sheet2) Sheet2にActiveXコントロールのコマンドボタンを置く 【プログラム1】:コマンドボタンには次のようなVBAコードを記述 ---------------- Private Sub 別シートセル選択_Click() Worksheets(1).Activate Range("A5").Select End Sub ---------------- 結果:この時次のようなエラーが出ました。 '実行時エラー'1004 'アプリケーション定義またはオブジェクト定義のエラーです。 -------------------------------- -------------------------------- 【プログラム2】:コマンドボタンには次のようなVBAコードを記述 ---------------- Private Sub 別シートセル選択_Click() Worksheets(1).Activate Worksheets(1).Range("A5").Select End Sub ---------------- 結果:OK ---------------- ---------------- ところが次の【比較1】【比較2】の場合、「Range("A5").Select」だけでOKでした。 ---------------- 【比較1】 コントロールの存在するSheetのセルを選択する場合は「Range("A5").Select」だけでOKでした。 ---------------- 【比較2】 Subマクロで記述する場合も「Range("A5").Select」だけでOKでした。 プログラムは以下 -------- Sub セル選択() Worksheets(1).Activate Range("A5").Select End Sub ---------------- 【質問】 ActiveX コントロールを置いているSheetとは別のSheetのセルを選択する時は、選択しようとするセルの「Sheet名」から記述しなければならないのでしょうか。 「Range("A5").Select」だけでOKだった【比較1】【比較2】との違いを教えていただきたくお分かりの方宜しくお願いします。 (用語の使い方に誤りがありましたらすみません。)

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#2です。 本件は実行時にエラー指摘が出るから、まだましではないですが。 エラー指摘が出たり、結果が思わしくない時、原因などを勉強すればよいから。 ソフト作成では、エラー指摘がでず、結果が思い通りでないタイプの不都合もあり、こちらは大変です。経験では、1週間ぐらい考え続けている場合もあった。 ソフト絡みの独学は大変だと思います。私も、つくずくそう思います。本当は 仕事で、VBAを使い、逃げられず、課題を解決していってこそ、本物の力が付くのだと思いますが、時間はかかりますし、教師役も側にいてもらうのが、必須だと思います。 でも本件のようなのは、特別な場合で、この質問点があいまいでも、スモールなシステムを作るのは、これでつまずいたから、できないというものでもないと思う。  それよりも、データベース的な考えや、処理ロジックやアルゴリズムの勉強が 最後には効いて来るものと思います。こちらは際限がない。処理言語を離れた ものです。 ーー VBAの解説本(質問関連の記述がない・・)云々の件ですが、VBAの本も市販されているのは、初心者向けが多く、3000円以上の、定評のあるVBAの本を探して読むしかないでしょう。 でも、今ではWEB照会で出る記事に負けると思う。  しかし例え詳しく書いてあっても、それの良さを実感できるのは、学が進んでからであると思います。だから詳しいVBAの本を、記述を漏らさず精読するべきといっても、現実的でない。個別の問題にぶつかって、調べて、納得して、そして忘れて、身に付くもののような気がする。 == 本質問もSheet2に(ワークシートに)コマンドボタンを張り付けているが、普通はこういうコントロール類はフォームに張り付けて使うのが、前提のように(私的に)感じる。 そして、その場合は、また違った(シートを特定した記述をしやすい、してしまう環境)ことになると思う。Range("A5").Selectなどとしないだろう。 ーー 他に、他シートのセル範囲をRange(Cells(..),Cells(..))で表現するとき、しつこいくらいシート限定を表現上に加えないと,エラー指摘が出る経験をする。 https://blog.goo.ne.jp/morning-milk-tea/e/da97137cf6416b066a97fc234972494b 質問と似てませんか?

helpokwave
質問者

お礼

大変ありごとうございました。 いろんなことを学ばせていただきました。 単にRange、Cellsと書いた時に、それがどのシートのセルを指しているのか注意が必要と分かりました。 また派生してVBAへの取り組み方も学ばせていただきました。 大変勉強になり、感謝申し上げます。

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.3

> 【1】自分なりに解釈すると以下です。 そのような解釈でいいと思います。 ただ、 > 1)対象とするシートをActivateし、 > (2)ActiveSheet.Range("A5")のようにActiveSeetと一体での記述が必要 Selectの場合はそうですね。セルへの代入だとActivateにしなくても Worksheets(1).Range("A5").Value = 1 だけで大丈夫です。 Active〇〇はシートやセルを直接指定できない場合やそうしないとエラーになる場合を除いて利用しない方がいいという気がします。Active〇〇にしていたためにその前に別の場所がアクティブになって違うところを参照等していたというのを見かけたことがあります。 > VBAの仕様書とか(有るのかどうかわかりませんが) この件が記載されているかどうかは分かりませんが Excel VBA リファレンス https://docs.microsoft.com/ja-jp/office/vba/api/overview/excel 私は検索でヒットしない限り読んだことはありません。 基本的にエラーメッセージや「VBA したいこと」で検索してのWeb先生と試行錯誤です。

helpokwave
質問者

お礼

大変ありごとうございました。 いろんなことを学ばせていただきました。 単にRange、Cellsと書いた時に、それがどのシートのセルを指しているのか注意が必要と分かりました。 また派生してVBAへの取り組み方も学ばせていただきました。 大変勉強になり、感謝申し上げます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

VBAで、うるさい箇所ですね。VBAのレジェンドの「大村あつし」さん、なんかも注意喚起していたような。 ーー 下記を1つずつやってみて、何かを掴んでください。 コメント化<ーー>非コメント化のツールバーの編集の機能を使って1単位ごと ('Sub-End Sub)を、正常化して実行して、みてください。 NOの分はエラーが出る、YESの分はOKになるはず。 何か得るものがあれば。 また 'http://korikorikorikori.blog.fc2.com/blog-entry-26.html などのGoogleで出る記事も参考にして。 「vba rangeクラスのselectメソッドが失敗しました」などで照会。 ーー 'Private Sub CommandButton1_Click() ''コマンドボタンをSheet2に張り付けたとき ''Sheet2を選択しているはず 'Range("B5").Select 'Sheet2のB5選択 'End Sub '--- 'Private Sub CommandButton1_Click() 'OK ''コマンドボタンをSheet2に張り付けたとき 'Worksheets("Sheet1").Activate 'ActiveSheet.Range("B7").Select 'Sheet1のB7選択 'End Sub '--- 'Private Sub CommandButton1_Click() 'NO ''コマンドボタンをSheet2に張り付けたとき 'Worksheets("Sheet1").Activate 'Range("B7").Select 'Sheet1のB7選択のつもり 'End Sub '--- 'Private Sub CommandButton1_Click() 'NO ''コマンドボタンをSheet2に張り付けたとき 'Worksheets("Sheet1").Activate 'ActiveSheet.Range("B7").Select 'Sheet1のB7選択のつもり 'End Sub '--- 'Private Sub CommandButton1_Click() 'NO ''コマンドボタンをSheet2に張り付けたとき ''Worksheets("Sheet1").Range("B7").Select 'Sheet1のB7選択のつもり,sheet2をSelect状態でボタンクリック 'Worksheets("Sheet1").Range("B7").Select 'RangeクラスのSelectメソッドが失敗しましたになる 'End Sub 'http://korikorikorikori.blog.fc2.com/blog-entry-26.html '--- 'Private Sub CommandButton1_Click() 'OK ''コマンドボタンをSheet2に張り付けたとき 'Worksheets("Sheet1").Activate 'Sheet1のB7選択のつもり,sheet2をSelect状態でボタンクリック 'Worksheets("Sheet1").Range("B7").Select 'RangeクラスのSelectメソッドが失敗しましたになる 'End Sub '--- 'Private Sub CommandButton1_Click() 'NO ''コマンドボタンをSheet2に張り付けたとき ''Worksheets("Sheet1").Range("B7").Select 'Sheet1のB7選択のつもり,sheet2をSelect状態でボタンクリック 'Worksheets("Sheet1").Activate 'Range("B7").Select 'RangeクラスのSelectメソッドが失敗しましたになる 'End Sub '--- 'Private Sub CommandButton1_Click() 'OK ''コマンドボタンをSheet2に張り付けたとき ''Worksheets("Sheet1").Range("B7").Select 'Sheet1のB7選択のつもり,sheet2をSelect状態でボタンクリック 'Worksheets("Sheet1").Activate 'ActiveSheet.Range("B7").Select 'End Sub

helpokwave
質問者

補足

早々のご回答、また多くの具体例をありがとうございました。 【1】自分なりに解釈すると以下です。 (1) シートモジュールに記載したコードは基本、そのシートが対象。 (2) 他のシートを対象としたい場合は (1)対象とするシートをActivateし、 (2)ActiveSheet.Range("A5")のようにActiveSeetと一体での記述が必要 暗中模索でエラーが出ないコードを試行錯誤しましたが、教えていただきだいぶ確信が持てるようになりました。 【2】しかし考えてみるとVBAの仕様書とか(有るのかどうかわかりませんが)、解説本にひとこと書いてあれば膨大な時間をかける必要はないのですが。 独学の初心者としてはこうやって、つまり、試行錯誤とWeb先生を頼って果たして実用レベルまでマスターできるのかと不安になります。 蛇足となりますが、もしアドバイスでも頂ければ。

  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.1

シートモジュールに記載された Range("A5").Select は アクティブシートとは関係なくコードのあるシートのRange("A5")が対象になります。非アクティブなシートやセルをSelectするとエラーになります。 標準モジュールに記載された Range("A5").Select は アクティブシートのRange("A5")が対象になります。

helpokwave
質問者

補足

早々のご回答ありがとうございました。 【1】自分なりに解釈すると以下です。 (1) シートモジュールに記載したコードは基本、そのシートが対象。 (2) 他のシートを対象としたい場合は (1)対象とするシートをActivateし、 (2)ActiveSheet.Range("A5")のようにActiveSeetと一体での記述が必要 暗中模索でエラーが出ないコードを試行錯誤しましたが、教えていただきだいぶ確信が持てるようになりました。 【2】しかし考えてみるとVBAの仕様書とか(有るのかどうかわかりませんが)、解説本にひとこと書いてあれば膨大な時間をかける必要はないのですが。 独学の初心者としてはこうやって、つまり、試行錯誤とWeb先生を頼って果たして実用レベルまでマスターできるのかと不安になります。 皆さんそれでやられているのでしょうか。 蛇足となりますが、もしアドバイスでも頂ければ。

関連するQ&A

  • コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが

    コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが以下のやり方では”RangeクラスのSelectメソッドが失敗しました。”のエラーが出てしまいます。どこがいけないのか教えてください。 Private Sub CommandButton1_Click() Worksheets("sheet2").Activate Range("a65536").End(xlUp).Offset(1).Select End Sub ちなみに、コマンドボタンはシート1にあります。 よろしくお願いします。

  • エクセルVBA ウィンドウ左上になるセルを指定する

    いつもお世話になっております。 以下のようなマクロを書きました。 Sub test() Worksheets("Sheet2").Select Range("A1").Value = "☆" Worksheets("Sheet1").Select Range("AG100").Activate End Sub 上記マクロでは、最後にAG100セルが見えるようになりますが AG100セルがウインドウ一番左上でアクティブになるように するためにはどのように記述すればよいか ご教示ください。 よろしくお願いします。

  • 初歩的な質問です!sheetの選択

    よろしくお願いします! エクセル2003,Sheet1を右クリック>コードを表示を選択して、下のように記述したところ、予想と違う動作をしました。 sheet1,2のそれぞれのA1セルに各々のsheet名を入力したかったのですが、失敗した原因はどうしてでしょうか。activateをselectにしても変わりませんでした。 初歩的なことだと思いますが、どうぞよろしくお願いします! Sub macro() Worksheets("sheet1").Activate Cells(1, 1) = "sheet1です。" Worksheets("sheet2").Activate Cells(1, 1) = "sheet2です。" End Sub

  • Excellマクロ Cellsの範囲選択について

    エクセル2003についてお尋ねします。 A1には行番号にあたる変数が表示されるようになっています。 その変数によって選択するセルの範囲が変わるようにすることが目的でした。 「A1の行番号の5~10列目を選択する」というマクロを 下記のような記述を行いましたが、※のところでエラーが出てしまい、問題がわからずにおります。 お手数ですが解決策をご教授ください。 Sub マクロ1() Dim j As Integer j = Range("A1") Worksheets("Sheet1").Activate Range(Cells(j, 5), Cells(j, 10)).Select ←※ End Sub よろしくお願いいたします。

  • VBA 選択したセルが空白であったらシートを削除

    こんばんは!いつもお世話になっています。 選択したシート1のセル(C9)が空白であったら、選択したシートを削除するマクロ(VBA)を作りましたが、上手く作動しなくて困っています。 どうしたらよいのかよろしくお願い致します。 'シート1のセルC9を選択し、空白か判断する Sub セルの選択()   Worksheets("Sheet1").Activate   Range("C9").Select  If Len(Application.Trim(ActiveCell)) = 0 Then   MsgBox("空白セル")  End If End Sub '現在アクティブなシートを削除する Sub DeleteWorksheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub

  • マクロ ファイルを開いたときにいつも同じセルを選択

    Sub auto_open() Worksheets("今週の点数").Activate Range("g3").Select End Sub というように、動作させたいエクセルファイルを開いてから、「開発」-visual basic-と進み、ThisWorkbookをダブりクリックして開いた画面に上のように記述したのですが、最後に上書き保存をしたセルが出てくるだけで、うまくいきません。何が間違っているのでしょうか。

  • アクティブでないシートのセルを選択

    Excel VBAでアクティブでないシートのセルをSelectすることはできないのでしょうか。 Selectメソッドというのは,もともとそういうものなのでしょうか。 エラー: 「RangeクラスのSelectメソッドが失敗しました。」 コード Sub aaa() With Worksheets("Sheet2") .Range(.Cells(44, 1), .Cells(48, 21)).Select End With End Sub

  • マクロ セル範囲の選択の仕方について

    いつも回答して頂きありがとうございます。 ネット等で検索し、有効なマクロ記述を使用してセル範囲の選択を行いましたが、 自分が思っている通りに動きませんでした。 『質問内容』 C7を起点とした最終の列 (C7:D7) ← 自分の狙いの選択範囲(Dより大きい文字がきて欲しかった) 実際は、(A7:C7)が選択された。 どこらへんの記述が間違っているのでしょうか? 御指導の程よろしくお願い致します。 ちなみに下記が自分が作成中のマクロです。 Sub シートを繰り返し選択する() Dim d As Integer Dim retu As Integer d = 3 retu = Range("IV7").End(xlToLeft).Column Worksheets(Worksheets("一覧").Cells(d, 2).Value).Activate ActiveSheet.Range(Cells(7, 3), Cells(7, retu)).Select End Sub

  • エクセルで、選択したセルを上に表示したい

    たとえばsheet1のA1を選択した場合、 Sub MacroA1() Sheets("Sheet1").Range("A1").Select End Sub で、A1が選択されますが、 次に仮に Sub MacroA100() Sheets("Sheet1").Range("A100").Select End Sub でA100を選択してもA100が画面上で一番上には来ないようです。 この場合、A100を画面で一番上に表示させたい場合はどうやればいいのでしょうか?スクロールさせるマクロを記述するのでしょうか?もしそうならどのように書けばいいのでしょうか?

  • Excelマクロについて(セルのコピー)

    今、マクロで自動的にセルのデータを別シートに貼り付けるというものを作っています。 Private Sub コピー定義() Worksheets("sheet1").Activate 'sheet1をアクティブにする コピー元行 = 2 コピー先行 = 1 コピー元セル = "A" & コピー元行 コピー先セル = "A" & コピー先行 Worksheets("sheet1").Range(コピー元セル).Copy _ Destination:=Worksheets("sheet2").Range(コピー先セル) End Sub これで、sheet1のA2からsheet2のA1にコピーできるのですが、 Private Sub コピー定義() Worksheets("sheet1").Activate 'sheet1をアクティブにする コピー元行 = 2 コピー先行 = 1 コピー元行 = 2 コピー先行 = 1 コピー元セル = "A" & コピー元行 コピー先セル = "A" & コピー先行 コピー元セル = "B" & コピー元行 コピー先セル = "B" & コピー先行 Worksheets("sheet1").Range(コピー元セル).Copy _ Destination:=Worksheets("sheet2").Range(コピー先セル) End Sub とすると、B2の項目しかコピーされません。複数のセルを一度にコピーするマクロの作り方をご存じの方、ご伝授下さい。

専門家に質問してみよう