允許完整列引用而不會受到懲罰

如果可以將完整列引用作為引數傳入,則可以更輕鬆地在工作表上實現某些 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*])

StackOverflow 文件

雖然這是一個相當簡單的示例,但它充分展示了傳遞兩個完整的列引用(每個 1,048,576 行),但只處理了 15 行資料和條件。

由 Microsoft™提供的各種方法和屬性的官方 MSDN 文件連結。