如何从Sub / Function调用填充Range变量?

时间:2012-09-27 03:35:30

标签: excel vba excel-vba

我试图让这个子工作,但是没有分配operationalRange变量。尽管函数selectBodyRow(bodyName)工作正常。

Sub sortRows(bodyName As String, ByRef wksht As Worksheet)
  Dim operationalRange As Range

  Set operationalRange = selectBodyRow(bodyName)


  Debug.Print "Sorting Worksheet: " & wksht.Name

  If Not operationalRange Is Nothing Then
    operationalRange.Select
    Debug.Print "Sorting " & operationalRange.Count & "Rows."
    ActiveWorkbook.Worksheets(wksht.Name).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(wksht.Name).Sort.SortFields.Add Key:=operationalRange, _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets(wksht.Name).Sort.SortFields.Add Key:=operationalRange, _
          SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(wksht.Name).Sort
          .SetRange operationalRange
          .Header = xlGuess
          .MatchCase = False
          .Orientation = xlTopToBottom
          .SortMethod = xlPinYin
          .Apply
    End With
  Else
   MsgBox "Body is not being Set"
  End If
End Sub

上述Sub调用的Sub是:

Function selectBodyRow(bodyName As String) As Range
Dim rangeStart As String, rangeEnd As String
Dim selectionStart As Range, selectionEnd As Range
Dim result As Range, srchRng As Range, cngrs As Variant

If bodyName = "WEST" Then
    rangeStart = "<-WEST START->"
    rangeEnd = "<-WEST END->"
ElseIf bodyName = "EAST" Then
    rangeStart = "<-EAST START->"
    rangeEnd = "<-EAST END->"
End If

Set srchRng = Range("A:A")
srchRng.Select

Set selectionStart = srchRng.Find(What:=rangeStart, After:=ActiveCell, LookIn _
        :=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
       xlNext, MatchCase:=False, SearchFormat:=False)

Set selectionEnd = srchRng.Find(What:=rangeEnd, After:=ActiveCell, LookIn _
        :=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
       xlNext, MatchCase:=False, SearchFormat:=False)

Set result = Range(selectionStart.Offset(1, 0), selectionEnd.Offset(-1, 0))
result.EntireRow.Select
End Function

1 个答案:

答案 0 :(得分:2)

按照Passerby的建议,尝试将您的功能设置为范围

    set selectBodyRow=result

如:

Function selectBodyRow(bodyName As String) As Range
Dim rangeStart As String, rangeEnd As String
Dim selectionStart As Range, selectionEnd As Range
Dim result As Range, srchRng As Range, cngrs As Variant

If bodyName = "WEST" Then
    rangeStart = "<-WEST START->"
    rangeEnd = "<-WEST END->"
ElseIf bodyName = "EAST" Then
    rangeStart = "<-EAST START->"
    rangeEnd = "<-EAST END->"
End If

Set srchRng = Range("A:A")
srchRng.Select

Set selectionStart = srchRng.Find(What:=rangeStart, After:=ActiveCell, LookIn _
        :=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
       xlNext, MatchCase:=False, SearchFormat:=False)

Set selectionEnd = srchRng.Find(What:=rangeEnd, After:=ActiveCell, LookIn _
        :=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
       xlNext, MatchCase:=False, SearchFormat:=False)

Set result = Range(selectionStart.Offset(1, 0), selectionEnd.Offset(-1, 0))
result.EntireRow.Select

set selectBodyRow=result
'or set selectBodyRow=result.entirerow
End Function