変数はマクロの中に置くのが当たり前です。でも、VBAはエクセルのシートやワードのドキュメントと値のやり取りができますから、シートやドキュメントを保存場所にすることもできます。
マクロのなかでもPublic変数を使えば、どのモジュールのプロシージャからでも読み出すことができます。しかし、エクセルやワードを終了すれば、当然、その値は失われてしまいます。
ドキュメントプロパティやレジストリを使えば、終了後も値を保持できますが、暴走したときがちょっと不安です。
というわけで、VBAアセットでは、変数の値を保持したい場合には、シートやドキュメントに変数を保存するようにしています。
この手法を用いれば、VBEを開かなくても変数を編集できますし、他にもいろいろな場面に応用できそうです。ただし、言うまでもありませんが、書き込み/読み込み速度は激しく遅いので、利用は必要最小限にする必要があります。
エクセルの場合
エクセルでシートに変数を置く簡単なコードを書いてみます(シートモジュールに記述しています)。
Sub SheetVariable()
'シートに値を書き込む
Cells(1, 1).Value = "VBAアセット"
'シートから値を読み込む
MsgBox Cells(1, 1).Value
End Sub
このマクロを実行すると、まずシートのA1セルに「VBAアセット」の文字列が入力されます。
次にその文字列が読み込まれて、メッセージボックスに表示されます。
この状態でブックを保存すれば、A1セルに文字列が入ったままの状態で保存できます。
こちらの記事でも、同様の手法が紹介されています。
ワードの場合
ワードでドキュメントに変数を置く簡単なコードを書いてみます(ドキュメントモジュールに記述しています。)
Sub DocumentVariable()
'ドキュメントに値を書き込む
Paragraphs(1).Range.Text = "VBAアセット"
'ドキュメントから値を読み込む
MsgBox Paragraphs(1).Range.Text
End Sub
このマクロを実行すると、まずドキュメントの1つ目の段落に「VBAアセット」の文字列が入力されます(ただし、表示はメッセージの表示が終わってからになります)。
次にその文字列が読み込まれて、メッセージボックスに表示されます。
この状態でブックを保存すれば、1番目の段落に文字列が入ったままの状態で保存できます。
アドインの場合は工夫が必要
エクセルの場合は、複数のシートが使用できますので、専用のシートを追加して、変数の置き場所にすることができます。
これに対し、ワードの場合は、ドキュメントが1つしか使えませんので、マクロを記述したテンプレートをアドインとして使用することになります。(フォント色を白にして、ドキュメントの片隅に置くなどの奥の手はありますが...)
ただし、アドインとして使っているテンプレートは、開かれた状態になっていませんので、そのままでは終了した時にドキュメントが保存されません。
次の例では、まずテンプレートを開き、それから値の書き込みと読み込みを行い、最後にテンプレートを保存してから閉じるようにしています。
Sub DocumentVariable()
Dim blnThisdocumentOpen As Boolean
Dim doc As Document
'テンプレートが開いているかどうかを確認する
For Each doc In Documents
'テンプレートと名前が同一の場合はTrueに設定する
If doc.Name = ThisDocument.Name Then blnThisdocumentOpen = True
Next
'テンプレートが開いていない場合
If blnThisdocumentOpen = False Then
'テンプレートを開く
Documents.Open (ThisDocument.Path & "\" & ThisDocument.Name)
End If
'ドキュメントに値を書き込む
Paragraphs(1).Range.Text = "VBAアセット"
'ドキュメントから値を読み込む
MsgBox Paragraphs(1).Range.Text
'テンプレートを保存する
ThisDocument.Save
'テンプレートが開いていなかった場合
If blnThisdocumentOpen = False Then
'テンプレートを閉じる
ThisDocument.Close
End If
End Sub
本サイトで紹介している「VA公用文」も、フォーム初期値の保存にこの手法を使っています。
コメント