質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

9979閲覧

マクロを書く場所の違い

kusAbi

総合スコア22

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/04/24 04:45

お世話になります。

エクセルVBAの画面を立ち上げると、プログラムを書く場所として
Sheet1 と ThisWorkbook があり、またマクロの登録などを行うと作成される 標準モジュール があると思います。

Sheet1 はそのシートの中でのみ有効。
ThisWorkbook はそのブックの中でのみ有効。
標準モジュール はエクセル全体で有効と解釈していますが、

①この解釈で合っていますか?
②他に違いはありますか?

またこの場合はこちらの方が良い、などもあれば教えていただきたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

①この解釈で合っていますか?

あっていません。
標準モジュールは、ブック内で共通のモジュールになります。

ThisWorkbook

ブックに関する処理を記述する場所。
ブックを開いたとき、閉じたときのイベントなんかはここで書きます。

各シート

そのシートに関する処理を記述する場所。
そのシートに対するイベントなんかはここで書きます。
また自身のシート・メソッドについては、直接記述することができます。

VBA

1' 自身のシートにアクセス 2Cells(1,1).Value = 1 3' 他のシートにアクセス 4Worksheets("Sheet2").Cells(1,1).Value = 1

標準モジュール

全シートで共通の処理や変数を置くのが基本です。
あちこちで使う共通関数などです。


他にもブック内に持てる要素としてクラスモジュールやユーザーフォームなどがありますが割愛します。

そのほか、PERSONAL.XLSBというものもあります(Excelのバージョンによってはこの名前ではない可能性あり)。
これはExcelを起動すると必ず読み込まれるもので、ユーザーごとに持っています。
いつも使う処理なんかを置いておくと便利に使えます。

投稿2019/04/24 23:59

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kusAbi

2019/04/25 00:28

『標準モジュールは、ブック内で共通のモジュールになります。』とは 標準モジュールとThisWorkbook は使い分けはあるものの、特に機能的な違いはないという考えで良いでしょうか?
ttyp03

2019/04/25 00:36

うーん、機能的な違いはないといえばないですが、それを言ったらシートも機能的には同じ扱いになります。 機能的に同じだからといって適当に関数を配置しないように、きちんと役割を把握するようにしてください。 ちなみにThisWorkbookに共通関数をPublicで置いた場合と、標準モジュールに共通関数をPublicで置いた場合ではアクセスの方法が異なります。 仮にtestという関数をおいた場合、ThisWorkbookの場合は、 Call ThisWorkbook.test と書かないといけませんが、標準モジュールの場合は、 Call test と書けます。
kusAbi

2019/04/26 00:11

書こうと思えば書けるが それぞれロジック的にわかりやすい記述の仕方がある、と認識しました。 回答ありがとうございました。
guest

0

ベストアンサー

何をもって「有効」とするのかがわかりませんが、

Sheet1 はそのシートの中でのみ有効。

ThisWorkbook はそのブックの中でのみ有効。
標準モジュール はエクセル全体で有効と解釈していますが、

に該当する要素がぱっと思い浮かばないので、

①この解釈で合っていますか?

に関しては間違っていると思われます。


②他に違いはありますか?

個人的にぱっと思いついた違いを挙げると以下になります。

種類Application.Run外部に公開NewMe
標準モジュール公開 変更可××
Excel のモジュール公開 変更不可×
ユーザーフォーム×非公開 変更可(*1)
クラスモジュール×非公開 変更可

表の内容の補足

Excel のモジュール

Sheet1ThisWorkbookなどのことです。

Application.Run

そのモジュール内で定義されたSubFunctionプロシージャを、Application.Run メソッド (Excel) | Microsoft Docs で呼び出せるかどうかです。

引数のない Public な Sub プロシージャを定義したとき、Alt + F8の「マクロ」に表示されるかどうか、と考えても大体の場合は問題ないです。

外部に公開

プロジェクト(VBAProject など)の外部から、そのモジュールの情報にアクセス可能かどうかです。
具体的には「参照設定」などで xlsm ファイルなどを参照したときに、参照している側で表示されるかどうかです。

標準モジュールを非公開にした場合、Alt + F8の「マクロ」にも表示されなくなります。

(*1)ユーザーフォームに関しては特殊な操作をしないと設定を変更できません。

New

New ○○として、そのモジュールのインスタンスを増やすことができるかどうかです。

vba

1'New の使用例 2Dim myCol As VBA.Collection 3Set myCol = New VBA.Collection
Me

そのモジュール内でMeキーワードが使えるかどうか、すなわちそのモジュールが「オブジェクト モジュール」かどうかです。

標準モジュールではイベントの購読、生成はできませんが、オブジェクト モジュールであればイベントの購読、生成ができるようになります。


個人的な標準モジュール と Excel のモジュール の使い分け

その処理を他でも使いたいかどうか

Excel のモジュールに書いた内容は外部に保存するのが少し手間となるため、「この シート|ブック でしか使わない」という処理を書くことが多いです。

逆に汎用的な処理、他でも使いたい処理は標準モジュールに記述します。

処理の種類

セルに入力されたときに何かする、ブックが開かれたときに何かする、といったイベントの処理をしたい場合は、標準モジュールではできないため、Excel のモジュールを使うことが多いです。

処理の壊れやすさ

通常の Excel 操作をする限り、標準モジュールが消えることは少ないです。
対してSheet1などは、実体のシートがユーザーの目に見える形で存在するため、そのシートが消されると中の記述も消えます。

シートが消されると記述も消える、は通常はデメリットですが、
記述が壊れたことに早期に気付きやすくなる(中途半端な状態で処理が動きにくくなる)というメリット、と考えることもできます。

そのシートを壊された時点で全体の処理が成り立たなくようなシートには、シート側に記述をすることが多いです。

投稿2019/04/24 12:48

編集2019/04/25 13:36
imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kusAbi

2019/04/25 00:27

『外部に公開』中、 変更化⇒変更可で、可の場合はALT+F8で表示されるかどうかを変えられる、 *1 は、『ユーザーフォームに関しては特殊な操作をしないと設定を変更できません。』に紐付いていると思ってよろしいですか? また、Newについてクラスモジュールについては何となくイメージが付くのですが フォームモジュールをNewするという事が今一イメージが付かないので、何か例など挙げていただけると嬉しいです。
imihito

2019/04/25 14:07

>『外部に公開』中、 その解釈で大丈夫です。こちらのミスでわかりにくくなってしまいすみませんでした。 >フォームモジュールをNewする 私が一番恩恵を感じたのは、同じフォームを複数のウィンドウに表示しようとしたときです。 Excel 2013 以降や他の多くの Office はファイル毎に独立したウィンドウを持っています。 この時、フォームを普通に Show すると一つのフォームのインスタンスを使い回すことになるため、ウィンドウのどれか一つにしかフォームを表示できません。 対して、フォームを New してから Show することで、ウィンドウ毎にフォームを持たせることができるようになります。 また、複数のウィンドウに表示したかった理由としては、この時のフォームは汎用的な操作補助用のフォームで、作業中のファイル毎に常時表示しておきたかったからです。 私個人として、フォームモジュールは、フォームという見た目&それに付随するメンバーを持っている点を除けば、機能的にはクラスモジュールと同じようなものだという認識です。
kusAbi

2019/04/26 00:19

自分の環境では、各種マスタの検索機能に使えるかなと思いました。 内容が詳細だったのでこちらをBAとさせて頂きます。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問