Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сортировка двумерного массива после загрузки .csv файла - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сортировка двумерного массива после загрузки .csv файла (Макросы/Sub)
Сортировка двумерного массива после загрузки .csv файла
ikki Дата: Суббота, 11.10.2014, 22:37 | Сообщение № 21
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
a это
?range("d5").cells(-1,-2).Address

выдает $A$3
а почему должно быть иначе?
если учесть, что сама ячейка D5 - это range("d5").cells(1,1)
то на две строки выше и три столбца левее - да, таки A3


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщение
a это
?range("d5").cells(-1,-2).Address

выдает $A$3
а почему должно быть иначе?
если учесть, что сама ячейка D5 - это range("d5").cells(1,1)
то на две строки выше и три столбца левее - да, таки A3

Автор - ikki
Дата добавления - 11.10.2014 в 22:37
AndreTM Дата: Воскресенье, 12.10.2014, 00:01 | Сообщение № 22
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
По этому поводу припомнилась не сильно давняя история: друг-скриптописатель (не на VB) со мной связывается и спрашивает так ненароком "как это может быть - Cells(0,0) ? Меня ведь учили, что ячейки всегда нумеруются от 1..."
Я ему начинаю втирать, что такого кода быть не может в принципе, что это - чистый рантайм-эррор и т.д. Дело доходит до того, что он все же вырывает и приносит в клювике кусочек кода, где это написано. Смотрю я на этот код, и начинает меня мучить мысль, что всё это я уже видел :) и внезапно понимаю, что это мой код B) который был как-то писан...
Недоразумения разъяснились, но пришлось человека сразу направить к истокам - поизучать основы по иерархии объектов...
Код, понятное дело, был из разряда:
[vba]
Код
With oTable
' куча-куча строчек
   .Cells(0, 0).Resize(...
[/vba]Ну не смущала его точка :)

[offtop]Чегой-то тема совсем стала офф...

Кстати, насчет точек :)
Знающих людей никак не смутит конструкция вида:
: ?. ( x -- ) . ;[/offtop]


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеПо этому поводу припомнилась не сильно давняя история: друг-скриптописатель (не на VB) со мной связывается и спрашивает так ненароком "как это может быть - Cells(0,0) ? Меня ведь учили, что ячейки всегда нумеруются от 1..."
Я ему начинаю втирать, что такого кода быть не может в принципе, что это - чистый рантайм-эррор и т.д. Дело доходит до того, что он все же вырывает и приносит в клювике кусочек кода, где это написано. Смотрю я на этот код, и начинает меня мучить мысль, что всё это я уже видел :) и внезапно понимаю, что это мой код B) который был как-то писан...
Недоразумения разъяснились, но пришлось человека сразу направить к истокам - поизучать основы по иерархии объектов...
Код, понятное дело, был из разряда:
[vba]
Код
With oTable
' куча-куча строчек
   .Cells(0, 0).Resize(...
[/vba]Ну не смущала его точка :)

[offtop]Чегой-то тема совсем стала офф...

Кстати, насчет точек :)
Знающих людей никак не смутит конструкция вида:
: ?. ( x -- ) . ;[/offtop]

Автор - AndreTM
Дата добавления - 12.10.2014 в 00:01
Vostok Дата: Воскресенье, 12.10.2014, 05:15 | Сообщение № 23
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
а давайте вместе ждать?
людей много. но вот дураков, которые, видя наглядный пример, как Вы реагируете на правильный код и подробные разъяснения, возьмутся за столь неблагодарное дело...нету. но вдруг появятся, ага?


Банально - Флуд, это во - первых. Во-вторых, Ваше мнение - это мнение фрилансера, а не человека, которых Вы считаете "дураками". Это профессионалу может быть всё очевидно, а новичку - далеко не так. Я затем сюда и пришёл, за помощью. Выучить VBA за месяц - дело не из простых. Вынужден задавать вопросы.

Что предосудительного в том, что мне что-то не понятно?. Да и потом, настоящий профессионал, не кичится своими познаниями, позволяя себе насмешку, упрёки, язвительные замечания, а снисходительно либо разъяснит, либо укажет на источник. Ну а на "нет" и суда "нет".


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
 
Ответить
Сообщение
а давайте вместе ждать?
людей много. но вот дураков, которые, видя наглядный пример, как Вы реагируете на правильный код и подробные разъяснения, возьмутся за столь неблагодарное дело...нету. но вдруг появятся, ага?


