No.1ベストアンサー
- 回答日時:
こんにちは
標準モジュールに書けば、ブック中のどのシートでも使えるプロシージャになると思います。
一方、Sheetに書くとそのシートからフォーカスが他のシートに移ったとたんにエラーとなることで判るようにSheetの中でしか使えませんよね。
プロシージャを標準モジュールに書いて保存するときに「*.xla」に指定してアドインでエクセルに組み込むとどのブックでも使用できるプロシージャになります。
ということで、プロシージャーを書く場所で使用時のスコープ(有効範囲)が変わります。
No.2
- 回答日時:
Subは、標準モジュール内だけとは限りませんよ。
各シートでのイベントプロシージャは、そのVBAのソースコードを見てみると「Private Sub」という記述があると思います。Subは、「Public Sub」の省略系です。
これらのプロシージャの意味は、その名のとおり、局所的なものと、公のものであるという意味で、A88No8さんが書かれているように、それぞれ影響範囲(スコープ)が異なります。
Privateは、その名のとおり、局所的なスコープになり、シートで宣言している場合には、そのシートのみで有効なプロシージャとなります。Publicは、公のものではありますが、エクセルのVBAでは、標準モジュール以外(シートやフォームなど)での宣言は、PrivateもPublicも同じく扱われるはずです。(つまりは、シートやフォーム内のプロシージャからしか呼び出せない)
No.3
- 回答日時:
こんにちは。
>クラスモジュールとフォームのイベントプロシージャーを書くところではできませんでした。
標準モジュール
Public myClass As Class1
Sub SetClass()
Dim myClass As New Class1
myClass.test1 'myClass オブジェクトのメソッドになる
End Sub
Class1
Sub test()
MsgBox "あああ"
End Sub
'これで通ります。
------------------------------
'UserForm モジュール
Private Sub CommandButton1_Click()
Call test2
End Sub
Sub test2()
MsgBox "あああ"
End Sub
---------------------------------
>SUBプロシージャーは標準モジュールでなくてもいいのでしょうか?
Excelの場合は、オブジェクトが複数あるのが建前なので、SUB/Function プロシージャは、標準モジュールに書くのが基本的です。それ以外の場所に書くときは、それそれの必要性によって書きます。標準モジュール以外に対して、何でもよいわけではありません。
簡単にいうと、親オブジェクトの違いということになります。シートモジュールなどは、その直接の親オブジェクトの配下で動くことになっていますから、そのままにすると、親オブジェクトに直結しています。例えば、Cells(1,1) と書いても、標準モジュールの場合は、Activesheet ですが、シートモジュールは、書いたモジュールのシートが親オブジェクトになっています。シートモジュールで省略すれば、その範囲が限られてしまいます。
シートへのイベントなど、基本的には、そのシートしか使わないので、Private とつきますが、他の場所から呼び出さないということを理由にしているからです。他から呼び出して、不都合があるかどうかは、個人で使う分にはあまり大差はないと思います。
-------------------
シートモジュール側にPrivate が付いていなければ、
Worksheets("Sheet1").Test1
または、
'Call Worksheets("Sheet1").Test1
で、Sheet1のマクロをどこからでも呼び出せます。
エラーになるのは、親オブジェクトを考慮していないから、不整合が起こるからです。
シートモジュールに、
With ActiveSheet '←標準モジュールでは、親オブジェクトを考えなくてよい
MsgBox .Cells(1, 1).Value
End With
--------------------
シートを替えても、このようなコードですと、元のシートモジュールの親のシートのセル情報しか得られない。
MsgBox Cells(1,1).Value
--------------------
ThisWorkbook は、そのブックの玄関のようなもので、Open, Before_Close など、必ず、起動するとき、終了するときに、そこを通っていきますから、それを利用してあげればよいのです。標準モジュールは、家族が集まる、居間のようなもので、そこは、シート・モジュールを直接名指ししなくても、動きます。
また、クラスモジュールは、計画表や設計図のようなところです。設計図だけでは何も起きません。一度、イスンタンスを作ってあげないと動きません。
なお、Sub の前につける Private キーワードは、よそのモジュールから呼び出せませんが、シートモジュールにつけるPrivate ステートメントは、Option Private Module と書く方法は、標準モジュールにつけるもので、他のプロジェクトから呼び出せないようにするものです。
しかし、私の不勉強かもしれませんが、変数に関しては、Private/Public とか、そのモジュールのみに範囲を指定するとか、全体に対して、範囲を拡大するとか、標準モジュールに書く場合に、スコープに関係していますが、プロシージャに関しては、単に、マクロのCall (呼び出し)に関係するものだと解釈しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel・ユーザーフォームの情報を受け渡したい 4 2022/06/08 10:11
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Visual Basic(VBA) マクロについて教えてください。 1 2023/06/06 00:57
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel VBAで、ユーザーフォーム...
-
ArduinoのジャイロモジュールMP...
-
Excel VBA 標準モジュール内で...
-
エクセルVBAでシートモジュール...
-
VBAで別モジュールへの変数の受...
-
VBAのバージョン管理
-
pythonでファイル移動できません。
-
Excel VBA 『Call』で呼び出す...
-
現在アクティブなフォーム名を...
-
Excel VBAでリンク切れをチェッ...
-
VBでグローバル変数を宣言するには
-
モジュールを使わないで画像サ...
-
モジュールとクラスの違いって...
-
vba 標準モジュールインポート...
-
グラフのX,Y座標を取得したい
-
Excelシート内セル記述の違いに...
-
'Range'メソッドは失敗しました
-
フォーム内のテキストボックス...
-
VBのフォームモジュールと標準...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
モジュールとは何ですか
-
VBA This Workbookモジュール...
-
VBでグローバル変数を宣言するには
-
グラフのX,Y座標を取得したい
-
モジュールの最大数はいくつな...
-
【vba】フォームに書いてあ...
-
VBAで旧字体を異字体に一括で変...
-
Excel VBAで、ユーザーフォーム...
-
Form間の値の渡し方
-
モジュールとクラスの違いって...
-
Access VBA標準モジュールにつ...
-
本当にPublicな変数(配列で)
-
標準モジュールを削除したい。(...
おすすめ情報