2016-03-10 5 views
1

Я работаю над проектом, который имеет таблицу данных с 10 столбцами и переменным количеством строк. Первый заголовок «A» - это «Случай», а входы в этом столбце не сортируются. У меня есть столбец «X», который имеет входы в правильном порядке. Столбцы 'B' thru 'J' основаны на столбце «A». Я ищу способ сортировки столбца «A» на основе столбца «X».Сортировка таблицы excel на основе 1 колонки

вход выглядит следующим образом, например:

C4 
C1 
C11 
W36 
W39 
C21 

И это должно выглядеть следующим образом:

W36 
W39 
C1 
C4 
C11 
C21 

Любая помощь с кодом VBA было бы полезно. Я довольно новичок в программировании.

+0

Зв Многие. Без ответа. Вопросов. – Jeeped

ответ

0

Попробуйте это:

Sub SortData()

Range("A:X").Select 'Your Data range 
ActiveWorkbook.Worksheets("Your sheet name").Sort.SortFields.Clear 
ActiveWorkbook.Worksheets("Your sheet name").Sort.SortFields.Add Key:=Range("Sorting range IE: X:X"), _ 
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 
With ActiveWorkbook.Worksheets("Your sheet name").Sort 
    .SetRange Range("A:X") 'Your data range 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

End Sub

Вы должны заменить диапазоны с вашим собственным.

1

Вам придется принести значения таблиц в массив, выполнить выборочную сортировку в памяти, разделив алфавитные символы от числовых символов в столбце A (предыдущий спуск, последний по возрастанию).

Sub sortVals() 
    Dim srt As Variant, tmp As Variant 
    Dim x As Long, a As Long, s As Long 

    With Worksheets("Sheet2") 
     With .Cells(1, 1).CurrentRegion 
      'grab values from primary key column 
      With .Resize(.Rows.Count - 1, 10).Offset(1, 0) 
       srt = .Cells.Value2 
      End With 

      'perform custom sort on array 
      For s = LBound(srt, 1) + 1 To UBound(srt, 1) 
       For a = LBound(srt, 1) To UBound(srt, 1) 
        If Asc(srt(s, 1)) > Asc(srt(a, 1)) Or _ 
         Int(Mid(srt(s, 1), 2)) < Int(Mid(srt(a, 1), 2)) Then 
         ReDim tmp(1 To 1, LBound(srt, 2) To UBound(srt, 2)) 
         For x = LBound(tmp, 2) To UBound(tmp, 2) 
          tmp(1, x) = srt(a, x) 
          srt(a, x) = srt(s, x) 
          srt(s, x) = tmp(1, x) 
         Next x 
        End If 
       Next a 
      Next s 

      'dump the values back into the worksheet 
      With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0) 
       .Cells(1).Resize(UBound(srt, 1), UBound(srt, 2)) = srt 
      End With 

     End With 
    End With 
End Sub 

custom_sort_before
Примеры данных до того, пользовательские сортировки обычных данных

custom_sort_after
образца после сортировки пользовательских рутинную

Смежные вопросы