Банально - Флуд, это во - первых. Во-вторых, Ваше мнение - это мнение фрилансера, а не человека, которых Вы считаете "дураками". Это профессионалу может быть всё очевидно, а новичку - далеко не так. Я затем сюда и пришёл, за помощью. Выучить VBA за месяц - дело не из простых. Вынужден задавать вопросы.

Что предосудительного в том, что мне что-то не понятно?. Да и потом, настоящий профессионал, не кичится своими познаниями, позволяя себе насмешку, упрёки, язвительные замечания, а снисходительно либо разъяснит, либо укажет на источник. Ну а на "нет" и суда "нет".

Автор - Vostok
Дата добавления - 12.10.2014 в 05:15
Vostok Дата: Воскресенье, 12.10.2014, 09:45 | Сообщение № 24
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Ну что ж решение всё-таки найдено, но сперва оценим "великодушие" господина AndreTM. Итак, что нам было предложено.

В задаче требовалось:
есть необходимость перед выгрузкой на лист отсортировать этот массив от поздней даты к ранней


Просьба, на мой взгляд, высказана максимально конкретно - Сортировать массив до выгрузки на Лист. Далее получаем "дар" от AndreTM:



Нетрудно догадаться, что Массив заливается на Лист, там сортируется и потом опять Заливается в Массив (совсем не так как хотелось). А чтобы ничего не было видно Лист удаляется, но почему-то в сопровождении отключения и включения Алертов:



Только при чём тут Алерты? :D Тогда уж обновление экрана бы выключили, чтобы я вообще ничего не заметил. Новичок же. А значит дурачок.
И в Locals то ничего не увидишь, там даты принимают формат числа. И не стал бы я это всё анализировать, если бы в последствии не прилетело
в мой адрес гора обвинений и упрёков:

Оффтоп:
Вывод - вы вообще не читаете не то что код, а даже и сам смысл ответов до вас не доходит. Вам подавай "готовенькое и под вас". Вам подают (от широты душевной). Но вы, походу, не понимаете даже этого...


Всё это похоже на то, когда приходишь к кому то за помощью, а он идёт в сарай, вываливает пару мешков тебе, что под руку попалось, и говорит : "Ну сам тут поковыряйся, может что и найдёшь". Да я и не возражаю, может это и "правильно", но если бы это не сопровождалось язвительными комментариями и Маской "Великодушия".

Ну а теперь собственно о главном, о сортировки внутри массива. Зачем мне это понадобилось то? А чтобы это понять нужно просто взять 1000 файлов .csv и обработать их двумя методами: с сортировкой в Массиве и с Сортировкой на Листе, и таймер в процедуру поставить. Вот тогда всё станет понятно, из-за чего задача и ставилась. Массив - это оперативная память и операция по времени сокращается в треть. Кому захочется поспорить, проделайте сами, или загляните к Д. Уокенбаху "Проф. программирование на VBA".


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Воскресенье, 12.10.2014, 09:55
 
Ответить
СообщениеНу что ж решение всё-таки найдено, но сперва оценим "великодушие" господина AndreTM. Итак, что нам было предложено.

В задаче требовалось:
есть необходимость перед выгрузкой на лист отсортировать этот массив от поздней даты к ранней


Просьба, на мой взгляд, высказана максимально конкретно - Сортировать массив до выгрузки на Лист. Далее получаем "дар" от AndreTM:



Нетрудно догадаться, что Массив заливается на Лист, там сортируется и потом опять Заливается в Массив (совсем не так как хотелось). А чтобы ничего не было видно Лист удаляется, но почему-то в сопровождении отключения и включения Алертов:



Только при чём тут Алерты? :D Тогда уж обновление экрана бы выключили, чтобы я вообще ничего не заметил. Новичок же. А значит дурачок.
И в Locals то ничего не увидишь, там даты принимают формат числа. И не стал бы я это всё анализировать, если бы в последствии не прилетело
в мой адрес гора обвинений и упрёков:

Оффтоп:
Вывод - вы вообще не читаете не то что код, а даже и сам смысл ответов до вас не доходит. Вам подавай "готовенькое и под вас". Вам подают (от широты душевной). Но вы, походу, не понимаете даже этого...


Всё это похоже на то, когда приходишь к кому то за помощью, а он идёт в сарай, вываливает пару мешков тебе, что под руку попалось, и говорит : "Ну сам тут поковыряйся, может что и найдёшь". Да я и не возражаю, может это и "правильно", но если бы это не сопровождалось язвительными комментариями и Маской "Великодушия".

