スプレッドシート関数 (ユーザー定義関数、UDF) から呼び出される VBA マクロがあります。スプレッドシートがインターネットからダウンロードされ、ユーザーがそれに応じて「セキュリティ センター」の設定を行っている場合、スプレッドシートはいわゆる「保護されたビュー」で開きます。関数は呼び出されません。「編集を有効にする」ボタンが表示されます。ボタンが押された場合、スプレッドシートは「信頼」され、通常どおり再オープンされ、計算が開始され、ユーザー定義関数が呼び出されます。
ただし、その VBA 関数では、の値Application.ActiveWorkbook
はNothing
. これはデバッガで確認できます。
スプレッドシートのいくつかのプロパティ (パス名など) を読み取る必要があるだけなのでApplication.ActiveProtectedViewWindow
、ワークブックの保護されたバージョンを参照する必要があるかどうかを調べることもできます。デバッガーでは、このオブジェクトを検査できます。ただし、リリースで (デバッグなしで) 実行すると、 の値Application.ActiveProtectedViewWindow
もNothing
.
両方の動作 (特に最初の動作) は、Excel 2010 および 2013 に存在するバグのようです ( MSDN フォーラムの投稿も参照してください)。
質問:編集可能になった後、アクティブなワークブックのプロパティを取得する方法はありますか?
PS: Siddharth Rout のすばらしい観察のフォローアップとして、「ThisWorkbook」が機能する可能性があります。私の場合、マクロはオープンエンドのワークブックの一部ではありません。UDF は XLA で定義されます。したがって、ThisWorkbook は XLA を参照します。ThisWorkbook (= UDF を実行するワークブック) の代わりに、ActiveWorkbook (= UDF を呼び出すワークブック) を取得する必要があります。
重要な要件:
私の関数はユーザー定義関数として呼び出されます。つまり、実行順序はセルを更新する Excel によって決定されます。
関数は、開いているブックの一部ではありません。これは XLA の一部です。
開いているブックにコードを追加できません。