Vba 如何从子函数调用填充范围变量?

Vba 如何从子函数调用填充范围变量?,vba,excel,Vba,Excel,我正在尝试使此sub正常工作,但未分配operationalRange变量。尽管函数selectBodyRow(bodyName)工作正常 Sub sortRows(bodyName As String, ByRef wksht As Worksheet) Dim operationalRange As Range Set operationalRange = selectBodyRow(bodyName) Debug.Print "Sorting Worksheet: " &

我正在尝试使此sub正常工作,但未分配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
上述子系统调用的子系统为:

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
函数选择BodyRow(bodyName作为字符串)作为范围
Dim rangeStart作为字符串,rangeEnd作为字符串
Dim选择开始作为范围,选择结束作为范围
Dim结果作为范围,srchRng作为范围,cngrs作为变量
如果bodyName=“WEST”,则
rangeStart=“”
rangeEnd=“”
ElseIf bodyName=“东”然后
rangeStart=“”
rangeEnd=“”
如果结束
设置srchRng=范围(“A:A”)
srchRng.Select
设置selectionStart=srchRng.Find(What:=rangeStart,After:=ActiveCell,LookIn_
:=xlValues,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=_
xlNext,MatchCase:=False,SearchFormat:=False)
设置selectionEnd=srchRng.Find(What:=rangeEnd,After:=ActiveCell,LookIn_
:=xlValues,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=_
xlNext,MatchCase:=False,SearchFormat:=False)
设置结果=范围(selectionStart.Offset(1,0),selectionEnd.Offset(-1,0))
result.EntireRow.Select
端函数

按照路人的建议,尝试将您的功能设置为一个范围

    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
函数选择BodyRow(bodyName作为字符串)作为范围
Dim rangeStart作为字符串,rangeEnd作为字符串
Dim选择开始作为范围,选择结束作为范围
Dim结果作为范围,srchRng作为范围,cngrs作为变量
如果bodyName=“WEST”,则
rangeStart=“”
rangeEnd=“”
ElseIf bodyName=“东”然后
rangeStart=“”
rangeEnd=“”
如果结束
设置srchRng=范围(“A:A”)
srchRng.Select
设置selectionStart=srchRng.Find(What:=rangeStart,After:=ActiveCell,LookIn_
:=xlValues,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=_
xlNext,MatchCase:=False,SearchFormat:=False)
设置selectionEnd=srchRng.Find(What:=rangeEnd,After:=ActiveCell,LookIn_
:=xlValues,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=_
xlNext,MatchCase:=False,SearchFormat:=False)
设置结果=范围(selectionStart.Offset(1,0),selectionEnd.Offset(-1,0))
result.EntireRow.Select
设置selectBodyRow=结果
'或设置selectBodyRow=result.entirerow
端函数

您必须在
selectBodyRow
中返回一些内容。正确的语法是什么?Return似乎是为错误保留的。明白了。谢谢我知道这些都是基本问题。在过去的两周里,我一直在通过反复试验来自学VBA。祝你好运,这就是我15年来一直在做的事情。听起来很痛苦。