Excel VBA 函数的返回值始终为空
Returning value from Excel VBA function is always null
我正在尝试 运行 excel vba 宏并返回结果,但我总是返回 null(原谅我的无知,我是这个宏的新手)
宏
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); }
}
用作 UDF(用户定义函数)的函数必须在 模块 中,而不是工作簿对象(如工作表)。
此外,虽然看起来可能,但您的 UDF 不应触发任何用户交互(例如 MessageBox)。请记住,您的 UDF 可以在任何阶段重新计算(好吧,使用很好理解的触发器,有时不太了解触发器)并且您不希望您的用户在明显的无限循环中被消息框淹没(例如,尝试在 UDF 中使用消息框然后在 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)
您可以做一些更复杂的事情,包括额外的错误检查和 return Excel 错误,例如 #Value
、#Ref
、#Name
-但这是另一天的问题。
我正在尝试 运行 excel vba 宏并返回结果,但我总是返回 null(原谅我的无知,我是这个宏的新手)
宏
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); }
}
用作 UDF(用户定义函数)的函数必须在 模块 中,而不是工作簿对象(如工作表)。
此外,虽然看起来可能,但您的 UDF 不应触发任何用户交互(例如 MessageBox)。请记住,您的 UDF 可以在任何阶段重新计算(好吧,使用很好理解的触发器,有时不太了解触发器)并且您不希望您的用户在明显的无限循环中被消息框淹没(例如,尝试在 UDF 中使用消息框然后在 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)
您可以做一些更复杂的事情,包括额外的错误检查和 return Excel 错误,例如 #Value
、#Ref
、#Name
-但这是另一天的问题。