vba函数中的可选范围

我试图返回一个范围的列数,有时我需要一个范围,但有时我需要多个范围。

我已经把可选范围,所以我可以select多个范围。 如果我在电子表格中没有提供的函数原型中引用一个范围,我会得到#Value! 错误。

我需要一种方法来检查可选范围是否为空,无效空等,所以我不必引用范围。

这是VBA函数原型:

Function GetColoumnCount(ARange1 As Range, Optional ARange2 As Range, Optional ARange3 As Range, Optional ARange4 As Range) As Integer Dim Result As Integer Result = 0 Result = ARange1.Columns.Count ' This works Result = ARange1.Columns.Count + ARange2.Columns.Count ' This doesn't work GetColoumnCount = Result End Function 

在我的电子表格中,我必须将其input到单元格中才能使用。
=GetColoumnCount(BC34:BK34, BC35:BD35, BE35:BF35, BG35:BH35)
这违背了可选参数的目的。

像这样尝试

 Function GetColoumnCount(ARange1 As Range, Optional ARange2 As Range, Optional ARange3 As Range, Optional ARange4 As Range) As Long Dim Result As Long Result = 0 Result = ARange1.Columns.Count ' This works If Not ARange2 Is Nothing Then Result = Result + ARange2.Columns.Count End If GetColoumnCount = Result End Function 

如果在参数中使用ParamArray关键字,则可以提供可变数量的参数。

 Public Function GetColumnCount(ParamArray Ranges() As Variant) As Long Dim lReturn As Long Dim i As Long Dim rResult As Range Dim rArea As Range 'Loop through the Ranges array supplied by ParamArray For i = LBound(Ranges) To UBound(Ranges) 'Only work with those array members that are ranges If TypeName(Ranges(i)) = "Range" Then 'Use Union to combine all the ranges If rResult Is Nothing Then Set rResult = Ranges(i) Else Set rResult = Application.Union(rResult, Ranges(i)) End If End If Next i 'Loop through the Areas and add up the columns If Not rResult Is Nothing Then For Each rArea In rResult.Areas lReturn = lReturn + rArea.Columns.Count Next rArea End If GetColumnCount = lReturn End Function 

使用:

 =getcolumncount(E2:K18) = 7 =getcolumncount(D4:L14,N4:P14) =12 (9+3) =getcolumncount(C7:F15,H7:L15,K7:N15) =11 (omits double counting overlap)