我使用的 UDF 依賴于傳遞給它的 ListObject 名稱。用戶不必知道參考表 (ListObject) 在作業簿中的位置,因為它是相當大且復雜的作業簿。出于這個原因,UDF 按名稱參考表,省略作業表的名稱,如下所示:
Set Obj = Application.Range(TableName).ListObject
只要代碼在活動作業簿中,這就能完美運行。如果另一個作業簿被激活,它不起作用。出于某種原因,當另一個作業簿被打開時,UDF 的 VBA 代碼被觸發,它失敗導致 #VALUE 輸出一直貫穿我的作業簿。我嘗試了多種方法來顯式參考串列物件,唯一有效的方法似乎是
WorkbookObject.WorksheetObject.ListObject(TableName)
但是,正如我上面提到的,我試圖避免使用作業表參考。
是否可以通過顯式參考參考非活動作業簿中的串列物件,而無需使用作業表參考?
如果沒有,在打開另一個作業簿時防止 UDF 不必要運行的最佳方法是什么?我試圖使用Application.Volatile方法強制重新計算 UDF ,但由于作業簿的大小,它大大減慢了速度。任何幫助都受到高度贊賞。
基于@BigBen 評論的澄清 因為作業簿的大部分內容在幕后進行,表的名稱不會作為顯式值傳遞,而是 UDF 接受用戶輸入(字串)并決定要呼叫的表的名稱基于這些輸入。
uj5u.com熱心網友回復:
正如 BigBen 所說,我建議將表本身作為引數傳遞給 UDF。這解決了波動性、更改活動作業表等問題。書等
=SumTable(Table1)
該引數應定義為范圍。如果您需要實際獲取 ListObject,則可以從 Range 中獲取
Function SumTable(MyTable As Range)
Dim oBj As ListObject
Set oBj = MyTable.ListObject
SumTable = oBj.Name
End Function
uj5u.com熱心網友回復:
您可以創建一個函式來ThisWorkbook根據串列的名稱從 回傳所需的串列物件:
Set Obj = GetListObject(TableName)
功能:
Function GetListObject(loName As String) As ListObject
Dim ws As Worksheet, lo As ListObject
For Each ws In ThisWorkbook.Worksheets
For Each lo In ws.ListObjects
If lo.Name = loName Then
Set GetListObject = lo
Exit Function
End If
Next lo
Next ws
End Function
uj5u.com熱心網友回復:
您可以在 UDF 函式中使用Application.ThisCell來獲取正在呼叫的當前單元格。從此資訊中,您可以提取當前的作業簿或作業表。
這將回傳呼叫作業表:
Application.ThisCell.Worksheet
這將回傳呼叫作業簿:
Application.ThisCell.Workbook
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/396380.html
