函数中的Excel VBA加载工作表

我正在尝试编写一个函数来查找外部工作表的第一行。 我可以做一个子,但它不是作为一个function。 可以这样做。

目前我正在使用

Function GetLine(fileName As String) As Boolean GetLine = 0 Dim loadBook As Workbook If loadBook = Application.Workbooks.Open(fileName) Then GetLine = True Else GetLine = False End If end function 

我得到#value的回报。 我认为这是因为加载工作簿时出错。

请指教,谢谢。

这是正确的,执行用户定义的函数有一定的局限性。 在UDF内部执行所需操作的技巧寥寥无几,不会违反订单。

1.通过后期绑定获取Excel.Application的另一个实例 ,打开工作簿,通过​​参考实例执行所有必要的计算。 精确地引用创build的实例是非常重要的,所以一些嵌套的With ... End With语句或者额外的语法,例如.Cells() .Sheets()可能看起来不正常。 有一个UDF示例如何从closures的文件获取工作表上的第一行:

 Function GetFirstRowLbind(FileName, SheetName) ' UDF function that calculates value, works with certain limitations On Error Resume Next With CreateObject("Excel.Application") ' late binding .Workbooks.Open (FileName) GetFirstRowLbind = .Sheets(SheetName).UsedRange.Row .Quit End With End Function 

OERN只用于跳过错误的文件和其他错误,以便.Quit语句肯定执行,以防止内存泄漏,否则启动的Excel进程将保留在每个表重新调用和UDF调用后的内存。

2.实现一些UDF,通过调度扩展到另一个过程,在UDF完成之后应该执行的操作,基于表recalc事件执行。 这种方式更加复杂,难以debugging,但是更加灵活,并且有机会在UDF中执行更多的“内部”操作,例如更改相邻单元,甚至整个应用程序中的任何可访问的数据。 计划示例:

将代码放置到VBAProject的一个模块中:

 Public Tasks, Permit, Transfer Function GetFirstRowSched(FileName, SheetName) ' UDF function, schedules filling this UDF cell with a value after all UDFs to be completed If IsEmpty(Tasks) Then TasksInit If Permit Then Tasks.Add Application.Caller, Array(FileName, SheetName) ' pack arguments to array, the dictionary key is actually this cell object GetFirstRowSched = Transfer End Function Sub TasksInit() ' function for initial setting values Set Tasks = CreateObject("Scripting.Dictionary") Transfer = "" Permit = True End Sub Function GetFirstRowConv(FileName, SheetName) ' function that actually calculates the value, runs without UDF limitations like an usual function With Application.Workbooks.Open(FileName) GetFirstRowConv = .Sheets(SheetName).UsedRange.Row .Close End With End Function 

将代码放在VBAProject中Microsoft Excel对象的ThisWorkbook部分:

 Private Sub Workbook_SheetCalculate(ByVal Sh As Object) ' sheets recalc event that perform all scheduled calls, puts data to each of UDFs cells Dim Task, TempFormula If IsEmpty(Tasks) Then TasksInit Application.EnableEvents = False Permit = False For Each Task In Tasks ' cycle trough all stored cell objects TempFormula = Task.FormulaR1C1 Transfer = GetFirstRowConv(Tasks(Task)(0), Tasks(Task)(1)) ' unpack arguments from array to perform calculations Task.FormulaR1C1 = TempFormula Tasks.Remove Task Next Application.EnableEvents = True Transfer = "" Permit = True End Sub 

如果从单元中调用UDF ,则只能向该单元返回一个值。 它不能打开另一个工作簿