0

我正在创建一个 Excel 加载项,该加载项实现IDTExtensibility2并具有一个使用 Excel 的PublishObjects发布工作表范围的函数

我正在使用 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,因为这可能会改变。

这是一个在手动计算中不会被调用两次的 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 回答