2012-07-19 53 views
4

我想返回一个范围的列数,有时我需要一个范围,但有时我需要多个范围。在vba函数中的可选范围

我已经把可选范围,所以我可以选择多个范围。如果我在电子表格中未提供的函数原型中引用一个范围,我会得到#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 

在我的电子表格我在该函数的工作单元格中输入此。
=GetColoumnCount(BC34:BK34, BC35:BD35, BE35:BF35, BG35:BH35)
这打破了具有可选参数的目的。

回答

2

尝试像这样

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 
+0

@GrooverMD这个公式将双数列的重叠(即BC:BD在你的例子) - 是你的意图是什么? – brettdj 2012-07-19 04:43:24

1

如果您使用的参数,你可以提供一个可变数量的参数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) 
+0

+1高效处理各种尺寸范围输入 – brettdj 2012-07-20 04:02:14