編輯爲清楚起見,現在該解決方案已被確定UDF參照命名錶錯誤時,另一個工作簿是活動
我是一個新手VBA建立一個UDF。該UDF涉及多個引用Excel表格上其他工作表工作簿VLOOKUP功能,如:
Twirecol = Application.WorksheetFunction.VLookup(i, Range("iterationtable"), 2, False)
麻煩的是,如果另一工作簿是活動的,當Excel重新計算公式返回#VALUE錯誤。
我看到很多關於如何引用VBA和UDF中的其他工作簿和工作表的解決方案,但我不知道如何適當地限制這些表對象,以便他們保持專注於UDF所在的工作簿。請注意,我正在尋找一個解決方案,不會取決於工作表名稱或工作簿文件名或路徑,因爲所有這些可能隨時間而改變。
這是我對這個工作簿的名稱經理:Names Manager
這裏是整個UDF代碼:
Public Function voltagedrop(trenchlength As Integer, intlength As Integer) As String
Application.Volatile
Dim TLX As Integer
Dim ILX As Integer
Dim TVD As Single
Dim IVD As Single
Dim VD As Single
Dim Twirecol As Integer
Dim Iwirecol As Integer
Dim i As Integer
' Extended length variables account for extra length at end of strings
TLX = trenchlength + 10
ILX = intlength + 10
i = 0
Do
i = i + 1
Twirecol = Application.WorksheetFunction.VLookup(i, Range("iterationtable"), 2, False)
Iwirecol = Application.WorksheetFunction.VLookup(i, Range("iterationtable"), 3, False)
' Calculate voltage drops
TVD = Application.WorksheetFunction.VLookup(TLX, Range("trenchtable"), Twirecol, False)
IVD = Application.WorksheetFunction.VLookup(ILX, Range("inttable"), Iwirecol, False)
VD = TVD + IVD
Loop Until VD < 0.025
VD = 100 * Round(VD, 4)
voltagedrop = Application.WorksheetFunction.VLookup(i, Range("iterationtable"), 4, False) & ": " & VD & "%"
End Function
解決方案(感謝@DavidZemens)
(*大衛的完整的答案是下面,這是我的總結)
如果這一直是一個傳統命名的區域,而不是一個表,我可以叫的範圍內,像這樣:
Twirecol = Application.WorksheetFunction.VLookup(i, ThisWorkbook.Names("iterationtable").RefersToRange, 2, False)
但是,由於錶行爲不同於指定範圍(儘管同樣顯示在名稱管理器上) ,我需要調用這樣的範圍內:
Twirecol = Application.WorksheetFunction.VLookup(i, ThisWorkbook.Worksheets("Background Tables").ListObjects("iterationtable").Range, 2, False)
然而,我的理想解決方案,避免了命名錶可言,如果在今後的工作表名稱的變化,因此它被證實了,我可以用牀單CodeName
相反(在我的情況下爲sheet1
):
Twirecol = Application.WorksheetFunction.VLookup(i, Sheet1.ListObjects("iterationtable").Range, 2, False)
我在爲簡單起見,此示例代碼直接認定的範圍內,但每大衛的建議,我最終的代碼沒有使用一組變量的範圍。
有什麼功能的其餘部分之前正確的工作簿?雖然是的,但你最後的猜測是正確的。您應該在範圍之前添加工作表(和/或工作簿,如果您有多個打開的),例如'... Vlookup(i,工作表(「Sheet1」)。範圍(「迭代表」),...' – BruceWayne
Thanks @ BruceWayne編輯原始文章以包含整個代碼當工作簿處於活動狀態時工作良好... thisworkbook.range(「iterationtable」)不起作用......而是它給了我一個「編譯錯誤:方法或數據成員沒有找到「 –
另外,關於工作表名稱,我試圖保持這個函數儘可能通用,以便由不太熟悉VBA的同事做出的未來修改不會意外地破壞它,包括避免引用表單是否有理由識別工作表,考慮到範圍的命名? –