Страницы: 1
RSS
VBA сортировка диапазона
 
Доброго времени суток.
Помогите пожалуйста разобраться, как отсортировать диапазон с данными по первому столбцу в VBA так, что бы сначала были чётные номера стеллажей, а затем шли нечетные. Я не стал всю таблицу грузить, стеллажей около сотни. Система выгружает продукты на запасе в стеллажах по факту.
я начал было, а потом зашел в тупик:
Код
Sub sortstel()
Dim stel As Range
Set stel = Sheet(1).Range("A:A")
           For Each cell In stel.Cells
            If cell.Value Like "стеллаж **" Then
                s = cell.Value 'стеллаж
                a = cell.Offset(0, 1) 'артикул
                n = cell.Offset(0, 2) ' название
                k = cell.Offset(0, 3) ' количество
                ei = cell.Offset(0, 4) ' единица измерения

Помогите пожалуйста, кто знает.
 
Код
Sub SortStel()
  Dim r&, lr&
  lr = Cells(Rows.Count, 1).End(xlUp).Row
  For r = 2 To lr
    Cells(r, 6) = Val(Right(Cells(r, 1), Len(Cells(r, 1)) - 8)) Mod 2
  Next
  With ActiveSheet.Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("F2:F" & lr), SortOn:=xlSortOnValues, _
    Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("A2:A" & lr), SortOn:=xlSortOnValues, _
    Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range("A1:F" & lr): .Header = xlYes: .MatchCase = False
    .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
  End With
  Columns(6).ClearContents
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Еще вариант!
Код
Sub Test()
Dim i&, j&, cell As Range
Dim cl&, arr1(), arr2(), x%, y%, z%
i = Cells(Rows.Count, 1).End(xlUp).Row
j = Cells(1, Columns.Count).End(xlToLeft).Column
Set cell = Range(Cells(1, 1), Cells(i, j))
    cell.Sort Key1:=cell(1), order1:=xlAscending, Header:=xlYes
    For cl = j + 1 To cell.Count Step j
        Select Case Right(cell(cl).Value, 1)
            Case 1, 3, 5, 7, 9
                x = x + 1: ReDim Preserve arr1(1 To j, 1 To x)
                    For z = 0 To j - 1
                         arr1(z + 1, x) = cell(cl + z)
                    Next z
        Case 0, 2, 4, 6, 8
                y = y + 1: ReDim Preserve arr2(1 To j, 1 To y)
                    For z = 0 To j - 1
                            arr2(z + 1, y) = cell(cl + z)
                    Next z
      End Select
    Next cl
arr1 = Application.Transpose(arr1): arr2 = Application.Transpose(arr2)
Cells(UBound(arr1, 1) + 2, 1).Resize(UBound(arr2, 1), UBound(arr2, 2)) = arr2
Cells(2, 1).Resize(UBound(arr1, 1), UBound(arr1, 2)) = arr1
End Sub
Изменено: Nordheim - 21.05.2017 11:43:22
"Все гениальное просто, а все простое гениально!!!"
 
И еще вариант
Изменено: Garni - 21.05.2017 12:51:19
 
Можно и так:
Код
Private Sub CommandButton1_Click()
    Dim i As Long, a(), q: Application.ScreenUpdating = False
    a = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    For i = 1 To UBound(a, 1)
        q = Split(a(i, 1))
        If Val(q(UBound(q))) Mod 2 = 0 Then a(i, 1) = "_" & a(i, 1)
    Next
    [A2].Resize(UBound(a, 1)).Value = a
    [A:E].Sort [A1], Header:=xlYes
    [A:A].Replace "_", ""
End Sub
Пример во вложении. Откройте файл и нажмите кнопку "Выполнить".
Изменено: SAS888 - 22.05.2017 09:46:17
Чем шире угол зрения, тем он тупее.
 
Спасибо огромное всем!
Страницы: 1
Наверх