2017-12-29 60 views
0

성과표를 성과 이름순으로 정렬하려고하는데 하나의 버튼에 여러 매크로를 할당 할 수 있는지 궁금합니다. 한 번 클릭하면 이름순으로 정렬됩니다. 다시 클릭하면 성으로 정렬됩니다. 이것이 가능한가? 나는 비슷한 질문을 찾을 수 없어서 물었다.여러 기능이있는 매크로 버튼 만들기?

다음은 분명히 다른 코드가 비슷하지만 대신 상승의 내림차순으로 내 코드

이름

 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 표 (홈 -> 표 형식)로 데이터 서식을 지정하면 필터 단추를 사용하여 열을 직접 정렬 할 수 있습니다. 독립적 인 컨트롤 (매크로 버튼 등)이 필요한 응용 프로그램을 작성하는 경우 테이블 구조를 사용하여 필요에 따라 행과 열을 동적으로 추가/삭제할 수 있습니다. 개인적으로 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 열에서 셀을 선택하면 오름차순으로 정렬이 수행되고 선택 항목이 다른 열에 있으면 내림차순으로 첫 번째 이름에서 정렬이 수행됩니다.

아래의 코드는 정렬 기준으로 정렬 키와 정렬 순서를 설정합니다. 따라서 두 개의 다른 매크로가 필요하지 않습니다.

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 

정렬 작업에는 아무 것도 선택할 필요가 없습니다.