Страница: 1 |
Страница: 1 |
Вопрос: Сортировка по дате в Excel
Добавлено: 22.02.05 14:12
Автор вопроса: Duns
Простой вроде бы вопрос поставил в тупик:
есть колонка с датами в виде
30.01
31.01
09.02
12.02
14.02
16.02
10.02
11.02
13.02
Как отсортировать их в порядке возрастания дат?
Заранее спасибо
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 22.02.05 16:25
Условие "a больше b" выглядит как val(split(a,"."(1))>val(split(b,".") or (val(split(a,"."(1))=val(split(b,"."(1)) and val(split(a,"."(0))>val(split(b,"."(0)))
Номер ответа: 2
Автор ответа:
Duns
Вопросов: 1
Ответов: 7
Профиль | | #2
Добавлено: 22.02.05 17:32
Уважаемый Sharp!
Спасибо за помощь! Теоретически все понятно.
Не подскажете, что я делаю не так практически?
ActiveSheet.Range("65536".End(xlUp).Select
m = ActiveCell.Row
For i = 1 To m - 1
a = Cells(i, 4).Value
b = Cells(i + 1, 4).Value
If Val(Split(a, "."(1)) > Val(Split(b, ".") Or (Val(Split(a, "."(1)) = Val(Split(b, "."(1)) And Val(Split(a, "."(0)) > Val(Split(b, "."(0))) Then
Range(Cells(i + 1, 4)).Select
Selection.Cut
Range(Cells(i, 4)).Select
Selection.Insert Shift:=xlDown
End If
Next i
D:D - колонка с датами
Упорно нарываюсь на Type Mismatch..
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 22.02.05 18:11
Я, к сожалению, не знаком с VBA, но сортировал бы в массиве, а не непосредственно в ячейках
Номер ответа: 4
Автор ответа:
ActiveX
Вопросов: 0
Ответов: 73
Профиль | | #4
Добавлено: 22.02.05 23:07
Я, к сожалению, знаком с VBA, и сортировал бы непосредственно в ячейках, так как для сортировки дат, представленных в формате ДД.ММ, в определенном диапазоне, достаточно :
Range("2:D10".Sort Range("2", xlAscending
P.S. Подобным образом можно также сортировать и другие типы данных.
Номер ответа: 5
Автор ответа:
Duns
Вопросов: 1
Ответов: 7
Профиль | | #5
Добавлено: 04.03.05 10:09
Вопрос остается открытым. К сожалению, предложенный способ сортирует только по датам и собирает все месяца в одну кучу..
Номер ответа: 6
Автор ответа:
Duns
Вопросов: 1
Ответов: 7
Профиль | | #6
Добавлено: 04.03.05 13:04
И еще для меня абсолютно необъяснима следующая загадка.
Записываю макрос при выполнении команды Данные - Сортировка - По убыванию.
Выбираю при этом опцию "Сортировать все данные, похожие на числа, как числа"
При этом все отлично сортируется )
Макрос получается след. вида:
Columns(":D".Select
Selection.Sort Key1:=Range("1", Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
 ataOption1:=xlSortTextAsNumbers
НО! Когда я пытаюсь выполнить этот макрос из VBA, применительно к оригинальному диапазону, опять происходит сортировка в виде
01.02.2005
01.03.2005
02.02.2005
и т.д.
Нонсенс какой-то..
Номер ответа: 7
Автор ответа:
Duns
Вопросов: 1
Ответов: 7
Профиль | | #7
Добавлено: 04.03.05 13:06
Сорри, "По убыванию" читать как "По возрастанию"
Номер ответа: 8
Автор ответа:
ActiveX
Вопросов: 0
Ответов: 73
Профиль | | #8
Добавлено: 04.03.05 17:48
Предложенный способ прекрасно работает с датами, и не сбивает месяца в кучу, как Вы изволили выразиться. И вот результат выполнения моего кода, применительно к Вашим датам >>>
01.02.2005
02.02.2005
01.03.2005
Номер ответа: 9
Автор ответа:
Duns
Вопросов: 1
Ответов: 7
Профиль | | #9
Добавлено: 04.03.05 17:59
В том то все и дело, что предложенный Вами способ вроде бы должен работать (макрос, записанный в excel, как Вы наверное заметили, использует вобщем-то тот же вариант решения). Просто код, указанный Вами, и код, выложенный мной выше, в моем случае сортирует даты в виде
01.02.2005
01.03.2005
02.03.2005
Перепробовал различные форматы данных в ячейках и пр. - пока ничего не получается..
Номер ответа: 10
Автор ответа:
Duns
Вопросов: 1
Ответов: 7
Профиль | | #10
Добавлено: 04.03.05 18:02
Тьфу ты..
То есть
01.02.2005
01.03.2005
02.02.2005
Номер ответа: 11
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #11
Добавлено: 04.03.05 20:09
Не понимаю, в чём проблема.. Excel-VBA имеет свой встроенный тип данных Дата и время, хранимый как число (о формате всё написано в help). Соответственно, делаешь формат ячеек с датами как числовой целый и сортируешь. Что-что, а при сортировке чисел Excel обычно сбоев не дает..
Лист1.Cells(i,7).Format="# ##0"
Next i
'Сортировка здесь
Columns("G:G".Select
Selection.Sort ...
For i=1 To 12
Лист1.Cells(i,7).Format="dd.mm.yyyy"
Next i
В крайнем случае можно представить дату в трёх столбцах и сортировать по году, месяцу, дню
Я замечал раньше, что "Подбор значения" макросом выполняется непредсказуемо, хотя вручную всё как надо.
Номер ответа: 12
Автор ответа:
Duns
Вопросов: 1
Ответов: 7
Профиль | | #12
Добавлено: 07.03.05 12:16
Решил-таки проблему ))
Предложенные способы так и не помогли.
Видимо все дело в том, что данные в сортируемом диапазоне не вводятся вручную а попадают туда в результате работы других макросов. При ручном вводе все действительно отлично сортируется )
Разбираться что к чему было неохота. К тому же познания в VBA на уровне прочтения пары книжек, так что не смейтесь, но пришлось соорудить такой вот код, мож кому понадобится:
' определяем диапазон сортировки
ActiveSheet.Range("H65536".End(xlUp).Select
m = ActiveCell.Row
' сортируем записи по месяцам
For i = 1 To m - 1
For j = i + 1 To m
If Mid(Cells(i, 8), 4, 2) > Mid(Cells(j, 8), 4, 2) Then
Temp = Cells(j, 8).Value
Cells(j, 8).Value = Cells(i, 8).Value
Cells(i, 8).Value = Temp
End If
Next j
Next i
' сортируем записи по дням
For i = 1 To m - 1
For j = i + 1 To m
If Left(Cells(i, 8), 2) > Left(Cells(j, 8), 2) Then
If Mid(Cells(i, 8), 4, 2) = Mid(Cells(j, 8), 4, 2) Then
Temp = Cells(j, 8).Value
Cells(j, 8).Value = Cells(i, 8).Value
Cells(i, 8).Value = Temp
End If
End If
Next j
Next i
Всем большое спасибо за предложенную помощь
Номер ответа: 13
Автор ответа:
ActiveX
Вопросов: 0
Ответов: 73
Профиль | | #13
Добавлено: 08.03.05 00:54
Как я писал в самом первом ответе, если дата введена правильно и действительно является датой, то всё прекрасно работает. В Вашем случае MS Excel воспринимает то, что было введено как текст, отсюда и сортировка только первых двух символов. А зная что причиной некорректной работы является результат работы других макросов можно со всей уверенностью заявить, что нужно бороться с причиной, а не со следствием и естественно необходимо "пересмотреть" код этих самых макросов.
P.S. Некорректно введенная дата может послужить причиной и других многочисленных проблем, так что ...
Примечание :
При желании можно обойтись и без использовании метода Select, например :
m = ActiveSheet.Range("H65536".End(xlUp).Row
Номер ответа: 14
Автор ответа:
Shany
Вопросов: 0
Ответов: 1
Web-сайт:
Профиль | | #14
Добавлено: 28.04.07 21:12
Duns был прав, если вручную вводить то все прекрасно, а автоматом, хоть тресни! Преобразование ячеек в формат даты не помогает. Я решил проблему так:
 im vdat As Date
потом
for i=(первая строка колонки с датами) to (последняя)
vdat = Cells(i,(номер колонки) )
Cells(i, (номер колонки)).FormulaR1C1 = vdat
next
осле этого все сортируется правильно.