Excel のPublishObjectsIDTExtensibility2
を使用してワークシートから範囲を公開する関数を実装し、1 つの関数を持つ Excel アドインを作成しています。
Visual Studio 2008 と Excel 2007 を使用しています。コードは次のとおりです。
public class AddIn : IDTExtensibility2
{
private static Application s_Application;
public string PublishRange(Range rng)
{
new Thread(() => DoWork(rng)).Start();
return "OK";
}
private string DoWork(Range rng)
{
try
{
Worksheet sheet = rng.Parent as Worksheet;
Workbook book = sheet.Parent as Workbook;
string name = sheet.Name;
string address = rng.get_Address(Type.Missing,
Type.Missing, XlReferenceStyle.xlA1,
Type.Missing, Type.Missing);
book.PublishObjects.Add(
XlSourceType.xlSourceRange, @"c:\Temp\Output.htm",
name, address, XlHtmlType.xlHtmlStatic, "", "")
.Publish(true);
}
catch (Exception e)
{
return e.Message;
}
}
public void OnConnection(object application, ext_ConnectMode connectMode,
object addInInst, ref Array custom)
{
s_Application = application as Application;
}
// implementation of other interface methods is omitted
}
上記のコードは期待どおりに機能し、ワークブックが自動数式計算モードのときに Output.htm を取得します。
ただし、ワークブックが手動モードの場合 (デバッガーでs_Application.Calculation
は に設定されていることがわかりますxlCalculationManual
)、行Publish(true)
はアクティブなシートのすべての UDF を強制的に再計算します。
つまり、Publish(true)
終了する前に、メソッドへの別の呼び出しを受け取りますPublishRange()
が、今回s_Application.Calculation
は に設定されていxlCalculationAutomatic
ます。
また、同じワークブック内の他のシートの機能が影響を受けていないことも発見しました (理由はわかりません)。
質問: この計算モードのリセットを回避する方法はありますか?
私自身の関数が呼び出されることは問題ではありません。いつでもそこにブール値フラグを追加できますが、ワークシートには、私が行うことによって呼び出されてはならない他の関数があります。
ところで、メインスレッドから呼び出された場合、問題はありませんDoWork
。これは、バックグラウンドスレッドの実行に固有のものです。