0

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。これは、バックグラウンドスレッドの実行に固有のものです。

4

1 に答える 1

0

UDF には常に、使用するすべてのセル参照が引数として渡されている必要があります。そうしないと、Excel は再計算でそれらを呼び出すタイミングを認識できません (ただし、最終的な計算を決定するプロセスで、Excel が UDF を複数回呼び出す可能性があることにも注意してください)。順序)。
これは変更される可能性があるため、本当に Activesheet を使用するかどうかもわかりません。

これは、手動計算で 2 回呼び出されない VBA バージョンです。

Function zPublishRange(oRng As Range)
    Dim oPub As PublishObject

    On Error GoTo Fail
    Set oPub = oRng.Parent.Parent.PublishObjects.Add(xlSourceRange, "D:\Output.htm", oRng.Parent.Name, oRng.Address, xlHtmlStatic)
    oPub.Publish True
    zPublishRange = oRng.Parent.Parent.PublishObjects.Count
    Exit Function
Fail:
    zPublishRange = "Fail"
End Function
于 2014-04-02T18:10:15.483 に答える