Сортировка VBA вызывает 9> 17?

#excel #vba

#преуспеть #vba

Вопрос:

Я использую это для сортировки нескольких столбцов чисел в порядке возрастания:

 With Workbooks(LotWB).Worksheets("SQL Data").Sort
     .SortFields.Add Key:=Range("J1"), Order:=xlAscending
     .SortFields.Add Key:=Range("H1"), Order:=xlAscending
     .SortFields.Add Key:=Range("G1"), Order:=xlAscending
     .SortFields.Add Key:=Range("A1"), Order:=xlAscending
     .SortFields.Add Key:=Range("B1"), Order:=xlAscending
     .SetRange Workbooks(LotWB).Worksheets("SQL Data").Range("A1:AG" amp; LastRowLot)
     .Header = xlYes
     .Apply
End With
 

Но когда я запускаю код, он сортирует числа странным образом (например, 1, 17, 25, 33, 9).
Я знаю, что числа сортируются по первой (самой левой) цифре.
Что я могу сделать, чтобы предотвратить эту ошибочную сортировку?

Комментарии:

1. Числа сохраняются в виде текста. Вам нужно будет преобразовать их в числа, простое изменение формата этого не сделает.

2. @ScottCraner для массового преобразования вы можете сделать что-то вроде range("A:A") = 1*Range("A:A") ?

3. нет, вы не можете сделать это с массивом вариантов в vba. На мой взгляд, лучший способ — перебирать столбцы и использовать TextToColumns для выполнения тяжелой работы.

Ответ №1:

Измените формат в ячейках, содержащих числа, отформатированные как текст

  • Для работы вам нужно перебирать области диапазона .Value = .Value .

Код

 Const SortColumns As String = "A:A,B:B,G:G,H:H,J:J"
With Workbooks(LotWB).Worksheets("SQL Data")
    Application.ScreenUpdating = False
    Dim rng As Range
    With .Range("A1").CurrentRegion
        Set rng = .Resize(.Rows.Count - 1).Offset(1)
    End With
    With Intersect(rng, .Range(SortColumns))
        .NumberFormat = 0 ' Choose the number format you need.
        For Each rng In .Areas
            rng.Value = rng.Value
        Next rng
    End With
    With .Sort
        .SortFields.Add Key:=Range("J1"), Order:=xlAscending
        .SortFields.Add Key:=Range("H1"), Order:=xlAscending
        .SortFields.Add Key:=Range("G1"), Order:=xlAscending
        .SortFields.Add Key:=Range("A1"), Order:=xlAscending
        .SortFields.Add Key:=Range("B1"), Order:=xlAscending
        .SetRange .Parent.Range("A1:AG" amp; LastRowLot)
        .Header = xlYes
        .Apply
    End With
    Application.ScreenUpdating = True
End With
 

Ответ №2:

Спасибо, Скотт.

Вот что я использовал до сортировки

 With Workbooks(LotWB).Worksheets("SQL Data").Columns(7)
    .NumberFormat = "0"
    .Value = .Value
End With
 

Комментарии:

1. как я уже говорил, это не сработает, простое изменение формата не приведет к преобразованию чисел, хранящихся в виде текста, в числа.