- ベストアンサー
Excel VBAでの初期設定
- Excel VBA初心者の方へ。Excel 2013で、VBAを使ってBookを開いたときにシートの初期設定をしたい場合、Activateイベントを利用できます。しかし、sheet1を開いて保存している場合、イベントが発生しないため初期設定の処理ができません。対応方法を教えてください。
- Excel VBA初心者の方へ。Excel 2013で、VBAを使ってBookを開いたときにシートの初期設定をしたい場合、どのような方法がありますか?Activateイベントを利用する方法もありますが、sheet1を開いて保存している場合、イベントが発生しないため初期設定の処理ができません。対応方法を教えてください。
- Excel VBA初心者の方へ。Excel 2013で、VBAを使ってBookを開いたときにシートの初期設定をしたい場合、どのような方法がありますか?Activateイベントを利用する方法もあるのですが、sheet1を開いて保存している場合、イベントが発生しないため初期設定の処理ができませんでした。対応方法を教えていただけませんか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Private Sub Workbook_Open() Worksheets("sheet1").Activate Sheet1に記載している '初期設定処理 End Sub とするのは駄目なのでしょうか。 念のためにセル指定部分はSheet1指定して With Sheets("Sheet1") .Range("A1")とか.Cells(1,1)など End With もしくはSheet1のコードに Private Sub Worksheet_Activate() を Sub Init() '初期設定処理 End Sub にして Private Sub Worksheet_Activate() Call Init ENd Sub とし、それで Private Sub Workbook_Open() Sheets("Sheet1").Init End Sub などありそうです。
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
№2のお礼に関して、気になったこと。 コントロールのことが出ていますが、 (1)ユーザーフォームに置く (2)シートに置く (3)その他 どういう場合か思い出さないが。 の3つが、考えられるが、(1)に置くのが、正統的な使い方のように見える。 本やWEB記事や実際やってみての経験から、そういうものかと思う。 この点をいつも意識して、勉強されるとよいと思う。 それに (1)手動で貼り付け (2)VBAで動的にコントロールを作成 の2つがあり得るが、(1)が主流で、(2)のVBAによる方法を使わざるを得ない場合は、書籍などでは、あまり想定されてない。
お礼
お礼が遅くなりました。 貴重なアドバイスありがとうござました。 ご意見を今後の参考にさせていただきたいと思います。 ・コントロールをシートに置いたのは、オートシェイプを使って外枠の形や中のデザインなどを自由に作成したかったためです。ユーザーフォームに置くことについては今後検討していきたいと思います。 ・またコントロールの作成をVBAで動的に作成する点につきましては、貼り付けや削除をプログラム上で自由にできそうなので、そういう使い方をするときには有効かと思いますが、掲載されている参考書も見当たらず、別の機会に考えることにしたいと思います。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1のお礼を見ないままNo4を回答してしましました。 No4の説明はいらなかったですね。 回答その2】:OK でいいと思います。個々のシートの操作はThisWorkbookに書くよりシートモジュールに書いた方がいいですね。 ThisWorkbookに書いたら駄目なのでしょうかといった本人が言うなという感じですが…。
お礼
お礼が遅くなりました。 今回の質問でいろいろな方法があることがわかりました。 1点、基本的に私が間違っていた点をお伝えしておきます。 回答No.1のお礼の中で 『【回答その1】:一部NG』と書いたのは私の間違いでした ========================= '以下は"ThisWorkbook"に記述 Private Sub Workbook_Open() Worksheets("sheet1").Activate Txt初期値.Value = 23.4 '★「変数が定義されていません」エラー Worksheets("sheet1").Range("A1") = 10 '★これはOK End Sub ========================= 『Txt初期値.Value = 23.4』については 『Worksheets("sheet1").Txt初期値.Value = 23.4』とすべきでした。 『Range("A1") = 10』の場合は『Worksheets("sheet1").』を省略しても正常動作でしたが、ActiveXコントロールの場合はNGのようです。よくわかりませんが、他のモジュールから参照する場合は直前にシートをアクティブにしていてもシート名が必要のようです。 ともかくご丁寧なフォロー、ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1の追加です。 もし初期設定処理でSheet1がActiveじゃないとエラーになるようなコードだとしたら Private Sub Workbook_Open() Sheets("Sheet1").Init End Sub は Private Sub Workbook_Open() Application.EnableEvents = False Sheets("Sheet1").Activate Application.EnableEvents = True Sheets("Sheet1").Init End Sub にしてください。 ただ思うのですが、Sheet1がActiveになるたびに初期化するようですがそのような仕様なのでしょうか。 他のシートからSheet1を選択するたびに初期化されます。 開いた時だけなら Private Sub Worksheet_Activate() はいらないですし Private Sub Workbook_Open() Sheets("Sheet1").Activate Sheets("Sheet1").Init End Sub でいいです。
お礼
再度のご教授ありがとうございました。 最初のご回答のお礼が遅れたために行き違いになったかもしれません。 ・イベントの発生を停止する手法 ・Activeになるたびに初期化されることに気を付ける点 など、いろいろ勉強になりました。 最初のお礼に書きましたが、今回ご教授の最後のように記述しており、正常動作を確認しました。 ありがごうございました。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>Activateイベントを使おうと思いましたが わざわざActivateイベントを使おうと思った理由は、たぶん「Sheet1がアクティブ状態じゃないと正しく初期化できないから」だと思います(Sheets1が選ばれてる状態を想定して書かれている) Sheet1がアクティブなのが前提で書かれた初期化処理を現状のまま使うには「Sheet1をアクティブにしてから呼び出す」必要があります。 以下のようにして下さい。 ============================= '"以下をThisWorkbook"に記述 Private Sub Workbook_Open() Dim sn As String sn = ActiveSheet.Name '開いた瞬間のワークシート名を取得 If Worksheets(1).Name = sn Then ’snが1番のワークシートなら Call 初期化処理 '初期化処理を呼び出す MsgBox "sheet1の初期設定をしました" Else ’snが1番のワークシートじゃないなら Worksheets(1).Activate 'Sheet1をアクティブにする。イベント発生 Worksheets(sn).Activate '開いた瞬間のワークシートに戻す End If End Sub ============================= '"以下をsheet1"に記述 Private Sub Worksheet_Activate() Call 初期化処理 MsgBox "sheet1の初期設定をしました" End Sub ============================= '"以下を標準モジュールのModule1"に記述 Sub 初期化処理() '初期設定処理 End Sub
お礼
お礼が遅くなりました。 いろいろな点で大変参考になり、望んでいた動作を確認することができました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
WorkBook_Openのイベントの中で、Workshees(”Shee1”).Activateを書けばよいはず。 改めてWorksheets("sheet2").Activateをイベントとして、(質問程度のことなら、)独立させる必要はないのでは。 それよりBookなりSheetを開いたとき、どういう作業をする必要があるのか、が質問に説明されていない。 ただ形式的に解説書に載っているコードをいじくっているだけのようだ。 エベントの考えは、また利用は、難しい点もあり、初心者には、後の学習課題だろう。 もっとデータを扱う点の勉強をすべきだろう。 どちかというと、他人に使わせるブック・シートを作った時に、使うべき時が多く、 他人に使わせるブック・シートを作っるのは、だいぶ先の課題だ。 自動的誘導(Activateイベントもこれかな?)や処理(選択を助けるコントロールの利用など)のほかに、エラー処理を丁寧にしたり、操作者の操作を制約する、コードを入れないといけないから、いろいろ学ばないといけない。 ーー 改めてシートのActivateイベントをGoogleで「Sheet Activateイベント 使い道」で照会したが 、あまりこれ(が用途)だという記事は見つからなかった。 ーー セルデータの計算や代入・取得だけで済む処理などは、Activateさせなくても、Worksheets(”Sheet1”).Range( ).・・ で済む場合も多い、と感じる。
お礼
ご回答ありがとうござました。 『どういう動作』について、なるべく簡単に書こうと思い、 ・初期設定処理 ・MsgBox "sheet1の初期設定をしました" としか書かず、逆にわかりにくくなり申し訳ありませんでした。 内容はsheet1に配置したActiveXコントロールの初期化や演算です。 イベントを使うにはいろいろ学ぶことがあるとの助言ありがとうございました。 おっしゃる通り『ただ形式的に解説書に載っているコードいじくっているだけ』で、独学でやっている自分にはそれ以外に良い方法が見つかっておりません。 VBAは解説書はたくさん出ていますが、やってみるとうまく動かすのが大変と感じております。 またいろいろ調べていただきありがとうございました。
お礼
早々のご回答ありがとうございました。 おかげで解決できました。 補足説明ですが、sheet1にはActiveコントロールを配置しておりその初期化もあります。 以下sheet1にテキストボックスを追加して状況説明致します。 ------------------- 【回答その1】:一部NG '以下は"ThisWorkbook"に記述 Private Sub Workbook_Open() Worksheets("sheet1").Activate Txt初期値.Value = 23.4 '★「変数が定義されていません」エラー Worksheets("sheet1").Range("A1") = 10 '★これはOK End Sub ====================================== 【回答その2】:OK '以下は"ThisWorkbook"に記述 Private Sub Workbook_Open() Worksheets("sheet1").Activate Sheets("sheet1").Init End Sub ------------------- '以下は"sheet1"に記述 Sub Init() Txt初期値.Value = 23.4 Worksheets("sheet1").Range("A1") = 10 End Sub ======================================