2

範囲の最初の部分を Range("A:A") として設定した場合、行全体が確実にソートに渡されるようにするにはどうすればよいですか?

データ ID、fname、mname、lname、接尾辞、状態、場所、タイムゾーン

範囲は、開始点と終了点の id を検索することによって選択されます。したがって、Range は、あるシートでは A1:183 であり、別のシートでは A1:A1138 である可能性があります。また、列は G または H で終了します。データにはまだ「マッサージ」が必要です

各シートで D(lname) と B(fname) で並べ替えており、残りの列を含めたいので、データの整合性が維持されます。

これまでのところ、範囲を選択するサブがありますが、機能していないように見えるrng.EntireRow.Selectなしで追加の列にタグを付ける方法がわかりません。

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

Set operationalRange = selectBodyRow(bodyName).EntireRow

Debug.Print "Sorting Worksheet " & wksht.Name & " containing " & 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   ' Fails here with:
               ' Runtime Error '1004':
               ' The sort reference is not valid. Make sure that it's within the data
               ' you want to sort, and the first Sort By box isn't the same or blank.
    End With
End Sub
4

1 に答える 1

1

範囲を構築するには、最後の行と最後の列を見つける必要があります。

例えば

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim LRow As Long, LCol As Long
    Dim rng As Range

    '~~> Change this with thee relevant sheet name
    Set ws = ThisWorkbook.Sheets("Sheet1")

    '~~> Get Last Row and Last Column
    LRow = LastRow(ws)
    LCol = LastColumn(ws)

    With ws
        '~~> Define your range
        Set rng = .Range("A1:" & ReturnName(LCol) & LRow)

        Debug.Print rng.Address
    End With
End Sub

'~~> Function to get last row
Public Function LastRow(Optional wks As Worksheet) As Long
If wks Is Nothing Then Set wks = ActiveSheet
LastRow = wks.Cells.Find(What:="*", _
    After:=wks.Range("A1"), _
    Lookat:=xlPart, _
    LookIn:=xlFormulas, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlPrevious, _
    MatchCase:=False).Row
End Function

'~~> Function to get last column
Public Function LastColumn(Optional wks As Worksheet) As Long
If wks Is Nothing Then Set wks = ActiveSheet
LastColumn = wks.Cells.Find(What:="*", _
    After:=wks.Range("A1"), _
    Lookat:=xlPart, _
    LookIn:=xlFormulas, _
    SearchOrder:=xlByColumns, _
    SearchDirection:=xlPrevious, _
    MatchCase:=False).Column
End Function

'~~> Function to get the Column name from Column Number
Function ReturnName(ByVal num As Integer) As String
    ReturnName = Split(Cells(, num).Address, "$")(1)
End Function
于 2012-09-27T05:37:44.407 に答える