VBA アドインと参照元のPublic変数のスコープ範囲
現在大規模になった写真処理システムの保守効率・改造のし易さを目的として、各処理プログラムで共通的にコーデイングしている処理内容を、アドイン化する事で、各プログラムのスリム化を計っている。
ところが所々意味不明な独特な方法が存在する事がある
ブック処理には気をつけよう
アドインには、ブックとしての形態もシートも存在しない。
その為に、アドイン側で自分のブックの処理をする時には注意が必要
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パラメータで呼んだ方が良いのかも知れませんが、結構いやらしいです。
なを、アドイン側で処理している時には、カレントのブックが不明なので、明確に、ブックオブジェクトを指定した方が良いと思いますし、処理するシートがアクティブかどうかも不明なので、アクティブを期待した命令を出す場合も、注意が必要でしょう。
TAGS: VBA アドイン | 2021年3月14日