Я разрабатываю надстройку для Excel 2013, и я создал функцию в надстройке Excel, как показано ниже.
public string ExcelReturnString()
{
return "This is the string: hi";
}
Я использовал ниже код для вызова функции, но он выдает ошибку.
Application.Run(ExcelReturnString)
Как я могу вызвать функцию надстройки в макросе?
Речь идет о самой далекой от прямолинейности, но именно так вы выполняете задачу. Я собираюсь быть настолько явным, насколько это возможно, потому что первые два или три раза я пытался это сделать, я пропустил много.
Во-первых, когда вы создаете класс, в котором размещается 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
В дополнение к примечанию DaveMac выше, также помните о нескольких моментах при вызове другой процедуры:
Если вы вызываете макрос из процедуры, которая находится в той же книге /addin, что и в этой рутине, вам не нужно использовать 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