こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA モジュールで共通に使う変数の宣言方法

VBAにてプログラミングを覚えている者です。

現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。
いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。

例えば、

Dim pic1 As Picture
Dim cell1 As String
Dim pass1 As String
Dim pic2 As Picture

などです。


Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。

共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに
その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか?
(例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・)

ヒントを教えていただければと思います。よろしくお願いします。

投稿日時 - 2012-09-28 14:34:36

QNo.7721418

すぐに回答ほしいです

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

>モジュールで共通に使う変数の宣言方法

モジュールの先頭に書いたdimで宣言すると,そのモジュールの中だけ(に記入されている各プロシジャ)でパブリックになります。
モジュールの先頭に書いたpublicで宣言すると,全モジュール(に記入されている各プロシジャ)に対してパブリックになります。

「変数宣言モジュール」のようにモジュールを越えて参照させたいという事なので,DimではなくPublicで宣言します。


Module1:
public x as variant


Module2:
sub macro1() ’先に実行する
x = "abc"
end sub


Module3:
sub macro1()
msgbox x
end sub

投稿日時 - 2012-09-28 17:34:36

お礼

回答ありがとうございました。

別モジュールを立て、変数をpublicにて宣言し、なおかつsubにていくつかプロシージャを作成した後、callにて呼び出すことで、すっきりとした内容となり、また変数の変更時(Stringなどの文字列)も1手順にて可能となりました。

ありがとうございました。

投稿日時 - 2012-09-29 17:23:59

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2012-09-28 15:23:20

補足

説明が間違っておりました。
いくつものプロシージャではなく、いくつものモジュールでした。

工程ごとにモジュールにて記録しているため、変数はモジュール間での共通利用となります。
ただし、callにて他のモジュールのプロシージャが呼び出されるのではなく、あくまで1つのプロシージャで使われるだけとなります。

Module1で Dim pic1 As Picture, cell1 As String, ・・・
Module2で Dim pic1 As Picture, cell1 As String, ・・・

こういった活用なのですが・・・

投稿日時 - 2012-09-28 15:48:17

ANo.1

変数を書く位置に注意!

変数の有効期間(範囲)、プロシージャ間の変数の受け渡し
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_050.html
もう一つは、モジュールレベルで変数を宣言する方法です。
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」を書くことで表示されません。

投稿日時 - 2012-09-28 15:14:48

あなたにオススメの質問