Загрузил в массив .csv файл. Но есть необходимость перед выгрузкой на лист отсортировать этот массив от поздней даты к ранней. Собрал где только мог пять методов сортировки (у Уокенбаха, на этом форуме) и каждый выдаёт ошибку. Не могу найти причину. В архиве файл .csv и файл с макросами для загрузки этого файла в массив, а также модуль с пятью процедурами сортировки.
Загрузил в массив .csv файл. Но есть необходимость перед выгрузкой на лист отсортировать этот массив от поздней даты к ранней. Собрал где только мог пять методов сортировки (у Уокенбаха, на этом форуме) и каждый выдаёт ошибку. Не могу найти причину. В архиве файл .csv и файл с макросами для загрузки этого файла в массив, а также модуль с пятью процедурами сортировки.Vostok
Function ShellSort22(x, k As Long) '*** сортируем 2-мерный массив x по столбцу k Dim Limit As Long, Switch As Long, i&, j&, u& Dim ubx&, t ubx = UBound(x, 2): j = (UBound(x) - LBound(x) + 1) \ 2 Do While j > 0 Limit = UBound(x) - j Do Switch = LBound(x) - 1 For i = LBound(x) To Limit ' If x(i, k) > x(i + j, k) Then 'по возрастанию If x(i, k) < x(i + j, k) Then 'по убыванию For u = 1 To ubx t = x(i, u) x(i, u) = x(i + j, u) x(i + j, u) = t Next Switch = i End If Next Limit = Switch - j Loop While Switch >= LBound(x) j = j \ 2 Loop: ShellSort22 = x End Function
[/vba]
а если так [vba]
Код
... CSVarr = ShellSort22(CSVarr, 1) ...
[/vba] [vba]
Код
Function ShellSort22(x, k As Long) '*** сортируем 2-мерный массив x по столбцу k Dim Limit As Long, Switch As Long, i&, j&, u& Dim ubx&, t ubx = UBound(x, 2): j = (UBound(x) - LBound(x) + 1) \ 2 Do While j > 0 Limit = UBound(x) - j Do Switch = LBound(x) - 1 For i = LBound(x) To Limit ' If x(i, k) > x(i + j, k) Then 'по возрастанию If x(i, k) < x(i + j, k) Then 'по убыванию For u = 1 To ubx t = x(i, u) x(i, u) = x(i + j, u) x(i + j, u) = t Next Switch = i End If Next Limit = Switch - j Loop While Switch >= LBound(x) j = j \ 2 Loop: ShellSort22 = x End Function
Если весь процесс понаблюдать в окне Locals с целью отследить состояние отсортированного массива, то получаем следующее:
1. При сортировке по возрастанию данные в массиве перемешиваются (2013 год идёт в перемешку с 2014-ым). 2. При сортировке по убыванию - половина данных просто пропадает (массив включает в себя период с 02.01.2013 - 01.10.2014. И 2014 год полностью пропадает).
Ну вот для примера с настройкой в функции "По возрастанию".
Если весь процесс понаблюдать в окне Locals с целью отследить состояние отсортированного массива, то получаем следующее:
1. При сортировке по возрастанию данные в массиве перемешиваются (2013 год идёт в перемешку с 2014-ым). 2. При сортировке по убыванию - половина данных просто пропадает (массив включает в себя период с 02.01.2013 - 01.10.2014. И 2014 год полностью пропадает).
Ну вот для примера с настройкой в функции "По возрастанию".
Вы же импортировали все данные CSV как текст, да ещё зачем-то загрузили заголовки столбцов. Соответственно, надо сначала привести данные к нужным типам (даты в Excel - это числа), причем правильно разобраться с форматом mm/dd/yyyy.
И да, зачем собственные сортировки делать? По одному столбцу данные можно отсортировать и средствами самого Excel...
[vba]
Код
Option Explicit
Sub MyCSV2Arr()
Dim filename As String Dim CSVarr() As Variant Dim i As Long
filename = "d:\totalpc.csv"
CSVarr = LoadArrayFromTextFile(filename, 4) If Not IsArray(CSVarr) Then MsgBox "Файл CSV не обработан", vbCritical, "Ошибка": Exit Sub
Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets.Add With sh.Cells(1, 1).Resize(UBound(CSVarr, 1), UBound(CSVarr, 2)) .Value = CSVarr .Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess CSVarr = .Value End With Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True
' имеем отсортированный массив
End Sub
[/vba]
И поскольку вы все равно собирались массив выгружать на лист, то можно и не извращаться с доп.листом, а просто выгрузить данные и отсортировать "по месту"...
Вы же импортировали все данные CSV как текст, да ещё зачем-то загрузили заголовки столбцов. Соответственно, надо сначала привести данные к нужным типам (даты в Excel - это числа), причем правильно разобраться с форматом mm/dd/yyyy.
И да, зачем собственные сортировки делать? По одному столбцу данные можно отсортировать и средствами самого Excel...
[vba]
Код
Option Explicit
Sub MyCSV2Arr()
Dim filename As String Dim CSVarr() As Variant Dim i As Long
filename = "d:\totalpc.csv"
CSVarr = LoadArrayFromTextFile(filename, 4) If Not IsArray(CSVarr) Then MsgBox "Файл CSV не обработан", vbCritical, "Ошибка": Exit Sub
Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets.Add With sh.Cells(1, 1).Resize(UBound(CSVarr, 1), UBound(CSVarr, 2)) .Value = CSVarr .Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess CSVarr = .Value End With Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True
' имеем отсортированный массив
End Sub
[/vba]
И поскольку вы все равно собирались массив выгружать на лист, то можно и не извращаться с доп.листом, а просто выгрузить данные и отсортировать "по месту"...AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Суббота, 11.10.2014, 11:56
Спасибо за Ваше мнение, но мне нужно то, что я описал в начале темы. У Вас всё очень сложно. Да и к чему мне новый лист? Дата выгружается на лист в формате "Общий" и т.д.
Спасибо за Ваше мнение, но мне нужно то, что я описал в начале темы. У Вас всё очень сложно. Да и к чему мне новый лист? Дата выгружается на лист в формате "Общий" и т.д.Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Давайте вот так попробуем: в Function LoadArrayFromTextFile добавьте еще одну строку (со звездочками),чтобы даты были как даты: [vba]
Код
... For i = LBound(tmpArr1) To UBound(tmpArr1) tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$) For j = 1 To UBound(tmpArr2) + 1 arr(i + 1, j) = tmpArr2(j - 1) Next j arr(i + 1, 1) = CDate(arr(i + 1, 1)) 'add line ******* Next i ...
[/vba] и возьмите массив с 4-й строки (вообще без заголовков) [vba]
Код
Optional ByVal FirstRow As Long = 4
[/vba] Тогда будет нормально сортироваться
Давайте вот так попробуем: в Function LoadArrayFromTextFile добавьте еще одну строку (со звездочками),чтобы даты были как даты: [vba]
Код
... For i = LBound(tmpArr1) To UBound(tmpArr1) tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$) For j = 1 To UBound(tmpArr2) + 1 arr(i + 1, j) = tmpArr2(j - 1) Next j arr(i + 1, 1) = CDate(arr(i + 1, 1)) 'add line ******* Next i ...
[/vba] и возьмите массив с 4-й строки (вообще без заголовков) [vba]
Давайте вот так попробуем: в Function LoadArrayFromTextFile добавьте еще одну строку (со звездочками),чтобы даты были как даты:
Поставил. В функции сортировки поставил "по убыванию". Но получилась какая то чехарда с датами. Дат то таких в исходном файле нет. Вот в чём дело то. Как они появились после сортировки Период охватывает: со 02 января 2013 до 01 октября 2014 года.
Давайте вот так попробуем: в Function LoadArrayFromTextFile добавьте еще одну строку (со звездочками),чтобы даты были как даты:
Поставил. В функции сортировки поставил "по убыванию". Но получилась какая то чехарда с датами. Дат то таких в исходном файле нет. Вот в чём дело то. Как они появились после сортировки Период охватывает: со 02 января 2013 до 01 октября 2014 года.
О чем и говорилось, и для чего как раз в моем коде эти самые даты специально конвертируются по определенным правилам, а не просто подаются в CDate(). Но вы же (см.ниже)
[offtop]Вывод - вы вообще не читаете не то что код, а даже и сам смысл ответов до вас не доходит. Вам подавай "готовенькое и под вас". Вам подают (от широты душевной). Но вы, походу, не понимаете даже этого...[/offtop]
О чем и говорилось, и для чего как раз в моем коде эти самые даты специально конвертируются по определенным правилам, а не просто подаются в CDate(). Но вы же (см.ниже)
[offtop]Вывод - вы вообще не читаете не то что код, а даже и сам смысл ответов до вас не доходит. Вам подавай "готовенькое и под вас". Вам подают (от широты душевной). Но вы, походу, не понимаете даже этого...[/offtop]AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Суббота, 11.10.2014, 13:51
мне нужно то, что я описал в начале темы А я вам что дал?
То, что Вы мне дали - не работает! А Ваши замечания о том, что мне надо всё готовенькое - не уместно. Я в VBA - новичок, поэтому и прошу помощи. Не смогли доходчиво объяснить - злитесь на себя самого. К чему оскорбления, упрёки ? Людей на форуме много, всё равно найдутся те кто без эмоций, нормально сможет показать и объяснить. Форум существует и для новичков тоже. В любом случае - Спасибо за отклик.
мне нужно то, что я описал в начале темы А я вам что дал?
То, что Вы мне дали - не работает! А Ваши замечания о том, что мне надо всё готовенькое - не уместно. Я в VBA - новичок, поэтому и прошу помощи. Не смогли доходчиво объяснить - злитесь на себя самого. К чему оскорбления, упрёки ? Людей на форуме много, всё равно найдутся те кто без эмоций, нормально сможет показать и объяснить. Форум существует и для новичков тоже. В любом случае - Спасибо за отклик.Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Суббота, 11.10.2014, 14:01
Загрузил в массив .csv файл. Но есть необходимость перед выгрузкой на лист отсортировать этот массив от поздней даты к ранней.
Берем мой код, записываем его в общий модуль. Ставим брейк на конец процедуры. Запускаем макрос MyCSV2Arr, при останове - смотрим в Locals на содержимое массива CSVarr. Переписываем/дописываем мой код под свои следующие хотелки (выгрузка результата на лист и т.д.)
[offtop]И не надо по поводу эмоций - мы с вами незнакомы :)[/offtop]
Загрузил в массив .csv файл. Но есть необходимость перед выгрузкой на лист отсортировать этот массив от поздней даты к ранней.
Берем мой код, записываем его в общий модуль. Ставим брейк на конец процедуры. Запускаем макрос MyCSV2Arr, при останове - смотрим в Locals на содержимое массива CSVarr. Переписываем/дописываем мой код под свои следующие хотелки (выгрузка результата на лист и т.д.)
[offtop]И не надо по поводу эмоций - мы с вами незнакомы :)[/offtop]AndreTM
По этому поводу анекдотец: Пришел мужик к врачу. Говорит, что у него с органами половыми не все в порядке. Врач попросил раздется. Мужик снимает пиджак, аккуратно вешает на стул, галстук, брюки по стрелке вешает, снимает носки разглаживат, ложит рядом. Показывает доктору х@р. Доктор говорит, что все нормально. Мужик недоуменно: - Как? Видите одно яйцо ниже другого. Доктор успокаивает типа все в норме, у всех так. Мужик говорит: - Да как-то не аккуратно получается.[/offtop]
По этому поводу анекдотец: Пришел мужик к врачу. Говорит, что у него с органами половыми не все в порядке. Врач попросил раздется. Мужик снимает пиджак, аккуратно вешает на стул, галстук, брюки по стрелке вешает, снимает носки разглаживат, ложит рядом. Показывает доктору х@р. Доктор говорит, что все нормально. Мужик недоуменно: - Как? Видите одно яйцо ниже другого. Доктор успокаивает типа все в норме, у всех так. Мужик говорит: - Да как-то не аккуратно получается.[/offtop]wild_pig
Сообщение отредактировал wild_pig - Суббота, 11.10.2014, 17:23
Людей на форуме много, всё равно найдутся те кто без эмоций, нормально сможет показать и объяснить.
а давайте вместе ждать? людей много. но вот дураков, которые, видя наглядный пример, как Вы реагируете на правильный код и подробные разъяснения, возьмутся за столь неблагодарное дело... нету. но вдруг появятся, ага?
Людей на форуме много, всё равно найдутся те кто без эмоций, нормально сможет показать и объяснить.
а давайте вместе ждать? людей много. но вот дураков, которые, видя наглядный пример, как Вы реагируете на правильный код и подробные разъяснения, возьмутся за столь неблагодарное дело... нету. но вдруг появятся, ага?ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki