允許完整列引用而不會受到懲罰
如果可以將完整列引用作為引數傳入,則可以更輕鬆地在工作表上實現某些 UDF。然而,由於編碼的明確性質,涉及這些範圍的任何迴圈可能正在處理完全為空的數十萬個單元。這會將你的 VBA 專案(和工作簿)減少到凍結的混亂,同時處理不必要的非值。
迴圈通過工作表的單元格是完成任務的最慢方法之一,但有時它是不可避免的。將執行的工作削減到實際需要的工作是完美的。
解決方案是使用 Intersect 方法截斷 Worksheet.UsedRange 屬性的完整列或完整行引用。下面的示例將鬆散的複製工作表的本地 SUMIF 函式,因此標準範圍也將被調整到適合的 sum_range 因為在每個值加總範圍必須由一個值陪伴標準範圍。 ** ** ** **
工作表上使用的 UDF 的 Application.Caller 是它所在的單元格。單元格的 .Parent 屬性是工作表。這將用於定義 .UsedRange。
在模組程式碼表中:
Option Explicit
Function udfMySumIf(rngA As Range, rngB As Range, _
Optional crit As Variant = "yes")
Dim c As Long, ttl As Double
With Application.Caller.Parent
Set rngA = Intersect(rngA, .UsedRange)
Set rngB = rngB.Resize(rngA.Rows.Count, rngA.Columns.Count)
End With
For c = 1 To rngA.Cells.Count
If IsNumeric(rngA.Cells(c).Value2) Then
If LCase(rngB(c).Value2) = LCase(crit) Then
ttl = ttl + rngA.Cells(c).Value2
End If
End If
Next c
udfMySumIf = ttl
End Function
語法:
=udfMySumIf(*sum_range*, *criteria_range*, [*criteria*])
雖然這是一個相當簡單的示例,但它充分展示了傳遞兩個完整的列引用(每個 1,048,576 行),但只處理了 15 行資料和條件。
由 Microsoft™提供的各種方法和屬性的官方 MSDN 文件連結。