2015年10月28日

EXCEL VBA で「真のグローバル変数(long型に限る)」を使う

Truly Global Variables With SetGetProp
↑ここにすべて書いてあります。サンプルのソースコードから必要なところだけコピーして自前のマクロに取り込みました。

エクセルが起動している間ずっと変数を保持してくれる。それが 真のグローバル変数だとしましょう。
記事にも書いてありますが、モジュールに Publicの代わりにGlobalと記述して得られるグローバル変数は確かに、ブック(プロジェクト)をまたいで エクセル起動中共通で使える変数なんです(ScopeはGlobal)。
でもその変数を定義しているブックを閉じたり、開きなおすと 初期化されてしまいます。真のグローバルじゃない!(Life Time は Globaじゃない!)

Excelプロセスが起動中はずっと保持し続けるような真のグローバル変数はエクセルが持つべきなのです。( レジストリーでもいいじゃないかという話はちょっと違うので今回はしません)。

エクセルが起動したら初期化し、あとは何度ブックを開こうが閉じようが 共通の変数を参照する。
そのために上の記事が言っていることは、プロセス(エクセル)のプロパティへ値を突っ込め!ということです。ただしLONG型の数値しか保持できませんが。

とりあえず、習作として コピーしたロジックをもとに 同じブックを開いた時にエクセルに追加したカウンター用プロパティへ ブックを開くたびにインクリメントして、特定の同じファイルを開いたらそれを何度開いたかを表示する仕組みにしてみました。
これの使いどころは常駐させているエクセルマクロが「リロード」されるようなシチュエーションを検知できるってことです。通常めったにないことですが やろうと思ったらリロードさせることは簡単でした。この機能が有効に働いていることも確認できました。

めでたし、めでたし。

上の記事の説明していることはエクセルに限らない(ウィンドウハンドルを持っているプロセス全般について同じ)なので 起動中のプロセスに 何らかのタグ付けをしてLONG型の値を持たせることもそれを変更することも可能なわけです。
発想を変えると、プロパティ名称そのものをString型のValueだとみなせば 文字列の値もプロセスに付与できるってことです(よね?)。

検証(からそのまま実装)完了。

・・・ていう感じで日々、マクロに機能が追加されていくのであります。
10年前くらいから作り始めたツールを今も拡張を続けている: NN Space BLOG-NN空間ブログ

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/166682345
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

・おすすめ楽天ショップ1:trendyimpact楽天市場店
・おすすめサプリショップ:iHerb.com
・おすすめ楽天ショップ2:上海問屋
Powered by さくらのブログ