8

スプレッドシート関数 (ユーザー定義関数、UDF) から呼び出される VBA マクロがあります。スプレッドシートがインターネットからダウンロードされ、ユーザーがそれに応じて「セキュリティ センター」の設定を行っている場合、スプレッドシートはいわゆる「保護されたビュー」で開きます。関数は呼び出されません。「編集を有効にする」ボタンが表示されます。ボタンが押された場合、スプレッドシートは「信頼」され、通常どおり再オープンされ、計算が開始され、ユーザー定義関数が呼び出されます。

ただし、その VBA 関数では、の値Application.ActiveWorkbookNothing. これはデバッガで確認できます。

スプレッドシートのいくつかのプロパティ (パス名など) を読み取る必要があるだけなのでApplication.ActiveProtectedViewWindow、ワークブックの保護されたバージョンを参照する必要があるかどうかを調べることもできます。デバッガーでは、このオブジェクトを検査できます。ただし、リリースで (デバッグなしで) 実行すると、 の値Application.ActiveProtectedViewWindowNothing.

両方の動作 (特に最初の動作) は、Excel 2010 および 2013 に存在するバグのようです ( MSDN フォーラムの投稿も参照してください)。

質問:編集可能になった後、アクティブなワークブックのプロパティを取得する方法はありますか?

PS: Siddharth Rout のすばらしい観察のフォローアップとして、「ThisWorkbook」が機能する可能性があります。私の場合、マクロはオープンエンドのワークブックの一部ではありません。UDF は XLA で定義されます。したがって、ThisWorkbook は XLA を参照します。ThisWorkbook (= UDF を実行するワークブック) の代わりに、ActiveWorkbook (= UDF を呼び出すワークブック) を取得する必要があります。

重要な要件:

  1. 私の関数はユーザー定義関数として呼び出されます。つまり、実行順序はセルを更新する Excel によって決定されます。

  2. 関数は、開いているブックの一部ではありません。これは XLA の一部です。

  3. 開いているブックにコードを追加できません。

4

6 に答える 6

1

これは元の質問に対する完全な回答ではありませんが、これに関連する問題の (汚い) 回避策です。

ワークブックのパス、つまり ActiveWorkbook.Path を推測するには、ActiveWorkbook が必要でした。

ActiveWorkbook.Path を使用する代わりにApplication.RecentFiles(1).Path、最近開いたファイルのパスを確認することもできます。多くの場合、これはユーザーが「編集を有効にした」ワークブックになります。ただし、もちろん、この方法は失敗する可能性があります。使用した場合、別のシートが開かれ、以前に開いたシートが有効になります。

(注: ActiveWorkbook.Path はフォルダーのパスを示し、Application.RecentFiles(1).Path はファイルの完全なパスを示すため、後処理が必要です)。

于 2013-10-13T16:12:06.843 に答える
1

古いスレッドであることは知っていますが、同じ問題に遭遇し、解決策を見つけました;)

それを回避する唯一の方法は、変数型Workbookを使用することです

Dim wbk as Workbook
Set wbk = Application.ProtectedViewWindows(index).Workbook

警告: アクティブなウィンドウも保護されている場合、
ActiveSheetはNothingを返します。

Dim wsh As Worksheet
Set wsh = wbk.Worksheets(index)
于 2014-06-25T17:46:43.863 に答える
1

Try using Application.Caller.Parent.Parent instead of Application.Activeworkbook

于 2013-10-13T13:16:26.130 に答える