2012-10-11 293 views
1

当我使用自动化启动Excel时,Excel中有一个Excel UDF类可用于Excel中,这是一个问题。当我从第三方应用程序启动Excel时,我正在编写一个插件,需要它才能运行。当通过自动化打开Excel时,Excel UDF不可用

这是我的理解,这是通过设计,但我需要有一种方法来使我的UDF可供用户通过自动化打开Excel时。

我为Excel 2007创建了一个VSTO插件和UDF类。我复制了代码并按照书面指示完成了该网页的指示,除非我按照指示替换了GUID。 http://csharpramblings.blogspot.ca/2011/09/communicating-between-vsto-and-udfs-in.html

当我打开Excel时,我看到我的新加载项和UDF显示在函数列表(插入函数)中可用。所以我知道它在起作用。

然后我创建了一个使用Excel自动化来打开Excel的应用程序。
这是一个Windows窗体应用程序,我在Form1上放了一个按钮。我添加了一个对Microsoft.Office.Interop.Excel(版本1.6.0.0)的引用,它可以解决(在我的机器上)到C:\ Windows \ assembly \ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft。 Office.Interop.Excel.dll

我从http://support.microsoft.com/kb/302084得到了下面的代码,虽然我删除了一些将数据放入工作表单元的代码,因为我不需要它 - 我只是想要一个打开Excel的例子自动化。

Form1的C#代码为我的示例程序:

using System; 
using System.Reflection; 
using System.Windows.Forms; 
using Excel = Microsoft.Office.Interop.Excel; 
namespace ExcelAutomationTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void button1_Click(object sender, System.EventArgs e) 
     { 
      Excel.Application oXL; 
      Excel._Workbook oWB; 
      Excel._Worksheet oSheet; 
      Excel.Range oRng; 
      try 
      { 
       //Start Excel and get Application object. 
       oXL = new Excel.Application(); 
       oXL.Visible = true; 
       //Get a new workbook. 
       oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value)); 
       oSheet = (Excel._Worksheet)oWB.ActiveSheet; 
       //Add table headers going cell by cell. 
       oSheet.Cells[1, 1] = "First Name"; 
       oSheet.Cells[1, 2] = "Last Name"; 
       oSheet.Cells[1, 3] = "Full Name"; 
       oSheet.Cells[1, 4] = "Salary"; 
       //Make sure Excel is visible and give the user control 
       //of Microsoft Excel's lifetime. 
       oXL.Visible = true; 
       oXL.UserControl = true; 
      } 
      catch (Exception theException) 
      { 
       String errorMessage; 
       errorMessage = "Error: "; 
       errorMessage = String.Concat(errorMessage, theException.Message); 
       errorMessage = String.Concat(errorMessage, " Line: "); 
       errorMessage = String.Concat(errorMessage, theException.Source); 
       MessageBox.Show(errorMessage, "Error"); 
      } 
     } 
    } 

构建Windows窗体应用程序,它可以自动的Excel。运行应用程序。它将启动Excel。转到“公式”选项卡并单击“插入函数”。查看“所有”功能。在我的机器上,MYINT不在列表中。

使用自动化打开Excel时是否可以使MYINT功能可用?有人建议我可以使用VSTO ThisAddIn_Startup()中的Excel.Application对象来加载UDF,但是我找不到如何做到这一点的示例,并且帮助我的人不知道。

我问MSDN Excel和VSTO论坛寻求帮助,无法获得下一步该做什么的清晰图片。有一些类似的问题,但没有什么相同的,围绕StackOverflow。有没有人有任何想法?

回答

1

我遵循Techiella's blog的建议,它似乎解决了这个问题。

此我的C#代码如下 - 我把它放在ThisAddIn_Startup:

foreach (AddIn addin in ThisApplication.AddIns) 
{ 
    if (addin.Title == "MyUdf.Functions") 
    { 
    addin.Installed = false; 
    addin.Installed = true; 
    break; 
    } 
} 

+0

不知道为什么我无法找到.Title属性在我的VS2010。我只能使用ProgID。 – woodykiddy

1

当Excel文件从C#代码打开,所有额外加载项将不会加载(这就是为什么你没有在“公式”选项卡中找到你的UDF函数),所以你必须让你的代码调用插件,你需要: