VBAにてプログラミングを覚えている者です。
現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。
いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。
例えば、
Dim pic1 As Picture
Dim cell1 As String
Dim pass1 As String
Dim pic2 As Picture
などです。
Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。
共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに
その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか?
(例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・)
ヒントを教えていただければと思います。よろしくお願いします。
No.3ベストアンサー
- 回答日時:
>モジュールで共通に使う変数の宣言方法
モジュールの先頭に書いたdimで宣言すると,そのモジュールの中だけ(に記入されている各プロシジャ)でパブリックになります。
モジュールの先頭に書いたpublicで宣言すると,全モジュール(に記入されている各プロシジャ)に対してパブリックになります。
「変数宣言モジュール」のようにモジュールを越えて参照させたいという事なので,DimではなくPublicで宣言します。
Module1:
public x as variant
Module2:
sub macro1() ’先に実行する
x = "abc"
end sub
Module3:
sub macro1()
msgbox x
end sub
回答ありがとうございました。
別モジュールを立て、変数をpublicにて宣言し、なおかつsubにていくつかプロシージャを作成した後、callにて呼び出すことで、すっきりとした内容となり、また変数の変更時(Stringなどの文字列)も1手順にて可能となりました。
ありがとうございました。
No.2
- 回答日時:
こんにちは!
>いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い・・・
というコトですが、
まずコードを記述する前に変数の宣言をしておきます。
その後、各VBAのコードの記述で↓のような感じになります。
Dim pic1 As Picture, cell1 As String, pass1 As String, pic2 As Picture
Sub ○○○()
VBAコード
End Sub
Sub △△△()
VBAコード
End Sub
※ すでに複数のVBAコードがある場合、VBE画面で最初のVBAコードの「Sub」の前にカーソルを移動させ
そこで宣言しても大丈夫だと思います。
その後、各VBAコードの宣言している変数を削除!m(_ _)m
この回答への補足
説明が間違っておりました。
いくつものプロシージャではなく、いくつものモジュールでした。
工程ごとにモジュールにて記録しているため、変数はモジュール間での共通利用となります。
ただし、callにて他のモジュールのプロシージャが呼び出されるのではなく、あくまで1つのプロシージャで使われるだけとなります。
Module1で Dim pic1 As Picture, cell1 As String, ・・・
Module2で Dim pic1 As Picture, cell1 As String, ・・・
こういった活用なのですが・・・
No.1
- 回答日時:
変数を書く位置に注意!
変数の有効期間(範囲)、プロシージャ間の変数の受け渡し
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub0 …
もう一つは、モジュールレベルで変数を宣言する方法です。
Option Explicit
Dim 変数 As Long
' TEST2を呼んで結果を受け取りたい
Sub TEST1()
Call TEST2
MsgBox 変数
End Sub
' TEST1から呼び出されるサブプロシージャ
Private Sub TEST2()
' TEST1で宣言した「変数」に値をセット
変数 = Range("A1").Value
End Sub
プロシージャの外(通常はプロシージャの先頭)で宣言する変数は、モジュールレベル変数(あるいはモジュール変数)などと呼びますが、値をセットしたプロシージャが終わった後でも参照が可能となります。
昔のPCのメモリが少なかったころはモジュールレベルの変数を多用することを嫌いましたが、現在ではこの理由で避けることはないでしょう。
2つのプロシージャ間の変数値の受け渡しだけなら前の「引数」で解決できますが、参照するプロシージャがいくつもあったり、変数の数が多い場合はモジュールレベル変数を使う方法もあります。
但し、一連のマクロ動作中なら問題ありませんが、VBと違って、そのブックを開いている間全てに渡ってそのモジュールレベル変数が有効になるわけではないことは知っている必要があります。
他のモジュールからも参照する場合は?
まず、「Module1」の記述です。
Option Explicit
Public 変数 As Long
' TEST2を呼んで結果を受け取りたい
Sub TEST1()
Call TEST2
MsgBox 変数
End Sub
ここで呼び出すプロシージャ「TEST2」はこのモジュール上にはありません。
次に、「Module2」の記述です。
Option Explicit
Option Private Module
' TEST1から呼び出されるサブプロシージャ
Public Sub TEST2()
' TEST1で宣言した「変数」に値をセット
変数 = Range("A1").Value
End Sub
このように呼び出されるプロシージャ「TEST2」は別のモジュール上にあります。 この時に変数を参照できるようにするには、モジュールレベル変数の宣言にPublicを使う必要があります。なお、Publicでの宣言は標準モジュールにする必要があります。
Dim又はPrivateで宣言した場合はそのモジュール内のプロシージャからでないと参照できません。
また、プロシージャ自身は逆にSubやFunctionで始まるものは他モジュールからも呼び出し可能です。 こちらはあえてPrivateを書くことで他モジュールの参照をできなくしたり、マクロの起動に表示させないようにできます。
※なお、プロシージャ「TEST2」は本来、他モジュールからの呼び出しを許可するので、マクロの起動に表示されてしまいますが、 このサンプルでは、「Option Private Module」を書くことで表示されません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel マクロで For 文のインデックスを先に宣言する理由 7 2022/08/27 00:26
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAに関する質問です 2 2022/03/30 22:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VBAで別モジュールへの変数の受け渡し方法
Visual Basic(VBA)
-
エクセルVBAでシートモジュールでのパブリック変数
Excel(エクセル)
-
ブック名、シート名を他のモジュールからも参照可能にする方法
Access(アクセス)
-
-
4
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。
Visual Basic(VBA)
-
7
EXCEL VBAモジュール間のデータ受け渡し
その他(プログラミング・Web制作)
-
8
private subモジュールを他のモジュールから呼び出して使う方法を教えてください(-.-)
Visual Basic(VBA)
-
9
エクセルでエラーが出て困っています。
Excel(エクセル)
-
10
EXCEL VBA 指定したファイルが存在しない場合メッセージボックスを表示させる
Access(アクセス)
-
11
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
12
VBAでワークブックの名前を変数にして開かせる?
Excel(エクセル)
-
13
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
14
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
-
15
VBAのプロシージャー間で、変数の受け渡しの手法は、三種類ありますか?
Excel(エクセル)
-
16
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
17
ExcelのVBAでGoToの代わりに…
Excel(エクセル)
-
18
同じ作業を複数のシートに実行させるにはどうしたらいいのでしょうか
Visual Basic(VBA)
-
19
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
20
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ArduinoのジャイロモジュールMP...
-
Excel VBA 定義されたプロージ...
-
グラフのX,Y座標を取得したい
-
【vba】フォームに書いてあ...
-
VBでグローバル変数を宣言するには
-
VBAで別モジュールへの変数の受...
-
印刷後メッセージボックスを表...
-
VBAを使用してWordからExcelの...
-
VBAで旧字体を異字体に一括で変...
-
モジュールとは何ですか
-
VBA This Workbookモジュール...
-
Excel VBAでリンク切れをチェッ...
-
プラグイン、ライブラリ、コン...
-
Excel VBA 標準モジュール内で...
-
大量の標準モジュールを解放す...
-
モジュールからフォームのボタ...
-
偶数/奇数の判定
-
ユーザー定義関数に#NAME?が返...
-
AddressOf と同じ機能を持った...
-
CPANのインストールモジュール...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
VBでグローバル変数を宣言するには
-
エクセルVBAでシートモジュール...
-
VBA This Workbookモジュール...
-
モジュールの最大数はいくつな...
-
Excel VBAで、ユーザーフォーム...
-
VBAで旧字体を異字体に一括で変...
-
Access VBA標準モジュールにつ...
-
VBA モジュールで共通に使う変...
-
'Range'メソッドは失敗しました
-
グラフのX,Y座標を取得したい
-
モジュールとは何ですか
-
Excel VBA 『Call』で呼び出す...
-
プラグイン、ライブラリ、コン...
-
【vba】フォームに書いてあ...
-
モジュールからフォームのボタ...
-
モジュールとクラスの違いって...
-
acwzlibとは?
おすすめ情報