Ну а теперь собственно о главном, о сортировки внутри массива. Зачем мне это понадобилось то? А чтобы это понять нужно просто взять 1000 файлов .csv и обработать их двумя методами: с сортировкой в Массиве и с Сортировкой на Листе, и таймер в процедуру поставить. Вот тогда всё станет понятно, из-за чего задача и ставилась. Массив - это оперативная память и операция по времени сокращается в треть. Кому захочется поспорить, проделайте сами, или загляните к Д. Уокенбаху "Проф. программирование на VBA".

Автор - Vostok
Дата добавления - 12.10.2014 в 09:45
Vostok Дата: Воскресенье, 12.10.2014, 09:46 | Сообщение № 25
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
ИТАК, ГОТОВОЕ ИТОГОВОЕ РЕШЕНИЕ в "ОДНОМ" ФЛАКОНЕ.

Процедура Загрузки .csv в Массив с последующей его сортировкой:



Функция Обработки .csv файла с разбивкой по столбцам (LoadArrayFromTextFile):



"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Воскресенье, 12.10.2014, 13:11
 
Ответить
СообщениеИТАК, ГОТОВОЕ ИТОГОВОЕ РЕШЕНИЕ в "ОДНОМ" ФЛАКОНЕ.

Процедура Загрузки .csv в Массив с последующей его сортировкой:



Функция Обработки .csv файла с разбивкой по столбцам (LoadArrayFromTextFile):


Автор - Vostok
Дата добавления - 12.10.2014 в 09:46
Vostok Дата: Воскресенье, 12.10.2014, 09:47 | Сообщение № 26
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
И наконец, Сортировка Массива методом Шелла (ShellSort22), любезно предоставленная nilem с небольшой корректировкой:



"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Воскресенье, 12.10.2014, 13:11
 
Ответить
СообщениеИ наконец, Сортировка Массива методом Шелла (ShellSort22), любезно предоставленная nilem с небольшой корректировкой:


Автор - Vostok
Дата добавления - 12.10.2014 в 09:47
Vostok Дата: Воскресенье, 12.10.2014, 09:58 | Сообщение № 27
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Единственное, что можно будет добавить, это в Функции обработки .csv файла предусмотреть "обрезку" длины данных. Например в файле 3000 строк, а нам нужно взять только 1000. Но это уже другая тема.


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
 
Ответить
СообщениеЕдинственное, что можно будет добавить, это в Функции обработки .csv файла предусмотреть "обрезку" длины данных. Например в файле 3000 строк, а нам нужно взять только 1000. Но это уже другая тема.

Автор - Vostok
Дата добавления - 12.10.2014 в 09:58
nilem Дата: Воскресенье, 12.10.2014, 12:50 | Сообщение № 28
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Vostok,
вот здесь еще есть сортировки (просто Шелл мне больше нравится :))
[offtop]Да, формат даты я проглядел :(
А решение получилось симпатичное.[/offtop]


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеVostok,
вот здесь еще есть сортировки (просто Шелл мне больше нравится :))
[offtop]Да, формат даты я проглядел :(
А решение получилось симпатичное.[/offtop]

Автор - nilem
Дата добавления - 12.10.2014 в 12:50
AndreTM Дата: Воскресенье, 12.10.2014, 15:28 | Сообщение № 29
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Vostok, самое интересное, что вы так все же и не поняли, что вам предлагалось.
Я предложил:
- читаем данные в массив (той самой процедурой LoadArrayFromTextFile, без изменений), здесь же указываем начальную строку файла для чтения
- проверяем корректность загрузки, если надо
- делаем приведение типов, особое внимание уделяем датам (один проход по массиву); здесь же можно ограничить количество выгружаемых данных
- выгружаем данные на лист
- сортируем данные прямо на листе

Обратите внимание, что никакой повторной загрузки "с листа в массив" нет, это было сделано только для примера, чтобы вы увидели отсортированный массив как массив. В "рабочем" решении, если данные все равно должны оказаться на листе - никто не будет гонять их туда-сюда, естественно.
Доп.лист для сортировки создается/удаляется с той же целью - как пример. Естественно, в рабочем скрипте данные выгрузились бы на существующий лист. А насчет алертов - вы пробовали сами удалять лист кодом VBA? Попробуйте без алертов, потом расскажете... И да, еще одно дополнение, которое я могу ещё предложить - это отключать автопересчет и отображение листа (Application.Calculation и Application.ScreenUpdating) на время сортировки.
А то, что вы видите даты как числа - ещё раз повторюсь, это исключительно и только ваши настройки интерфейса... Я у себя в Locals при тестировании видел даты в массиве как "даты" :) Ну а то, что "даты" в Excel - это числа, написано в любом учебнике, надо бы знать...

