Excel VBA
ExcelVBAでThisWorkbookが作成できない
ExcelのVBAで書いたアプリケーションが、突然動かなくなった。
「ActiveXコンポーネントはオブジェクトを作成できません」というエラーが出てしまい、エラーが出た箇所を見ると「ThisWorkbook.Path」でパスを取得している行だ。
こうなり始めたきっかけは分からないが、ひとつ言えるのはこのExcelブックがOneDriveフォルダ内に置かれているということだ。
ちなみにファイルのコラボレーションやファイルオンデマンドは共にオフにしている。
なぜこんなエラーが出るようになったのは不明だが、「Application.ThisWorkbook」と書くとちゃんと動いた。
とりあえずこれで凌げるようだ。
修正前
修正後
そもそもExcelVBAの「ThisWorkbook」とは何なのか。
VBAエディタ上でCtrl+Iを押してヒントを出すと「Class ThisWorkbook」と表示される。
つまりクラスだ。
対して「Application.ThisWorkbook」では「ThisWorkbook As Workbook」と表示される。
ということはプロパティ(メンバ)だ。
「ThisWorkbook」は「Application.ThisWorkbook」の省略形ということではなく、厳密にはこの2つは異なるもの、ということになる。
余談になるが「Excel.ThisWorkbook」はプロパティ、「VBAProject.ThisWorkbook」はクラスだった。
ThisWorkbook ← Class ThisWorkbook
Application.ThisWorkbook ← ThisWorkbook As Workbook
Excel.ThisWorkbook ← ThisWorkbook As Workbook
VBAProject.ThisWorkbook ← Class ThisWorkbook
ではクラスとプロパティでは何が違うのか。
VBAコード上に「ThisWorkbook」と書いた場合、実行時にThisWorkbookクラスのインスタンス(オブジェクト)が生成される、という動きになる。
対して「Application.ThisWorkbook」と書いた場合は、Application型オブジェクト内のThisWorkbook型プロパティを参照する、という動きになる。
「Application.ThisWorkbook」の場合は、アプリケーション(つまりエクセル)が起動した時点でApplicationオブジェクトが生成され、ワークブックを開いた時点でそのプロパティであるThisWorkbookも生成される。
つまりVBAコードが実行される時点ではそれがすでに存在しているので、問題なく参照できる。
しかし「ThisWorkbook」の場合は、VBAコードが動いて初めてThisWorkbookオブジェクトが生成されるので、何らかの要因でそのオブジェクトが生成できないと実行時エラーが出てしまう。
と、この辺までは分かったのだが、ではなぜ突然ThisWorkbookオブジェクトが生成できなくなったのか、ということまでは分からなかった。
後日談だが、MS Officeをオンライン修復すると以前のように「ThisWorkbook」でも動作するようになった。
今まで動いていたマクロが突然動かなくなったときは、エクセルアプリケーション自体が破損していないかどうかも疑ったほうが良いかもしれない。
|