スタイル

シートやドキュメントに変数を保存する

変数はマクロの中に置くのが当たり前です。でも、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公用文」も、フォーム初期値の保存にこの手法を使っています。

コメント

タイトルとURLをコピーしました