2017-12-29 19 views
0

Excelシートを姓名で並べ替えようとしていますが、複数のマクロを1つのボタンに割り当てることが可能かどうかは疑問でした。一度クリックすると、名前で分類されます。再度クリックすると、姓でソートされます。これは可能ですか?私は同様の質問を見つけることができなかったので、私は尋ねました。複数の機能を持つマクロボタンを作成していますか?

は、ここで明らかに他のコードが似ていますが、代わりに、昇順で降順に私のコード

 Columns ("D:D").Select 
     ActiveWorkbook.Worksheets(Sheet1") .Sort.SortFields.clear 
    ActiveWorkbook.Worksheets(Sheet1") .Sort.SortFields.Add Key:=Range("D1"), 
    Sorton::x=SortOnValues, Order:=xlDesending, DataOption:=xlSortNormal 
    with ActiveWorkbook.Worksheets("sheet1") .Sort 
    .SetRange Range("A1:K505") 
    Header = X1No 
    .MatchCase = False 
    .Orientation = x1TopToBottom 
    .SortMethod = x1PinYin 
    .Apply 

    End With 
    ActiveWindow.SmallScroll Down:=-495 

    End Sub 

です。

+0

マクロやボタンを必要としない場合もあります。データをExcelテーブルとしてフォーマットする場合(Home - > Format as Table)、フィルタボタンを使用してカラムを直接ソートできます。 独立したコントロール(マクロボタンなど)を必要とするアプリケーションを構築する場合、必要に応じて行や列を動的に追加/削除できるように、テーブル構造を使用することができます。私は個人的にListObjects(テーブルがVBAでどのように表現されているか)と範囲を比較することを好みます。特に、名前で列にアクセスし、データや構造を操作しやすくなります... –

答えて

2

ステートのグローバル変数を設定して、ボタンにバインドされたマクロを異なるものにするように切り替えることができます。

' global state variable 
Dim State As Boolean 

Private Sub Workbook_Open() 
    ' initialize state 
    State = True 
End Sub 

Sub mymacro() 
    If State Then 
     ' do stuff 1 
    Else 
     ' do stuff 2 
    End If 

    ' toggle state 
    State = Not State 
End Sub 
0

ワンボタンは一つだけマクロを実行することができます(これは、ボタンの機能は、すべてのクリック後に切り替えたいと仮定しています)。ただし、現在の選択に応じて、マクロに異なる処理をさせることもできます。たとえば、ユーザがName列のセルを選択した場合、名前の昇順でソートが行われ、選択肢が別の列にある場合は、名前の降順でソートが行われます。

以下のコードは、ソートキーとソート順の両方を選択肢に関連して設定します。したがって、2つの異なるマクロは必要ありません。

Sub SortByColumn() 

    Dim Ws As Worksheet 
    Dim Clm As Long 
    Dim SortOrder As XlSortOrder 

    With Selection 
     Set Ws = .Worksheet 
     Clm = .Column 
     If Clm = 4 Then    ' column #4 = column D 
      SortOrder = xlDescending 
     Else 
      ' sort on column 1 by default 
      Clm = 1     ' column #1 = column A 
      SortOrder = xlAscending 
     End If 
    End With 

    With Ws.Sort 
     With .SortFields 
      .Clear 
      .Add Key:=Ws.Cells(1, Clm), _ 
       Sorton:=xlSortOnValues, _ 
       Order:=SortOrder, _ 
       DataOption:=xlSortNormal 
     End With 

     .SetRange Ws.Range("A1:K505") 
     .Header = X1No 
     .MatchCase = False 
     .Orientation = x1TopToBottom 
     .SortMethod = x1PinYin 
     .Apply 
    End With 

    ActiveWindow.SmallScroll Down:=-495 
End Sub 

ソートアクションでは何も選択する必要はありません。

関連する問題