2016-11-12 2 views
0

Excel 테이블이 있는데, 시트에 "CR"값이있는 모든 행 (헤더 행 제외)을 원합니다 (가능한 경우 수식 제외). A 열 수식))은 파일이 저장되기 전에 B 열 (name = TEAM), C (name = BUILDING) 및 마지막 D (name = DATE_MAJ)에 의해 먼저 정렬됩니다.여러 열의 Excel 정렬 VBA

나는 VBA의 절대적인 멍청한 놈이다. 그래서 나는 포럼에서 좌, 우로 찾아내는 것을 시도하고있다. 주변 검색에서, 나는 엑셀 VBA 개체 '통합 문서'에서이 코드를 시도했지만 오류 제공합니다

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
'Setup column names 
Col1name = "SECTION" 
Col2name = "BATIMENT" 
Col3name = "DATE_MAJ" 

'Find cols 
For Each cell In Range("A1:" & Range("A1").End(xlToRight).Address) 
    If cell.Value = Col1name Then 
     Col1 = cell.Column 
    End If 
    If cell.Value = Col2name Then 
     Col2 = cell.Column 
    End If 
    If cell.Value = Col3name Then 
     Col3 = cell.Column 
    End If 

Next 

'Below two line:- if they are blank e.g. column not found it will error so a small bit of error handling 
If Col1 = "" Then Exit Sub 
If Col2 = "" Then Exit Sub 
If Col3 = "" Then Exit Sub 

'Find last row - dynamic part 
lastrow = ActiveSheet.Range("A100000").End(xlUp).Row 

'Convert col numer to name 
Col1 = Split(Cells(1, Col1).Address(True, False), "$") 
Col2 = Split(Cells(1, Col2).Address(True, False), "$") 
Col3 = Split(Cells(1, Col3).Address(True, False), "$") 

'Sort 
With ActiveSheet.Sort 
    .SortFields.Clear 
    .SortFields.Add Key:=Range(Col1(0) & "2:" & Col1(0) & lastrow) _ 
     , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    .SortFields.Add Key:=Range(Col2(0) & "2:" & Col2(0) & lastrow) _ 
     , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    .SortFields.Add Key:=Range(Col3(0) & "2:" & Col3(0) & lastrow) _ 
     , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 

    .SetRange Range("A1:K" & lastrow) 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 
End Sub 

내가 코드 권리를 얻기에 어떤 도움을 감사하게 될 거라고합니다. 아래는 Excel 파일에 대한 링크입니다 (위의 코드는 작동하지 않았으므로 제거했습니다). 당신은 단지 세 개의 정렬 열을 가지고 있기 때문에

Dropbox link to Excel file

+0

어떤 오류가 발생합니까? 어떤 라인이 그것을 던집니까? 또한 연결된 예제에는 "BATIMENT"와 "DATE_MAJ"둘 다 이름이 지정된 열 머리글이 없습니다. – user3598756

+0

열 C와 D의 열 이름은 "BATIMENT"와 "DATE_MAJ"입니다. 그들의 헤더는 실제로 "BUILDING"과 "DATE ​​UPDATE"입니다. 그게 중요합니까? – Antoon

+0

내가 얻는 오류는 '컴파일 오류 : 변수가 정의되지 않음'이며 'Col1name'이 VBA 코드에서 선택되었습니다. – Antoon

답변

2

대신 Worksheet 개체의 이름을 딴 방법을, Range 개체의 Sort() 방법을 사용할 수 있습니다

링크 된 엑셀 파일 당신이 수에 따라

또한 가정 열 헤더 이것을 시도하십시오 :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim col1 As Range, col2 As Range, col3 As Range 
    Dim lastRow As Long 

    'Setup column names 
    Const col1Name As String = "SECTION" 
    Const col2Name As String = "BUILDING" '"BATIMENT" 
    Const col3Name As String = "DATE UPDATE" '"DATE_MAJ" 

    With Worksheets("CR") '<--| reference your worksheet 
     'Find last row - dynamic part 
     lastRow = .Cells(.Rows.Count, 1).End(xlUp).row ' <--|find its column "A" last not empty row index 
     'Find cols 
     With .Range("A1", .Cells(1, .Columns.Count).End(xlToLeft)) '<--|reference its row 1 cells from column 1 to last not empty one and search for sorting columns whose header matches above set column names 
      If Not TryGetColumnIndex(.Cells, col1Name, col1) Then Exit Sub '<--| if 1st sorting column not found then exit sub 
      If Not TryGetColumnIndex(.Cells, col2Name, col2) Then Exit Sub '<--| if 2nd sorting column not found then exit sub 
      If Not TryGetColumnIndex(.Cells, col3Name, col3) Then Exit Sub '<--| if 3rd sorting column not found then exit sub 
      .Resize(lastRow).Sort _ 
          key1:=col1, order1:=xlAscending, DataOption1:=xlSortNormal, _ 
          key2:=col2, order2:=xlAscending, DataOption2:=xlSortNormal, _ 
          key3:=col3, order3:=xlAscending, DataOption3:=xlSortNormal, _ 
          Header:=xlYes, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin 
     End With 
    End With 
End Sub 

Function TryGetColumnIndex(rng As Range, colName As String, col As Range) As Boolean 
    Set col = rng.Find(What:=colName, LookIn:=xlValues, LookAt:=xlWhole) 
    TryGetColumnIndex = Not col Is Nothing 
End Function 
+0

고마워요,하지만 그 코드는 다음과 같습니다 : 런타임 오류 '438': 개체가이 속성 또는 메서드를 지원하지 않습니다. 'debug'를 클릭하면 다음 행이 강조 표시됩니다. lastRow = .Cells (.Rows.Count, 1) .End (xlUp) .rowrow '<- | 마지막으로 비어 있지 않은 행 색인 – Antoon

+0

오류 ? 어떤 라인이 그것을 던지고 있습니까? – user3598756

+0

'ThisWorkbook'개체에 코드를 붙여 넣었습니다. 나는 그것이 맞다고 생각한다? – Antoon