И да, я не спорю, что сортировка по Шеллу вполне может выигрывать у встроенной (хотя там, вполне вероятно, тот же шелл :) ). Мне даже удивительно, что "время сократилось на треть" (точно на треть? не в три раза?) Ведь у меня "в методе" максимум времени отъедает именно перекачка данных (на лист ... с листа) + создание/удаление листа. Поскольку все остальные действия в наших с вами "алгоритмах" практически совпадают - замеры времени именно на сортировку надо проводить, только суммируя время работы соответствующего куска кода. У вас:
[vba]
Код
CSVarr = ShellSort22(CSVarr, 1)
[/vba]а у меня - вызова кода:
[vba]
Код

Application.ScreenUpdating = False
[a1].Resize(UBound(CSVarr, 1), UBound(CSVarr, 2)).Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess
Application.ScreenUpdating = True
[/vba]
Так что можете попробовать сравнить - у меня нет ваших 1000 файлов CSV. И уже с цифрами на руках рассказать, насколько выигрывает ваш метод.

Ладно, я согласен с тем, что вы просили "остсортировать массив ДО выгрузки на лист". Но для чего нужен именно такой порядок - нигде не указали. Более того, вы же сами выгружаете массив на лист сразу после сортировки. Именно поэтому я и предложил свой вариант, ведь в данном случае порядок действий (отсортировать->выгрузить или выгрузить->отсортировать) роли не играет. Если я что-то упускаю, и вы с отсортированным массивом в памяти производите ещё какие-то действия до выгрузки на лист - просветите нас.

Кстати, вы в мой кусок кода (первый спойлер в сообщении 24) зачем-то засунули двойную сортировку :)
Я уж молчу про то, что у вас If Not IsArray(CSVarr) Then почему-то так и осталось в конце процедуры, когда вы уже вовсю поработали с, возможно, отсутствующим в природе массивом...


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Воскресенье, 12.10.2014, 15:38
 
Ответить
СообщениеVostok, самое интересное, что вы так все же и не поняли, что вам предлагалось.
Я предложил:
- читаем данные в массив (той самой процедурой LoadArrayFromTextFile, без изменений), здесь же указываем начальную строку файла для чтения
- проверяем корректность загрузки, если надо
- делаем приведение типов, особое внимание уделяем датам (один проход по массиву); здесь же можно ограничить количество выгружаемых данных
- выгружаем данные на лист
- сортируем данные прямо на листе

Обратите внимание, что никакой повторной загрузки "с листа в массив" нет, это было сделано только для примера, чтобы вы увидели отсортированный массив как массив. В "рабочем" решении, если данные все равно должны оказаться на листе - никто не будет гонять их туда-сюда, естественно.
Доп.лист для сортировки создается/удаляется с той же целью - как пример. Естественно, в рабочем скрипте данные выгрузились бы на существующий лист. А насчет алертов - вы пробовали сами удалять лист кодом VBA? Попробуйте без алертов, потом расскажете... И да, еще одно дополнение, которое я могу ещё предложить - это отключать автопересчет и отображение листа (Application.Calculation и Application.ScreenUpdating) на время сортировки.
А то, что вы видите даты как числа - ещё раз повторюсь, это исключительно и только ваши настройки интерфейса... Я у себя в Locals при тестировании видел даты в массиве как "даты" :) Ну а то, что "даты" в Excel - это числа, написано в любом учебнике, надо бы знать...

И да, я не спорю, что сортировка по Шеллу вполне может выигрывать у встроенной (хотя там, вполне вероятно, тот же шелл :) ). Мне даже удивительно, что "время сократилось на треть" (точно на треть? не в три раза?) Ведь у меня "в методе" максимум времени отъедает именно перекачка данных (на лист ... с листа) + создание/удаление листа. Поскольку все остальные действия в наших с вами "алгоритмах" практически совпадают - замеры времени именно на сортировку надо проводить, только суммируя время работы соответствующего куска кода. У вас:
[vba]
Код
CSVarr = ShellSort22(CSVarr, 1)
[/vba]а у меня - вызова кода:
[vba]
Код

Application.ScreenUpdating = False
[a1].Resize(UBound(CSVarr, 1), UBound(CSVarr, 2)).Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess
Application.ScreenUpdating = True
[/vba]
Так что можете попробовать сравнить - у меня нет ваших 1000 файлов CSV. И уже с цифрами на руках рассказать, насколько выигрывает ваш метод.

