0

我正在用 C# 为 Excel 编写 UDF 库。我将长期运行 UDF,所以我想让我的 UDF 异步,以便 Excel UI 在调用 UDF 时保持可用。以下是我的代码;但是从生成的线程调用Excel时失败了...

[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
[ComDefaultInterface(typeof(IRAPDataAddIn))]
public class RAPDataAddIn : IRAPDataAddIn
{

    public string GetPositionData(Excel.Range Portfolios, Excel.Range Security)
    {





        Excel.Application excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");

        Excel.Range target = (Excel.Range)excelApp.get_Caller(System.Type.Missing);


        Thread _workerThread = new Thread(new ParameterizedThreadStart(this.GetData));
        _workerThread.CurrentCulture = System.Globalization.CultureInfo.CurrentCulture;
        _workerThread.CurrentUICulture = System.Globalization.CultureInfo.CurrentUICulture;

        _workerThread.Start(target);

        return "Getting Data";
    }


    public void GetData(object Range)
    {
        Excel.Range target = Range as Excel.Range;

        Thread.Sleep(1000);

        object[,] returnData = new object[2,2];

        returnData[0, 0] = " FirstThread";       
        returnData[0, 1] = " SecondThread"; 
        returnData[1, 0] = " ThirdThread";              
        returnData[1, 1] = " FourthThread";  

        var Start = (Excel.Range)target.Worksheet.Cells[1,1];
        var End = (Excel.Range)target.Worksheet.Cells[2,2];

        Excel.Range r = (Excel.Range)target.Worksheet.Range[Start, End];

        try
        {
            r.Value2 = returnData; ***//It fails here***
        }
        catch (Exception ex)
        {

        }
    }
4

1 回答 1

2

(免责声明:我开发 Excel-DNA 库)

我建议您使用(免费) Excel-DNA库来实现您的 Excel UDF 。我最近添加了一些对异步函数的实验性支持,所以现在是尝试它的好时机。我在这里对当前的异步函数支持进行了初步概述:http ://exceldna.codeplex.com/wikipage?title=Asynchronous%20Functions&referringTitle=Documentation 。支持 Excel-DNA 的最佳地点是Excel-DNA Google 组

您的方法存在一些潜在问题:

  • 您检索的 Application 对象Marshal.GetActiveObject可能不是您正在运行的 Excel 实例。如果已启动多个 Excel 实例,它将是最近启动的 Excel。

  • 您不能只将“Range”COM 对象传递给另一个线程 - 它是一个 STA 单元绑定对象,因此如果没有显式的跨线程封送处理,就不能从不是主 Excel 线程的线程中使用。

  • 如果 Excel 正忙于计算,或者用户正在编辑单元格,甚至只是按下鼠标按钮,则从其他线程到 Excel 的任何 COM 调用都可能会失败。因此,作为正常操作的一部分,每个 COM 调用都需要处理可能的异常。

有几种方法可以使用 Excel-DNA 实现这种工作,因此如果您需要更具体的指导,您应该查看库并发布到 Google 小组。

于 2012-06-27T13:47:37.527 回答