在宏中调用 Excel 加载项函数

本文关键字:加载项 函数 Excel 调用 | 更新日期: 2023-09-27 18:33:19

我正在开发 Excel 2013 的加载项,并在 Excel 加载项中创建了一个函数,如下所示

  public string ExcelReturnString()
    {
        return "This is the string: hi";
    }

我使用了下面的代码来调用该函数,但它抛出了一个错误。

Application.Run(ExcelReturnString)

如何在宏中调用加载项函数?

在宏中调用 Excel 加载项函数

这是离

直截了当最远的事情,但这就是你完成任务的方式。 我将尽可能明确,因为前两三次我尝试这样做,我错过了很多。

首先,在创建承载 ExcelReturnString() 的类时,需要使用具有以下属性的接口修饰类,然后还要标记要公开的每个方法的属性。 为了这个例子,我制作了加载项类"TestExcelAddIn":

using System.Data;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace TestExcelAddIn
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IStringGetter
    {
        string ExcelReturnString();
    }
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class StringGetter : IStringGetter
    {
        public string ExcelReturnString()
        {
            return "This is the string: hi";
        }
    }
}

然后,在与项目中的"Excel"关联的主类中,必须按以下方式重写RequestComAddInAutomationService。 同样,我包含了所有内容,所以你知道哪个类是哪个类(我第一次读它时没有(。

namespace TestExcelAddIn
{
    public partial class ExcelTest
    {
        private StringGetter myAddIn;
        protected override object RequestComAddInAutomationService()
        {
            if (myAddIn == null)
                myAddIn = new StringGetter();
            return myAddIn;
        }
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
        #region VSTO generated code
        #endregion
    }
}

现在,VBA已准备好以以下方式使用此方法:

Sub Test()
    Dim addin As Office.COMAddIn
    Dim automationObject As Object
    Dim returnString As String
    Set addin = Application.COMAddIns("TestExcelAddIn")
    Set automationObject = addin.Object
    returnString = automationObject.ExcelReturnString
End Sub

你可以给我100年的时间来解决这个问题,我不会。 实际上,将上面的罗塞塔石碑归功于MSDN:

https://msdn.microsoft.com/en-us/library/bb608621.aspx?f=255&MSPPError=-2147217396

除了上面DaveMac的注释之外,在调用另一个例程时也要记住几点:

如果要从与该例程位于同一工作簿/加载项中的例程调用宏,则不必使用 Application.Run。您可以使用其名称调用它:

MyMacro

如果要调用位于其他工作簿中的宏,则确实需要使用 Application.Run,但还需要使用宏所在的工作簿名称,否则 VBA 将不知道它应该在哪里查找宏:

Application.Run "'My Fancy Spreadsheet.xlsm!'MyMacro"

你的代码似乎是java。

例如,Excel使用Visual Basic。

Function excelreturnstring()
    excelreturnstring = "this is the string: hi"
End function