Вызов функции надстройки Excel в макросе

Я занимаюсь разработкой надстройки для Excel 2013, и я создал функцию в надстройке Excel, как показано ниже

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

Я использовал приведенный ниже код для вызова функции, но она выдает ошибку.

Application.Run(ExcelReturnString)

Как я могу вызвать функцию надстройки в макросе?

3 ответа

Решение

Это самая далекая вещь из прямой, но именно так вы выполняете задачу. Я собираюсь быть максимально откровенным, потому что первые два или три раза, когда я пытался это сделать, я пропустил МНОГО.

Во-первых, когда вы создаете класс, который размещает 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

Ваш код выглядит как Java.

Excel использует Visual Basic, например.

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

В дополнение к приведенному выше примечанию DaveMac, имейте в виду несколько моментов при вызове другой процедуры:

Если вы вызываете макрос из подпрограммы, которая находится в той же книге / надстройке, что и эта подпрограмма, вам не нужно использовать Application.Run. Вы можете просто позвонить, используя его имя:

MyMacro

Если вы вызываете макрос, который находится в другой книге, вам нужно использовать Application.Run, но вы также захотите использовать имя книги, в которой находится макрос, иначе VBA не будет знать, где он должен искать макрос:

Application.Run "'My Fancy Spreadsheet.xlsm!'MyMacro"
Другие вопросы по тегам