2010-10-13 1 views
6

У меня есть следующий код VBA (который проживает в 2007 книге Excel):Доступное значение возврата из функции VBA в .NET?

Public Function Multiply(a As Double, b As Double) As Double 
    Multiply = a * b 
End Function 

Если я вызываю Multiply из другого кода VBA, он возвращает правильное значение. Однако, когда я называю Умножение C#:

var excel = new Application {Visible = true}; 
excel.Workbooks.Open(filename); 
var returned = excel.Run("Sheet1.Multiply", (Double) a, (Double) b); 

... умножение происходит (я могу проверить это, добавив трассировку функции Multiply в VBA), но возвращаемое значение не доступно в моем C# код ; returned всегда null.

Не могли бы вы рассказать мне, как получить возвращаемое значение Multiply из моего кода на C#?

+0

Я смог обойти это, изменив Multiply(), чтобы установить значение ячейки в возвращаемое значение и считывая значение этой ячейки из C#. Уродливый, но он работает. –

+0

Любая идея, почему она работает с модулем, но не с листа? – anakic

+0

Нет. Я боюсь. Я на самом деле не делал существенной работы над Microsoft с 2011 года, так что это, вероятно, будет идти без ответа, если кто-то из них не сможет помочь ... –

ответ

4

Вы пробовали двигая функцию регулярного модуля в Excel (не модуль листа)?

+0

Я создал новый модуль, переместил функцию на это и изменил «Sheet1.Multiply» на «MyModule.Multiply». Работал отлично, спасибо :-) Только один вопрос: было ли это понимание, полученное вами через опыт, или это где-то где-то документировано? Информация о MSDN и т. Д. Довольно разрежена для вызова VBA через. Interop. –

+0

@DuncanBayne 'Sheet1' является * объектом *, * экземпляром * класса Worksheet. Чтобы вызвать участников класса, вам нужен экземпляр - и экземпляр «Sheet1» живет только в среде выполнения VBA, .NET не видит его. Стандартные модули - это просто: процедурные модули, отображающие исполняемый код через публичных пользователей; вам не нужно (вы все равно не могли), чтобы * создать экземпляр *, чтобы вызвать его участников. Вот почему он работает в 'Module1', а не в' Sheet1'. –

-4

Попробуйте изменить вашу Multiply функцию, чтобы быть похожим на код ниже:

Public Function Multiply(a As Double, b As Double) As Double 
    return a * b 
End Function 
+0

Это даже не актуально VBA. См. Http://office.microsoft.com/en-in/excel-help/create-custom-functions-in-excel-2007-HA010218996.aspx –

+1

Вы не можете использовать ключевое слово return в VBA - вам нужно задайте возвращаемое значение имени функции, например Multiply = a * b, который был в исходном вопросе. – Jazza

+0

Это VB.Net, а не VBA. – Icemanind

0

Простой пример:

Испытание spreadsheet.xlsm имеет Module1 содержащий:

Public Function test() As String 
    test = "hello 1234" 
End Function 

С objExcel уже установлен в таблице ...

Dim result = objExcel.Run("Module1.test") 
MsgBox(result) 

... выдает hello 1234 во всплывающем сообщении.

Потому что я первоначально испытал это с ? module1.test()(успешно) в открывшемся окне VBA, я сначала пытался получить objExcel.Run("Module1.test()") работать - но я получаю сообщение об ошибке: Cannot run the macro .... The macro may not be available in this workbook or all macros may be disabled. - удаление скобок сделали трюк.

Смежные вопросы