VBA アドインと参照元のPublic変数のスコープ範囲

PC[コンピュータ]

現在大規模になった写真処理システムの保守効率・改造のし易さを目的として、各処理プログラムで共通的にコーデイングしている処理内容を、アドイン化する事で、各プログラムのスリム化を計っている。

ところが所々意味不明な独特な方法が存在する事がある

ブック処理には気をつけよう

アドインには、ブックとしての形態もシートも存在しない。
その為に、アドイン側で自分のブックの処理をする時には注意が必要

Main側
Call adoin
アドイン側
sub adoin
public myObj  as Workbook

myObj = ThisWorkBook ’— A  —
myObj.WorkSheet(“Sheet1”) .Cells(2,2) = “テストです”

end sub
という記述は、本来は、Main側のブックを参照したくてThisWorkBook としているのだが、アドインというのは、あくまでも ブックという属性がないので、これでは、エラーとなってしまう。

Main側
myObj = ThisWorkBook ’— A  —
Call adoin
アドイン側
sub adoin
public myObj  as Workbook

myObj.WorkSheet(“Sheet1”) .Cells(2,2) = “テストです”

end sub
自分のブックに対する命令である ThisWorkBook は、自分のブックで宣言し、そのオブジェクトをアドイン側で処理させる事が必要。

Public変数のスコープにはとても注意が必要

通常Public変数は、モジュールの壁を越えて全てで共用化される ハズ!?  であるが
調査・実験した限りでは、そうはなっていない。
上記例では、アドイン側で設定した、Public変数であるmyObjは有効で、問題ないのですが、以下の例では、アドイン側で参照されるべき Public変数であるmyObj はスコープ範囲外となってしまいます。オブシェクトブラウザーでも見えません。

Main側
public myObj  as Workbook
myObj = ThisWorkBook ’— A  —
Call adoin
アドイン側
sub adoin
myObj.WorkSheet(“Sheet1”) .Cells(2,2) = “テストです”

end sub

これって言語仕様を満たしていないと思うのですけど…
これには かなりはまってしまいました。

という事で、

共用化する場合のPublic変数に関しては、アドイン側で設定しなければならない

ようです。
Public変数でなく、きちんと、Callパラメータで呼んだ方が良いのかも知れませんが、結構いやらしいです。

なを、アドイン側で処理している時には、カレントのブックが不明なので、明確に、ブックオブジェクトを指定した方が良いと思いますし、処理するシートがアクティブかどうかも不明なので、アクティブを期待した命令を出す場合も、注意が必要でしょう。