Возвращаемое значение из функции Excel VBA всегда равно нулю - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь запустить макрос Excel VBA и получить результат, но я всегда получаю нулевое значение (извините, я не знаю, я новичок в этом макросе)

макрос

Public Function TestMacro() As Boolean
    If Len(Range("A1").Value) <> 9 Then
        TestMacro = False
    Else
        TestMacro = True
    End If
End Function

вызывающий код c #

Excel.Application excelApp = new Excel.Application { DisplayAlerts = false };
object misValue = Missing.Value;
excelApp.Visible = false;
Excel.Workbook ExcelWorkBook = excelApp.Workbooks.Open(filePath);
try
{
    var result = excelApp.Run("Sheet1.TestMacro");
    ExcelWorkBook.Close(false, misValue, misValue);
}
catch (Exception e)
{
    Console.WriteLine(e);
}
finally
{
    excelApp.Quit();
    if (ExcelWorkBook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorkBook); }
    if (excelApp != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); }
}

1 Ответ

0 голосов
/ 12 мая 2019

Функция, которая будет использоваться в качестве пользовательской функции (UDF), должна быть в модуле , а не в объекте рабочей книги (например, в рабочей таблице).

Кроме того, пока она отображаетсявозможно, ваш UDF не должен вызывать какого-либо взаимодействия с пользователем (например, MessageBox).Помните, что ваши пользовательские функции могут быть пересчитаны на любом этапе (хорошо, с хорошо понятными и иногда менее понятными триггерами), и вы не хотите, чтобы ваш пользователь был завален окнами сообщений в кажущемся бесконечном цикле (например, попробуйте установить окно сообщения в пользовательской функции).затем он реплицируется на 1000 ячеек!)

Когда я выполняю кодирование VBA, я создаю модель с именем (образно!) «UDF», в которой я храню все свои UDF.Это облегчает мне понимание того, какие функции являются частью внутреннего кода, и какие функции специально предназначены для использования во внешнем интерфейсе.

Суть в том, что UDF представляет функцию - простуювходы и только один выход.Следующий модуль должен быть помещен в модуль:

Option Explicit

Public Function TestMacro(inputcell as range) As Boolean
    If Len(inputcell.Value) <> 9 Then
        TestMacro = False
    Else
        TestMacro = True
    End If
End Function

В ячейке (не A1, той, в которой вы хотите получить результаты):

=TestMacro(A1)

Вы можете сделать несколько более сложныхвещи, и включают дополнительную проверку ошибок и возвращают ошибки Excel, такие как #Value, #Ref, #Name - но это вопрос для другого дня.

...