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

3

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

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

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

Application.Run(ExcelReturnString)

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

Теги:
excel-vba
excel
excel-addins

3 ответа

6
Лучший ответ

Речь идет о самой далекой от прямолинейности, но именно так вы выполняете задачу. Я собираюсь быть настолько явным, насколько это возможно, потому что первые два или три раза я пытался это сделать, я пропустил много.

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

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

  • 0
    Спасибо Хамбоне за ваш ответ. Это мне очень помогло.
0

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

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

MyMacro

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

Application.Run "'My Fancy Spreadsheet.xlsm!'MyMacro"
  • 1
    Не для того, чтобы победить эту мертвую лошадь, но метод находится в надстройке COM, а не в проекте VBA ...
-2

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

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

Function excelreturnstring()
    excelreturnstring = "this is the string: hi"
End function
  • 0
    ОП говорил о надстройке, которая в данном случае выглядит как C #. Фактический метод был тривиальным, чтобы продемонстрировать, что он не может получить доступ к методам надстроек из VBA - я не думаю, что он действительно хотел знать, как кодировать эту конкретную функцию в VBA

Ещё вопросы

Сообщество Overcoder
Наверх
Меню