Ладно, я согласен с тем, что вы просили "остсортировать массив ДО выгрузки на лист". Но для чего нужен именно такой порядок - нигде не указали. Более того, вы же сами выгружаете массив на лист сразу после сортировки. Именно поэтому я и предложил свой вариант, ведь в данном случае порядок действий (отсортировать->выгрузить или выгрузить->отсортировать) роли не играет. Если я что-то упускаю, и вы с отсортированным массивом в памяти производите ещё какие-то действия до выгрузки на лист - просветите нас.

Кстати, вы в мой кусок кода (первый спойлер в сообщении 24) зачем-то засунули двойную сортировку :)
Я уж молчу про то, что у вас If Not IsArray(CSVarr) Then почему-то так и осталось в конце процедуры, когда вы уже вовсю поработали с, возможно, отсутствующим в природе массивом...

Автор - AndreTM
Дата добавления - 12.10.2014 в 15:28
alex77755 Дата: Понедельник, 13.10.2014, 09:04 | Сообщение № 30
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Сильно не вникал, но мно не понятно зачем для сортировки организовывать 4 вложенных цикла?
Возможно для ускорения? На досуге посмотрю.
А пока предлагаю ТС. Вместо вынесенных функций считывания и сортировк сделать всё одной процедурой.
код модуля:
[vba]
Код
Option Explicit

Sub QWERT()
       Dim A() As String, NAME, Delimiter, i, j, C, T() As String, M(), Max As Date, Nm, TEM
       Delimiter = ","
       NAME = ActiveWorkbook.Path & "\totalpc.csv"
'    читаем в массив строки
       A = Split(CreateObject("Scripting.FileSystemObject").Getfile(NAME).OpenasTextStream(1).ReadAll, vbNewLine)
       C = UBound(Split(A(i), Delimiter))
       ReDim M(UBound(A), C )
       For i = 0 To UBound(A) - 1 ' по всем строкам
           T = Split(A(i), Delimiter) ' разбиваем по элементам
               For j = 0 To C
                   M(i, j) = T(j)
               Next j
         Next i
       'cортировка
       For i = 3 To UBound(A) - 1
           Max = M(i, 0)
           Nm = i
               For j = i + 1 To UBound(A)
                   If Max < M(j, 0) Then
                       Max = M(j, 0)
                       Nm = j
                   End If
               Next j
               For j = 0 To C   
                   TEM = M(i, j)
                   M(i, j) = M(Nm, j)
                   M(Nm, j) = TEM
               Next j
       Next i
       Лист1.Cells.ClearContents
       Лист1.Range("A1").Resize(UBound(M), UBound(M, 2)+1) = M
       MsgBox "ok", 64, ""
End Sub
[/vba]
текстовик должен быть рядом с книгой.


Могу помочь в VB6, VBA
Alex77755@mail.ru


Сообщение отредактировал alex77755 - Понедельник, 13.10.2014, 09:08
 
Ответить
СообщениеСильно не вникал, но мно не понятно зачем для сортировки организовывать 4 вложенных цикла?
Возможно для ускорения? На досуге посмотрю.
А пока предлагаю ТС. Вместо вынесенных функций считывания и сортировк сделать всё одной процедурой.
код модуля:
[vba]
Код
Option Explicit

Sub QWERT()
       Dim A() As String, NAME, Delimiter, i, j, C, T() As String, M(), Max As Date, Nm, TEM
       Delimiter = ","
       NAME = ActiveWorkbook.Path & "\totalpc.csv"
'    читаем в массив строки
       A = Split(CreateObject("Scripting.FileSystemObject").Getfile(NAME).OpenasTextStream(1).ReadAll, vbNewLine)
       C = UBound(Split(A(i), Delimiter))
       ReDim M(UBound(A), C )
       For i = 0 To UBound(A) - 1 ' по всем строкам
           T = Split(A(i), Delimiter) ' разбиваем по элементам
               For j = 0 To C
                   M(i, j) = T(j)
               Next j
         Next i
       'cортировка
       For i = 3 To UBound(A) - 1
           Max = M(i, 0)
           Nm = i
               For j = i + 1 To UBound(A)
                   If Max < M(j, 0) Then
                       Max = M(j, 0)
                       Nm = j
                   End If
               Next j
               For j = 0 To C   
                   TEM = M(i, j)
                   M(i, j) = M(Nm, j)
                   M(Nm, j) = TEM
               Next j
       Next i
       Лист1.Cells.ClearContents
       Лист1.Range("A1").Resize(UBound(M), UBound(M, 2)+1) = M
       MsgBox "ok", 64, ""
