#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. как я уже говорил, это не сработает, простое изменение формата не приведет к преобразованию чисел, хранящихся в виде текста, в числа.