Вызов функции надстройки 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"