【Access VBA】Public変数の使い方とよくあるエラー・対策を解説

「一つの変数を複数のモジュールやプロシージャで使いたい」
そう思ったことはありませんか?
Access VBAでは、Public変数を使うことで簡単に実現することができます。
この記事ではPublic変数の使い方とよくあるエラー・対策について解説します。
- Access VBAでのPublic変数の使い方
- Dim・Private・Publicの違い
- モジュール間などでの値の共有方法
- Public変数でよくあるエラーとその対策
Public変数とは
Public変数とは、Access VBAで宣言されたプロジェクト全体で共有できる変数のことです。
複数のフォームやモジュールで同じ値を使いたい場合に利用されます。
VBAでは変数の有効範囲(スコープ)によってDim・Private・Publicを使い分けます。
- Dim:宣言したプロシージャ内だけで有効なローカル変数
- Private:宣言したモジュール内だけで有効なモジュール変数
- Public:プロジェクト全体で共有できるグローバル変数
Public変数は複数のモジュールやフォームからアクセス可能でプロジェクト全体で値を保持できます。
主にフォーム間で値を共有したい場合や、ログインユーザー情報を保持したい場合などに利用されます。
基本的な書き方
Public変数の基本的な書き方は次の通りです。
Public 変数名 As データ型Public userName As String
Public counter As Integer書き方自体はDimでの宣言方法と変わりませんが、
スコープがプロジェクト全体になる点がPublic変数の特徴です。
Dim・Private・Publicの違い
それぞれの違いについて表で整理することで理解がしやすいです。
| Public | Private | Dim | |
|---|---|---|---|
| スコープ | プロジェクト全体 | 宣言したモジュール内 | 宣言したプロシージャ内 |
| 宣言場所 | 標準モジュールの先頭 | モジュール先頭 | プロシージャ内またはモジュール先頭 |
| 値の保持 | プロジェクトがリセットされるまで | モジュールが有効な間 | 宣言範囲を抜けると消える |
| 用途 | 複数のモジュールで共有 | モジュール単位で共有 | その範囲内だけで使用 |
実務で役立つPublic変数の使い方
Public変数を活用したVBAのサンプルコードをご紹介します。
ログイン情報をPublic変数で渡す
ログインフォームで入力されたユーザー名をPublic変数に保存し、別フォームでその値を参照するVBAの例です。
標準モジュール
Public userName As Stringログインフォーム
Private Sub ログイン_Click()
userName = Me.ユーザー名
End Subデータ入力フォーム
Private Sub Form_Load()
Me.ユーザー名 = userName
End Sub※「ユーザー名」はフォーム上のテキストボックス名です。
- userName がプロジェクト全体で使える
- ログインフォームで userName に値をセット
- 別フォームでも同じ値を参照可能
ポイント
- フォーム間で値を簡単に共有できる
- 複数フォームで同じ情報を扱う際に便利
処理済みフラグをフォーム間で共有
Public変数をフラグとして使用し、処理が実行されたかどうかを別フォームで判定する例です。
標準モジュール
Public isProcessed As BooleanForm1(処理を実行するフォーム)
Private Sub btnProcess_Click()
' 何かしらの処理を実行
MsgBox "処理を実行しました"
' フラグをTrueにセット
isProcessed = True
End SubForm2(処理状態を確認するフォーム)
Private Sub Form_Load()
If isProcessed Then
MsgBox "すでに処理済みです"
Else
MsgBox "まだ処理されていません"
End If
End Sub- isProcessed がプロジェクト全体で使える
- Form1で処理を実行すると isProcessed が True になる
- Form2で処理済みかどうかを判定できる
ポイント
- 処理状態をフラグとして管理できる
- 別フォームでも処理状態を確認できる
よくあるエラーと対策
Public変数の値が消える
Public変数はVBAがリセットされると初期化されます。
初期化されるのは次のようなケースです。
- コードでエラーが発生
- VBAの「リセット」ボタンを押した
- デバッグ停止
- Accessを再起動
例えば次のようにPublic変数を宣言していた場合
Public userName As StringVBAがリセットされると、userNameの値は
""(空文字)に初期化されてしまいます。
対策
重要な値は次の場所などに保存するようにしましょう。
- テーブル
- TempVars
- フォームコントロール
Public変数をフォームモジュールに書く
' フォームモジュール
Public userName As Stringこの場合userNameはそのフォームだけでしか使えません。
プロジェクト全体で使う場合は「標準モジュール」に書く必要があります。
〇正しい書き方
' 標準モジュール
Public userName As String値が意図せず変更される
Public変数はどこからでも変更できるため別の処理で値が変更されることがあります。
userName = "田中"userNameに「田中」という値を入れたはずが別のモジュールで
userName = ""と意図しない値に変更される可能性があります。
対策
- 必要な場合だけPublic変数を使う
- 変数はなるべく狭いスコープで使う
- 処理の流れを整理する
まとめ
今回はPublic変数の使い方とよくあるエラー・対策について解説しました。
Public変数を使うことで複数のフォームやモジュール間で値を共有することができます。
一方でどこからでも値を変更できるためバグの原因になることもあります。
バグを減らしたりエラー発生時の原因特定を容易にするためにも、不必要なPublic変数の使用は控えるようにするのがおすすめです。

コメント