End Sub
[/vba]
текстовик должен быть рядом с книгой.

Автор - alex77755
Дата добавления - 13.10.2014 в 09:04
Vostok Дата: Понедельник, 13.10.2014, 11:40 | Сообщение № 31
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
А пока предлагаю ТС. Вместо вынесенных функций считывания и сортировк сделать всё одной процедурой.
код модуля:

Запускать пробовали? Работает? ..... У меня все даты перемешались.
Вот эта строчка на своём месте?
[vba]
Код
C = UBound(Split(A(i), Delimiter))
[/vba]


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Понедельник, 13.10.2014, 12:41
 
Ответить
Сообщение
А пока предлагаю ТС. Вместо вынесенных функций считывания и сортировк сделать всё одной процедурой.
код модуля:

Запускать пробовали? Работает? ..... У меня все даты перемешались.
Вот эта строчка на своём месте?
[vba]
Код
C = UBound(Split(A(i), Delimiter))
[/vba]

Автор - Vostok
Дата добавления - 13.10.2014 в 11:40
SLAVICK Дата: Понедельник, 13.10.2014, 23:14 | Сообщение № 32
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Вставлю и свои 5 копеек:
А-Я


Я-А


Мне больше Всего нравятся - Самый быстрый из того, что я пробовал.


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Понедельник, 13.10.2014, 23:15
 
Ответить
СообщениеВставлю и свои 5 копеек:
А-Я


Я-А


Мне больше Всего нравятся - Самый быстрый из того, что я пробовал.

Автор - SLAVICK
Дата добавления - 13.10.2014 в 23:14
alex77755 Дата: Вторник, 14.10.2014, 01:00 | Сообщение № 33
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Запускать пробовали? Работает?

Работает. Прикол в том, что ексел меняет формат даты. думал догадаешься
Добавь строчку

[vba]
Код
             Next j
           M(i, 0) = Format(M(i, 0), "dd.mm.yyyy") ' добавить строку
      Next i
[/vba]
К сообщению приложен файл: 9584430.rar (30.0 Kb)


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщение
Запускать пробовали? Работает?

Работает. Прикол в том, что ексел меняет формат даты. думал догадаешься
Добавь строчку

[vba]
Код
             Next j
           M(i, 0) = Format(M(i, 0), "dd.mm.yyyy") ' добавить строку
      Next i
[/vba]

Автор - alex77755
Дата добавления - 14.10.2014 в 01:00
Vostok Дата: Вторник, 14.10.2014, 09:09 | Сообщение № 34
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Работает. Прикол в том, что ексел меняет формат даты. думал догадаешься

Не то чтобы не догадался, а откровенно доверился мнению профессионала, да и забыл что из-за формата изначально чехарда имела место быть. Однако и в последнем варианте есть вопрос. Процедура в итоге выдаёт странный временной период. Изначально в файле *.csv идёт период времени со 02 января 2013 по 01 октября 2014. А в итоге имеем период с 09.12.2014 до 02.01.2013. Где он эти 19-ть несуществующих дней нашёл?


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
 
Ответить
Сообщение
Работает. Прикол в том, что ексел меняет формат даты. думал догадаешься

Не то чтобы не догадался, а откровенно доверился мнению профессионала, да и забыл что из-за формата изначально чехарда имела место быть. Однако и в последнем варианте есть вопрос. Процедура в итоге выдаёт странный временной период. Изначально в файле *.csv идёт период времени со 02 января 2013 по 01 октября 2014. А в итоге имеем период с 09.12.2014 до 02.01.2013. Где он эти 19-ть несуществующих дней нашёл?

Автор - Vostok
Дата добавления - 14.10.2014 в 09:09
alex77755 Дата: Вторник, 14.10.2014, 10:50 | Сообщение № 35
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Количество записей не изменилось. Я и не стал досконально проверять. доверился екселу.
Чехарда возникает из-за американского фориата даты.
Ексел воспринимает при первом числе до 12 как месяц, а потом как день

ексел считает что
01/10/2014 = 01.10.2014
01/14/2014 = 14.01.2014 на этот формат функция МЕСЯЦ выдаёт значение #ЗНАЧ!
пришлось переформатировать дату



Могу помочь в VB6, VBA
Alex77755@mail.ru


Сообщение отредактировал alex77755 - Вторник, 14.10.2014, 10:52
 
