Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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-сайт: sharpc.livejournal.com
 Профиль | | #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(";D65536";).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-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 22.02.05 18:11
Я, к сожалению, не знаком с VBA, но сортировал бы в массиве, а не непосредственно в ячейках

Ответить

Номер ответа: 4
Автор ответа:
 ActiveX



Вопросов: 0
Ответов: 73
 Профиль | | #4 Добавлено: 22.02.05 23:07
Я, к сожалению, знаком с VBA, и сортировал бы непосредственно в ячейках, так как для сортировки дат, представленных в формате ДД.ММ, в определенном диапазоне, достаточно :

Range(";D2:D10";).Sort Range(";D2";), 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:D";).Select
    Selection.Sort Key1:=Range(";D1";), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        ;DataOption1:=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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #11
Добавлено: 04.03.05 20:09
Не понимаю, в чём проблема.. Excel-VBA имеет свой встроенный тип данных Дата и время, хранимый как число (о формате всё написано в help). Соответственно, делаешь формат ячеек с датами как числовой целый и сортируешь. Что-что, а при сортировке чисел Excel обычно сбоев не дает..
For i=1 To 12
Лист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-сайт: www.dilevik.narod.ru
 Профиль | | #14
Добавлено: 28.04.07 21:12
Duns был прав, если вручную вводить то все прекрасно, а автоматом, хоть тресни! Преобразование ячеек в формат даты не помогает. Я решил проблему так:
 ;Dim vdat As Date
потом
for i=(первая строка колонки с датами) to (последняя)
vdat = Cells(i,(номер колонки) )
Cells(i, (номер колонки)).FormulaR1C1 = vdat
next
осле этого все сортируется правильно.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам