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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
自分のセンスや笑いの好みに影響を受けた作品を教えて
子どもの頃に読んだ漫画などが その後の笑いの好みや自分自身のユーモアのセンスに影響することがあると思いますが、 「この作品に影響受けてるな~!」というものがあれば教えてください。
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
VBAで別モジュールへの変数の受け渡し方法
Visual Basic(VBA)
-
エクセルVBAでシートモジュールでのパブリック変数
Excel(エクセル)
-
VBA:小数点以下の数字を取得できる関数は?
Visual Basic(VBA)
-
-
4
エクセルVBA 作業後に選択範囲を解除する方法
Excel(エクセル)
-
5
Accessでグローバル変数を宣言して定数を定義したい
その他(データベース)
-
6
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
7
エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
Excel(エクセル)
-
8
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
9
Excel マクロ VBA プロシージャが大きすぎます のエラー対処方法
Visual Basic(VBA)
-
10
小数か整数かを判定する方法
Visual Basic(VBA)
-
11
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
12
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
13
VBA たまに変数がempty値になるエラー
Excel(エクセル)
-
14
VBAを何回も作り直して、容量が増えた
Excel(エクセル)
-
15
Excel VBAでn行毎に行の選択
Excel(エクセル)
-
16
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
-
17
セルの値が変ると自動でマクロが実行される。
その他(Microsoft Office)
-
18
DoEventsがやはり分からない
Visual Basic(VBA)
-
19
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
20
private subモジュールを他のモジュールから呼び出して使う方法を教えてください(-.-)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBでグローバル変数を宣言するには
-
Excel VBAで、ユーザーフォーム...
-
Excel VBAでリンク切れをチェッ...
-
VBAで別モジュールへの変数の受...
-
vba 標準モジュールインポート...
-
エクセルVBAでシートモジュール...
-
Form間の値の渡し方
-
モジュールとクラスの違いって...
-
Excel VBA 『Call』で呼び出す...
-
グラフのX,Y座標を取得したい
-
モジュールとは何ですか
-
本当にPublicな変数(配列で)
-
VBAで旧字体を異字体に一括で変...
-
シートモジュールで使う変数を...
-
Excel VBA 標準モジュールの整...
-
Workbook.BeforeSave イベント...
-
VBA This Workbookモジュール...
-
VHDLにおける「generic」について
-
ユーザー定義関数に#NAME?が返...
-
VBのフォームモジュールと標準...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
ユーザー定義関数に#NAME?が返...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
VBAで別モジュールへの変数の受...
-
モジュールの最大数はいくつな...
-
VBでグローバル変数を宣言するには
-
グラフのX,Y座標を取得したい
-
VBA This Workbookモジュール...
-
モジュールとクラスの違いって...
-
【vba】フォームに書いてあ...
-
VBAで旧字体を異字体に一括で変...
-
vba userFormのSubを標準モジュ...
-
ベースモジュールって?
-
標準モジュールを削除したい。(...
-
Access VBA標準モジュールにつ...
-
Form間の値の渡し方
-
VBAProjectのモジュ...
-
'Range'メソッドは失敗しました
おすすめ情報