1

当我使用自动化启动 Excel 时,我无法让 Excel UDF 类在 Excel 中可用。我正在编写一个加载项,当从第三方应用程序启动 Excel 时该加载项需要工作。

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

我为 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");
            }
        }
    }

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

是否可以在使用自动化打开 Excel 时使 MYINT 功能可用?有人建议我可以使用 VSTO ThisAddIn_Startup() 中的 Excel.Application 对象来加载 UDF,但我找不到如何执行此操作的示例,帮助我的人也不知道。

我在 MSDN Excel 和 VSTO 论坛上寻求帮助,但无法清楚地了解下一步该做什么。StackOverflow 周围有一些类似的问题,但没有完全相同的问题。有没有人有任何想法?

4

2 回答 2

2

我遵循了Techiella 博客上的建议,它似乎已经解决了这个问题。

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

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

大学教师

于 2012-10-19T14:59:13.817 回答
1

当从 ac# 代码打开 Excel 文件时,将不会加载所有附加加载项(这就是您在“公式”选项卡中没有找到 UDF 函数的原因),因此您必须让代码调用加载项你需要的:

于 2013-09-06T12:42:46.717 回答