0

Excel で VBA を使用するのは久しぶりです。

シートの各列の内容をアルファベット順に並べたい。

これは私が持っているものです:

Range("A1").Select
    Range("A1:A19").Select
    ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet2").Sort
        .SetRange Range("A1:A19")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("B1").Select
End Sub

範囲がアクティブである限り、これを for ループにするにはどうすればよいですか?

4

2 に答える 2

1

このような?

Option Explicit

Sub sample()
    Dim i As Long

    With Sheets("Sheet1")
        For i = 1 To .UsedRange.Columns.Count
            .Columns(i).Sort Key1:=.Cells(1, i), Order1:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
        Next i
    End With
End Sub
于 2012-06-15T02:37:25.687 に答える
0

どうぞ。このコードは、データが何らかのタイプのテーブル形式で配置されていることを前提としています。また、列全体(空白などを含む)をソートすることを前提としています。範囲をより具体的にしたい場合、またはハードリファレンスで設定したい場合は、コメントしたコードを調整してください。

Sub sortRange()

Dim wks As Worksheet
Dim loopRange As Range, sortRange As Range

Set wks = Worksheets("Sheet1")

With wks

    'can change the range to be looped, but if you do, only include 1 row of the range
    Set loopRange = Intersect(.UsedRange, .UsedRange.Rows(1))

    For Each cel In loopRange

        Set sortRange = Intersect(cel.EntireColumn, .UsedRange)

        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=sortRange
            .SetRange sortRange
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With

    Next

End With

End Sub
于 2012-06-14T22:09:54.370 に答える