Ответить
СообщениеКоличество записей не изменилось. Я и не стал досконально проверять. доверился екселу.
Чехарда возникает из-за американского фориата даты.
Ексел воспринимает при первом числе до 12 как месяц, а потом как день

ексел считает что
01/10/2014 = 01.10.2014
01/14/2014 = 14.01.2014 на этот формат функция МЕСЯЦ выдаёт значение #ЗНАЧ!
пришлось переформатировать дату


Автор - alex77755
Дата добавления - 14.10.2014 в 10:50
Vostok Дата: Вторник, 14.10.2014, 11:28 | Сообщение № 36
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Количество записей не изменилось. Я и не стал досконально проверять. доверился екселу.

Вообщем, с моими наводящими вопросами твой вариант приобретает практически Совершенные Формы :) (шутка). Сейчас всё грузится корректно.

Единственно, я не понял, что это за синтаксис:
[vba]
Код
Лист2.Cells.ClearContents
Лист2.Range("A1").Resize(UBound(M), UBound(M, 2) + 1) = M
[/vba]
У меня он не срабатывает. Грузится всё на 1-ый лист, пришлось эти строки переписать.

И ещё. Если в прошлых вариантах было очевидно как начать загрузку с 3-ей или, к примеру, с 10-ой строки, то тут похоже нужно стать профессионалом по Объекту FileSystemObject, чтобы иметь возможность внести коррективы. Хотя в FileSystemObject кажется есть даже метод загрузки конкретного числа строк.


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Вторник, 14.10.2014, 14:04
 
Ответить
Сообщение
Количество записей не изменилось. Я и не стал досконально проверять. доверился екселу.

Вообщем, с моими наводящими вопросами твой вариант приобретает практически Совершенные Формы :) (шутка). Сейчас всё грузится корректно.

Единственно, я не понял, что это за синтаксис:
[vba]
Код
Лист2.Cells.ClearContents
Лист2.Range("A1").Resize(UBound(M), UBound(M, 2) + 1) = M
[/vba]
У меня он не срабатывает. Грузится всё на 1-ый лист, пришлось эти строки переписать.

И ещё. Если в прошлых вариантах было очевидно как начать загрузку с 3-ей или, к примеру, с 10-ой строки, то тут похоже нужно стать профессионалом по Объекту FileSystemObject, чтобы иметь возможность внести коррективы. Хотя в FileSystemObject кажется есть даже метод загрузки конкретного числа строк.

Автор - Vostok
Дата добавления - 14.10.2014 в 11:28
AndreTM Дата: Вторник, 14.10.2014, 15:07 | Сообщение № 37
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Если в прошлых вариантах было очевидно как начать загрузку с 3-ей или, к примеру, с 10-ой строки, то тут похоже нужно стать профессионалом по Объекту FileSystemObject, чтобы иметь возможность внести коррективы.
Надо просто уметь читать :) Впрочем, я об этом уже...

        For i = 0 To UBound(A) - 1 ' по всем строкам

[vba]
Код
Номер_Начальной_строки = 0 + 6 - 1 ' пропустим пять строк (с 0 по 4), читаем с ШЕСТОЙ
Номер_конечной_строки = (Ubound(A) - 1) - 8 ' минус ВОСЕМЬ строк с конца
For i = Номер_начальной строки To Номер_конечной_строки
...
[/vba]


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Вторник, 14.10.2014, 15:14
 
Ответить
Сообщение
Если в прошлых вариантах было очевидно как начать загрузку с 3-ей или, к примеру, с 10-ой строки, то тут похоже нужно стать профессионалом по Объекту FileSystemObject, чтобы иметь возможность внести коррективы.
Надо просто уметь читать :) Впрочем, я об этом уже...

        For i = 0 To UBound(A) - 1 ' по всем строкам

[vba]
Код
Номер_Начальной_строки = 0 + 6 - 1 ' пропустим пять строк (с 0 по 4), читаем с ШЕСТОЙ
Номер_конечной_строки = (Ubound(A) - 1) - 8 ' минус ВОСЕМЬ строк с конца
For i = Номер_начальной строки To Номер_конечной_строки
...
[/vba]

Автор - AndreTM
Дата добавления - 14.10.2014 в 15:07
alex77755 Дата: Вторник, 14.10.2014, 18:59 | Сообщение № 38
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Лист2.Cells.ClearContents ' очистить лист с кодовым именем Лист1 от содержимого.
Лист2.Range("A1").Resize(UBound(M), UBound(M, 2) + 1) = M ' На лист с кодовым именем Лист1 начиная с ячейки "А1" на количество строк равное первой размерности массива М (UBound(M)) и количество столбцов равное второй размерности массива М (UBound(M, 2)) выгрузить сам массив М.
Приём выгрузки (и загрузки ) массива одной строкой вместо организации цикла в цикле


Могу помочь в VB6, VBA
Alex77755@mail.ru


Сообщение отредактировал alex77755 - Вторник, 14.10.2014, 18:59
 
Ответить
СообщениеЛист2.Cells.ClearContents ' очистить лист с кодовым именем Лист1 от содержимого.
Лист2.Range("A1").Resize(UBound(M), UBound(M, 2) + 1) = M ' На лист с кодовым именем Лист1 начиная с ячейки "А1" на количество строк равное первой размерности массива М (UBound(M)) и количество столбцов равное второй размерности массива М (UBound(M, 2)) выгрузить сам массив М.
Приём выгрузки (и загрузки ) массива одной строкой вместо организации цикла в цикле

Автор - alex77755
Дата добавления - 14.10.2014 в 18:59
alex77755 Дата: Вторник, 14.10.2014, 19:12 | Сообщение № 39
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Цитата
как начать загрузку с 3-ей или, к примеру, с 10-ой строки

FileSystemObject может и не стоит насиловать: он вполне нормально считывает одной строкой весь файл, а Split разбивает на массив строк А.
Надо просто:
1. согласовать размер выходного массива с учётом откинутых строк ReDim M(UBound(A)-2, C) откинуть нужное количество.
2. Как уже подсказали организовать цикл с нужной строки по нужную For i = 2 To UBound(A) - 2 ' по всем строкам (с учётом, что массив А начинается с индекса = 0)
3. Согласовать индексы массивов при разбиении строк. типа M(i - 2, j) = T(j)
Цифра 2 поставлена условно


Могу помочь в VB6, VBA
Alex77755@mail.ru


Сообщение отредактировал alex77755 - Вторник, 14.10.2014, 19:13
 
Ответить
Сообщение
Цитата
как начать загрузку с 3-ей или, к примеру, с 10-ой строки

FileSystemObject может и не стоит насиловать: он вполне нормально считывает одной строкой весь файл, а Split разбивает на массив строк А.
Надо просто:
1. согласовать размер выходного массива с учётом откинутых строк ReDim M(UBound(A)-2, C) откинуть нужное количество.
2. Как уже подсказали организовать цикл с нужной строки по нужную For i = 2 To UBound(A) - 2 ' по всем строкам (с учётом, что массив А начинается с индекса = 0)
3. Согласовать индексы массивов при разбиении строк. типа M(i - 2, j) = T(j)
Цифра 2 поставлена условно

Автор - alex77755
Дата добавления - 14.10.2014 в 19:12
Vostok Дата: Среда, 15.10.2014, 07:33 | Сообщение № 40
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Лист2.Cells.ClearContents ' очистить лист с кодовым именем Лист1 от содержимого.
Лист2.Range("A1").Resize(UBound(M), UBound(M, 2) + 1) = M ' На лист с кодовым именем Лист1 начиная ......

Да нет же, смысл то понятен. Не понятно откуда такое начало записи:
[vba]
Код

Лист2.Cells.ClearContents
[/vba]
А почему не так:
[vba]
Код
Worksheets("Лист1").Cells.ClearContents
[/vba]
Я просто постигать VBA начал не так давно, и нигде, ни у одного автора такой формы записи не встречал. Вот и стало интересно. Хотя, по большому счёту, теперь не так уж и важно.


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Среда, 15.10.2014, 07:51
 
Ответить
Сообщение
Лист2.Cells.ClearContents ' очистить лист с кодовым именем Лист1 от содержимого.
Лист2.Range("A1").Resize(UBound(M), UBound(M, 2) + 1) = M ' На лист с кодовым именем Лист1 начиная ......

Да нет же, смысл то понятен. Не понятно откуда такое начало записи:
[vba]
Код

Лист2.Cells.ClearContents
[/vba]
А почему не так:
[vba]
Код
Worksheets("Лист1").Cells.ClearContents
[/vba]
Я просто постигать VBA начал не так давно, и нигде, ни у одного автора такой формы записи не встречал. Вот и стало интересно. Хотя, по большому счёту, теперь не так уж и важно.

Автор - Vostok
Дата добавления - 15.10.2014 в 07:33
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сортировка двумерного массива после загрузки .csv файла (Макросы/Sub)
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!