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

Вход

Регистрация

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

 

= Мир MS Excel/Поиск двух подобных строк и их взаимное удаление - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_  
Поиск двух подобных строк и их взаимное удаление
Serge_007 Дата: Четверг, 11.07.2013, 20:14 | Сообщение № 21
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
сейчас вроде бы нормально
Это я поправил smile

без отступов
Либо их и не было, либо "съелись", когда ты постил. Зная тебя - уверен что второй вариант smile

было совсем не похоже на код - просто текст мелким шрифтом
Ага smile Ты оформил код тегами [sub ][/sub ] для подстрочного оформления текста, вместо [vbа][cоde][/code][/vba] - для кода VBA

ЗЫ Отступы сохраняются только в тегах для VBA


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
сейчас вроде бы нормально
Это я поправил smile

без отступов
Либо их и не было, либо "съелись", когда ты постил. Зная тебя - уверен что второй вариант smile

было совсем не похоже на код - просто текст мелким шрифтом
Ага smile Ты оформил код тегами [sub ][/sub ] для подстрочного оформления текста, вместо [vbа][cоde][/code][/vba] - для кода VBA

ЗЫ Отступы сохраняются только в тегах для VBA

Автор - Serge_007
Дата добавления - 11.07.2013 в 20:14
SergeyKorotun Дата: Пятница, 12.07.2013, 00:25 | Сообщение № 22
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Можно, как у вас, записывать номера листов в столбик, а потом другим макросом быстро раскидывать по листам.

В таблицу можно добавлять сколько угодно служебных столбцов и нет требования, чтобы все выполнялось одним макросом. Очень желательно чтобы код был интуитивно понятен, так как форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные.
Лист4 для анализа данных не будет использоваться, я добавил его лишь с целью тестирования правильности разброски данных по листам.
По листам распределение данных в процентах будет примерно следующее: лист2 - 90%, лист3 - ~10%, лист4 - ~0%


Сообщение отредактировал SergeyKorotun - Пятница, 12.07.2013, 00:46
 
Ответить
Сообщение
Можно, как у вас, записывать номера листов в столбик, а потом другим макросом быстро раскидывать по листам.

В таблицу можно добавлять сколько угодно служебных столбцов и нет требования, чтобы все выполнялось одним макросом. Очень желательно чтобы код был интуитивно понятен, так как форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные.
Лист4 для анализа данных не будет использоваться, я добавил его лишь с целью тестирования правильности разброски данных по листам.
По листам распределение данных в процентах будет примерно следующее: лист2 - 90%, лист3 - ~10%, лист4 - ~0%

Автор - SergeyKorotun
Дата добавления - 12.07.2013 в 00:25
AndreTM Дата: Пятница, 12.07.2013, 00:45 | Сообщение № 23
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Цитата (SergeyKorotun, Пятница, 12.07.2013, 00:25 # 22)
форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?

Цитата (SergeyKorotun, Четверг, 11.07.2013, 16:26 # 15)
AndreTM, в 3 посте я описал не все условия, а только то, что можно было изменить в 1 посте. Условие с 1 поста "Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку" тоже должно выполняться. В приложенном файле описано, какие строки на какой лист должны попасть и почему.
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, такую, что следующая имеет priz=1, а предыдущая - совпадает с текущей по четырем ключевым столбцам smile )


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


Сообщение отредактировал AndreTM - Пятница, 12.07.2013, 01:00
 
Ответить
Сообщение
Цитата (SergeyKorotun, Пятница, 12.07.2013, 00:25 # 22)
форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?

Цитата (SergeyKorotun, Четверг, 11.07.2013, 16:26 # 15)
AndreTM, в 3 посте я описал не все условия, а только то, что можно было изменить в 1 посте. Условие с 1 поста "Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку" тоже должно выполняться. В приложенном файле описано, какие строки на какой лист должны попасть и почему.
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, такую, что следующая имеет priz=1, а предыдущая - совпадает с текущей по четырем ключевым столбцам smile )

Автор - AndreTM
Дата добавления - 12.07.2013 в 00:45
SergeyKorotun Дата: Пятница, 12.07.2013, 01:12 | Сообщение № 24
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, если следующая не имеет priz=1 smile )

Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2.
Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает.
SQl for excel ранжирующие функции не поддерживает?
Цитата
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?

Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.


Сообщение отредактировал SergeyKorotun - Пятница, 12.07.2013, 01:52
 
Ответить
Сообщение
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, если следующая не имеет priz=1 smile )

Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2.
Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает.
SQl for excel ранжирующие функции не поддерживает?
Цитата
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?

Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.

Автор - SergeyKorotun
Дата добавления - 12.07.2013 в 01:12
AndreTM Дата: Пятница, 12.07.2013, 15:18 | Сообщение № 25
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2.
...
Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает
...
Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.


1) Не верю. Пример с данными и объяснением, почему именно данная запись должна попасть на Лист2?
2) если priz=0,0 - это это две абсолютно одинаковых строки. Полные дубли, естественно, удаляются (вы же с SQL знакомы, запросы проанализировали?)
Я вас незря спрашивал о возможности добавлять поле с уникальным ключом...
3) Какое такое имя столбца неизвестно? Выражайтесь яснее - в примере я увидел имена полей. Совпадающие "" и 0... я понял, явно вы запросы не смотрели smile


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


Сообщение отредактировал AndreTM - Пятница, 12.07.2013, 15:22
 
Ответить
Сообщение
Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2.
...
Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает
...
Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.


1) Не верю. Пример с данными и объяснением, почему именно данная запись должна попасть на Лист2?
2) если priz=0,0 - это это две абсолютно одинаковых строки. Полные дубли, естественно, удаляются (вы же с SQL знакомы, запросы проанализировали?)
Я вас незря спрашивал о возможности добавлять поле с уникальным ключом...
3) Какое такое имя столбца неизвестно? Выражайтесь яснее - в примере я увидел имена полей. Совпадающие "" и 0... я понял, явно вы запросы не смотрели smile

Автор - AndreTM
Дата добавления - 12.07.2013 в 15:18
SergeyKorotun Дата: Суббота, 13.07.2013, 18:17 | Сообщение № 26
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
AndreTM, макрос nilem с сообщения 16 правильно распределяет строки по лисам.
1) Не верю. Пример с данными и объяснением, почему именно данная запись должна попасть на Лист2?
Условие задачи такое.
2) если priz=0,0 - это это две абсолютно одинаковых строки. Полные дубли, естественно, удаляются
Строка с priz=1 должна удалить только 1 соответствующую строку с priz=0 или priz="", а не все эти строки. Такое условие задачи.
Я вас незря спрашивал о возможности добавлять поле с уникальным ключом...
Никаких ограничений на добавление служебной информации нет.
3) Какое такое имя столбца неизвестно?
В реальных данных столбцов будет побольше и их названия в первой строке будут прописаны, но сколько их будет и как они будут называться, пока не знаю. Поэтому позже макросы придется править. И в вашем макросе мне было бы легче разобраться, чем в макросе nilem, да и думаю запросы должны быстрее выполняться чем циклы.

Пусть есть три строки
12345 0
12345 0
12345 1
Третья строка должна уничтожить или первую, или вторую, но не обе.
Для этого строки нужно проранжировать, т.е. разбить на группы по столбцу priz и каждую группу пронумеровать начиная с 1:
12345 0 1
12345 0 2
12345 1 1
дальше ранг сцепляем с строкой:
123451 0
123452 0
123451 1
После этого ваш макрос после добавления в его запросы еще и ранга скорее б всего выдавал результат, соответствующий условию задачи.
 
Ответить
СообщениеAndreTM, макрос nilem с сообщения 16 правильно распределяет строки по лисам.
1) Не верю. Пример с данными и объяснением, почему именно данная запись должна попасть на Лист2?
Условие задачи такое.
2) если priz=0,0 - это это две абсолютно одинаковых строки. Полные дубли, естественно, удаляются
Строка с priz=1 должна удалить только 1 соответствующую строку с priz=0 или priz="", а не все эти строки. Такое условие задачи.
Я вас незря спрашивал о возможности добавлять поле с уникальным ключом...
Никаких ограничений на добавление служебной информации нет.
3) Какое такое имя столбца неизвестно?
В реальных данных столбцов будет побольше и их названия в первой строке будут прописаны, но сколько их будет и как они будут называться, пока не знаю. Поэтому позже макросы придется править. И в вашем макросе мне было бы легче разобраться, чем в макросе nilem, да и думаю запросы должны быстрее выполняться чем циклы.

Пусть есть три строки
12345 0
12345 0
12345 1
Третья строка должна уничтожить или первую, или вторую, но не обе.
Для этого строки нужно проранжировать, т.е. разбить на группы по столбцу priz и каждую группу пронумеровать начиная с 1:
12345 0 1
12345 0 2
12345 1 1
дальше ранг сцепляем с строкой:
123451 0
123452 0
123451 1
После этого ваш макрос после добавления в его запросы еще и ранга скорее б всего выдавал результат, соответствующий условию задачи.

Автор - SergeyKorotun
Дата добавления - 13.07.2013 в 18:17
nilem Дата: Суббота, 13.07.2013, 19:00 | Сообщение № 27
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
да и думаю запросы должны быстрее выполняться чем циклы.

Наверное, нет. На Программерс как-то раз играли в догонялки - словарь с циклами отработал быстрее, чем SQL-запросы (правда, разница была незначительная).
И сам код, имхо, проще и короче.


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
да и думаю запросы должны быстрее выполняться чем циклы.

Наверное, нет. На Программерс как-то раз играли в догонялки - словарь с циклами отработал быстрее, чем SQL-запросы (правда, разница была незначительная).
И сам код, имхо, проще и короче.

Автор - nilem
Дата добавления - 13.07.2013 в 19:00
SergeyKorotun Дата: Воскресенье, 21.07.2013, 00:02 | Сообщение № 28
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Поскольку в реальной таблице названия листов будут отличаться от тех, что в примере, решил первый лист переименовать на такой, как в макросе nilem (Sheet1), все остальные листы удалить и создать новые с именами Sheet2, Sheet3, Sheet4. Тогда макрос nilem не нужно будет править для реальной таблицы.
Как в процедуре удаления листов подавить сообщения: "В листах, выбранных для удаления, могут существовать данные. Чтобы удалить данные, нажмите кнопку "Удалить"
К сообщению приложен файл: test_macros.xlsm (27.4 Kb)
 
Ответить
СообщениеПоскольку в реальной таблице названия листов будут отличаться от тех, что в примере, решил первый лист переименовать на такой, как в макросе nilem (Sheet1), все остальные листы удалить и создать новые с именами Sheet2, Sheet3, Sheet4. Тогда макрос nilem не нужно будет править для реальной таблицы.
Как в процедуре удаления листов подавить сообщения: "В листах, выбранных для удаления, могут существовать данные. Чтобы удалить данные, нажмите кнопку "Удалить"

Автор - SergeyKorotun
Дата добавления - 21.07.2013 в 00:02
RAN Дата: Воскресенье, 21.07.2013, 00:09 | Сообщение № 29
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
Private Sub deleteSheet()
Dim i As Integer
Dim e As Integer
e = ActiveWorkbook.Sheets.Count
Application.DisplayAlerts = False
For i = 2 To e
Sheets(2).Delete
Next i
Application.DisplayAlerts = True
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Воскресенье, 21.07.2013, 00:09
 
Ответить
Сообщение[vba]
Код
Private Sub deleteSheet()
Dim i As Integer
Dim e As Integer
e = ActiveWorkbook.Sheets.Count
Application.DisplayAlerts = False
For i = 2 To e
Sheets(2).Delete
Next i
Application.DisplayAlerts = True
End Sub
[/vba]

Автор - RAN
Дата добавления - 21.07.2013 в 00:09
AndreTM Дата: Воскресенье, 21.07.2013, 01:41 | Сообщение № 30
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Цельных две недели я ждал, что будет адекватный ответ по поводу "выбрасывания непонятных строчек" .
Ну и "ранг" - понятие относительное - вы бы так сразу и заявляли , что "нужно удалить именно и точно первую в списке (sic!)" (причём, что такое "спысок по вашэму - это мы должны догадаться), ибо для SQL нет понятия "номер записи"... и через некоторое время вы очень долго в Excel будете искать, где же вы ошиблись в сортировке.
Ну, или загружать четыре ядра пользователя пересчётами smile


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеЦельных две недели я ждал, что будет адекватный ответ по поводу "выбрасывания непонятных строчек" .
Ну и "ранг" - понятие относительное - вы бы так сразу и заявляли , что "нужно удалить именно и точно первую в списке (sic!)" (причём, что такое "спысок по вашэму - это мы должны догадаться), ибо для SQL нет понятия "номер записи"... и через некоторое время вы очень долго в Excel будете искать, где же вы ошиблись в сортировке.
Ну, или загружать четыре ядра пользователя пересчётами smile

Автор - AndreTM
Дата добавления - 21.07.2013 в 01:41
SergeyKorotun Дата: Воскресенье, 21.07.2013, 03:22 | Сообщение № 31
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
выбрасывания непонятных строчек
Не понял про какие строчки вы написали.

Предприятия сдают отчеты. В отчете много строк. Последний столбец priz равен нулю или пустому значению. Но если предприятие нашло в своем отчете в какой то строке ошибку, то оно повторно присылает отчет, в котором один к одному повторяет ошибочные строки, изменяя только значение priz на 1, и добавляет в этот же отчет строки с правильными значениями с priz={0 or ""}, но не все строки с первого отчета, а только те в которых нашли ошибки.
priz=1 означает, что в базе нужно найти одну точно такую (а не все) строку, только с priz={0 or ""} и эту пару исключить из выборок. Эти пары и должны попасть на лист4. Они вообще то не нужны, просто я попросил поместить их на отдельный лист чтобы легче было проверить правильность работы макроса.
Если строке с priz=1 нет пары с priz={0 or ""}, то предприятие при повторной сдаче отчета снова допустило ошибку (не смогло набрать точно такую же неправильную строку, как и первом отчете). Эти строки помещаем на лист3.
Все оставшиеся строки помещаем на лист2.

ибо для SQL нет понятия "номер записи"
Ранжирующие функции нумеруют не записи в базе, где действительно нет понятия номера записи, а строки в запросе. А в результате выборки каждая строка имеет свой порядковый номер. Но в этой задаче номера строк не нужно ранжировать. Ранжировать нужно сцепленные значения строк. Пусть у нас есть 5 столбцов, последний столбец priz
1 1 1 1 0
1 1 1 1 0
1 1 1 2 0
1 1 1 3 0
1 1 1 3 0
1 1 1 3 0
1 1 1 4 0
1 1 1 5 0
1 1 1 3 1
1 1 1 3 1
1 1 1 1 1
Делим эти строки на две группы (в 1 группе priz=0, во 2 - 1). После этого обе группы делим на подгруппы. В подгруппы включаются те строки, у которых значения в первых 4 столбцах одинаковые. Затем каждую подгруппу пронумеровываем, начиная с 1. Это и будет ранг (6 столбец):
1 1 1 1 0 1
1 1 1 1 0 2
1 1 1 2 0 1
1 1 1 3 0 1
1 1 1 3 0 2
1 1 1 3 0 3
1 1 1 4 0 1
1 1 1 5 0 1
1 1 1 3 1 1
1 1 1 3 1 2
1 1 1 1 1 1
Дальше берем первую строку с priz=1 сцепляем в ней значения с 1,2,3,4 и 6 столбцов и ищем точно такое же сцепленное значения среди строк с priz=0 и если находим, помещаем обе строки на лист4, если не находим, то строку помещаем на лист3.
Введение 6 столбца не даст запросу найти более одной строки с priz=0 для строки с priz=1. То есть 3 строке снизу будет соответствовать только 4 строка сверху, а не 4,5 и 6.
4,5 и 6 соответствовали бы 3 снизу, если бы не был введен 6 столбец. А это бы не соответствовало условию задачи.


Сообщение отредактировал SergeyKorotun - Воскресенье, 21.07.2013, 03:26
 
Ответить
Сообщение
выбрасывания непонятных строчек
Не понял про какие строчки вы написали.

Предприятия сдают отчеты. В отчете много строк. Последний столбец priz равен нулю или пустому значению. Но если предприятие нашло в своем отчете в какой то строке ошибку, то оно повторно присылает отчет, в котором один к одному повторяет ошибочные строки, изменяя только значение priz на 1, и добавляет в этот же отчет строки с правильными значениями с priz={0 or ""}, но не все строки с первого отчета, а только те в которых нашли ошибки.
priz=1 означает, что в базе нужно найти одну точно такую (а не все) строку, только с priz={0 or ""} и эту пару исключить из выборок. Эти пары и должны попасть на лист4. Они вообще то не нужны, просто я попросил поместить их на отдельный лист чтобы легче было проверить правильность работы макроса.
Если строке с priz=1 нет пары с priz={0 or ""}, то предприятие при повторной сдаче отчета снова допустило ошибку (не смогло набрать точно такую же неправильную строку, как и первом отчете). Эти строки помещаем на лист3.
Все оставшиеся строки помещаем на лист2.

ибо для SQL нет понятия "номер записи"
Ранжирующие функции нумеруют не записи в базе, где действительно нет понятия номера записи, а строки в запросе. А в результате выборки каждая строка имеет свой порядковый номер. Но в этой задаче номера строк не нужно ранжировать. Ранжировать нужно сцепленные значения строк. Пусть у нас есть 5 столбцов, последний столбец priz
1 1 1 1 0
1 1 1 1 0
1 1 1 2 0
1 1 1 3 0
1 1 1 3 0
1 1 1 3 0
1 1 1 4 0
1 1 1 5 0
1 1 1 3 1
1 1 1 3 1
1 1 1 1 1
Делим эти строки на две группы (в 1 группе priz=0, во 2 - 1). После этого обе группы делим на подгруппы. В подгруппы включаются те строки, у которых значения в первых 4 столбцах одинаковые. Затем каждую подгруппу пронумеровываем, начиная с 1. Это и будет ранг (6 столбец):
1 1 1 1 0 1
1 1 1 1 0 2
1 1 1 2 0 1
1 1 1 3 0 1
1 1 1 3 0 2
1 1 1 3 0 3
1 1 1 4 0 1
1 1 1 5 0 1
1 1 1 3 1 1
1 1 1 3 1 2
1 1 1 1 1 1
Дальше берем первую строку с priz=1 сцепляем в ней значения с 1,2,3,4 и 6 столбцов и ищем точно такое же сцепленное значения среди строк с priz=0 и если находим, помещаем обе строки на лист4, если не находим, то строку помещаем на лист3.
Введение 6 столбца не даст запросу найти более одной строки с priz=0 для строки с priz=1. То есть 3 строке снизу будет соответствовать только 4 строка сверху, а не 4,5 и 6.
4,5 и 6 соответствовали бы 3 снизу, если бы не был введен 6 столбец. А это бы не соответствовало условию задачи.

Автор - SergeyKorotun
Дата добавления - 21.07.2013 в 03:22
SergeyKorotun Дата: Вторник, 03.09.2013, 17:34 | Сообщение № 32
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Помогите переделать макрос nilem из 16-го сообщения под приложенный в этом сообщении файл или создать новый. В модуле 1 нужно создать процедуру RaskidkaPoListam
[vba]
Код
Sub Start()
      Call OpenXmlFile
      Call SetFormatColumns
      Call handleXls
''''Call RaskidkaPoListam
End Sub
[/vba] которая:
1) две сроки, в которых совпадают значения в колонках P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY, и не совпадают значения в AW (может быть равно либо 0, либо 1) скопирует на Лист4. Если одной стоке с AW=0 соответствует несколько строк с AW=1, копировать нужно только две строки (одну с AW=0 и одну с AW=1). И наоборот, если одной стоке с AW=1 соответствует несколько строк с AW=0, также копировать только две строки.
2) те строки, в которых AW=1 и для которых нет пары с AW=0 с такими же значениями в P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY скопировать на Лист5
3) Оставшиеся строки скопировать на Лист3

Строк с AW=1 на порядок меньше, чем строк с AW=0

Если в 1 и 2 пунктах заменить скопировать на перенести, то 3 пункт выполнить не нужно.
Подошло бы и такое решение: ничто никуда не носить, а в колонке CA проставить номера листов, на которые в предыдущем варианте предлагалось скопировать строки.
К сообщению приложен файл: XLS.rar (68.3 Kb)


Сообщение отредактировал SergeyKorotun - Вторник, 03.09.2013, 17:52
 
Ответить
СообщениеПомогите переделать макрос nilem из 16-го сообщения под приложенный в этом сообщении файл или создать новый. В модуле 1 нужно создать процедуру RaskidkaPoListam
[vba]
Код
Sub Start()
      Call OpenXmlFile
      Call SetFormatColumns
      Call handleXls
''''Call RaskidkaPoListam
End Sub
[/vba] которая:
1) две сроки, в которых совпадают значения в колонках P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY, и не совпадают значения в AW (может быть равно либо 0, либо 1) скопирует на Лист4. Если одной стоке с AW=0 соответствует несколько строк с AW=1, копировать нужно только две строки (одну с AW=0 и одну с AW=1). И наоборот, если одной стоке с AW=1 соответствует несколько строк с AW=0, также копировать только две строки.
2) те строки, в которых AW=1 и для которых нет пары с AW=0 с такими же значениями в P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY скопировать на Лист5
3) Оставшиеся строки скопировать на Лист3

Строк с AW=1 на порядок меньше, чем строк с AW=0

Если в 1 и 2 пунктах заменить скопировать на перенести, то 3 пункт выполнить не нужно.
Подошло бы и такое решение: ничто никуда не носить, а в колонке CA проставить номера листов, на которые в предыдущем варианте предлагалось скопировать строки.

Автор - SergeyKorotun
Дата добавления - 03.09.2013 в 17:34
SergeyKorotun Дата: Среда, 04.09.2013, 12:41 | Сообщение № 33
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
1. Как пронумеровать по порядку строки с одинаковыми значениями P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY, AW?
Нумерацию каждой группы начинать с 1.
2. Есть ли ограничения в Scripting.Dictionary на количество строк?
 
Ответить
Сообщение1. Как пронумеровать по порядку строки с одинаковыми значениями P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY, AW?
Нумерацию каждой группы начинать с 1.
2. Есть ли ограничения в Scripting.Dictionary на количество строк?

Автор - SergeyKorotun
Дата добавления - 04.09.2013 в 12:41
SergeyKorotun Дата: Четверг, 05.09.2013, 00:39 | Сообщение № 34
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Ну хотя бы это: как все строки, кроме первой, отсортировать по P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY, AW?
 
Ответить
СообщениеНу хотя бы это: как все строки, кроме первой, отсортировать по P, Y, Z, AE, AG, AI, AK, AM, AO, AQ, AS, AY, AW?

Автор - SergeyKorotun
Дата добавления - 05.09.2013 в 00:39
Hugo Дата: Четверг, 05.09.2013, 00:57 | Сообщение № 35
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3703
Репутация: 792 ±
Замечаний: 0% ±

365
Запишите сортировку рекордером.
Про ограничения по количеству строк в словаре не знаю. Миллион помещался - не хватит?
Там думаю скорее может памяти не хватить, если ключи и итемы большие.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЗапишите сортировку рекордером.
Про ограничения по количеству строк в словаре не знаю. Миллион помещался - не хватит?
Там думаю скорее может памяти не хватить, если ключи и итемы большие.

Автор - Hugo
Дата добавления - 05.09.2013 в 00:57
SergeyKorotun Дата: Суббота, 07.09.2013, 04:24 | Сообщение № 36
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Записал сортировку рекордером [в модуль1 предпоследняя процедура SortForSetRange()], подправил количество строк, введя переменную r. Сортирует с ошибкой. По крайней мере почему то в BN2:BZ2 пусто. Что не так подправил? Записываю по новому макрос, сравниваю с подправленным, ошибок не нахожу.
Распаковывать вместе с подпапкой. Лист заполнится макросом данными с xml файлов.
К сообщению приложен файл: 6162221.rar (58.1 Kb)
 
Ответить
СообщениеЗаписал сортировку рекордером [в модуль1 предпоследняя процедура SortForSetRange()], подправил количество строк, введя переменную r. Сортирует с ошибкой. По крайней мере почему то в BN2:BZ2 пусто. Что не так подправил? Записываю по новому макрос, сравниваю с подправленным, ошибок не нахожу.
Распаковывать вместе с подпапкой. Лист заполнится макросом данными с xml файлов.

Автор - SergeyKorotun
Дата добавления - 07.09.2013 в 04:24
nilem Дата: Суббота, 07.09.2013, 07:23 | Сообщение № 37
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
попробуйте так
[vba]
Код
Sub SortForSetRange()
Dim r As Range: Set r = Range("A1:BZ" & Cells(Rows.Count, 1).End(xlUp).Row)
Application.ScreenUpdating = False
With ActiveSheet.Sort
      With .SortFields
          .Clear
          .Add Key:=r.Columns(26), Order:=xlAscending  'Z
          .Add Key:=r.Columns(25), Order:=xlAscending  'Y
          .Add Key:=r.Columns(16), Order:=xlAscending  'P
          .Add Key:=r.Columns(31), Order:=xlAscending  'AE
          .Add Key:=r.Columns(33), Order:=xlAscending  'AG
          .Add Key:=r.Columns(35), Order:=xlAscending  'AI
          .Add Key:=r.Columns(37), Order:=xlAscending  'AK
          .Add Key:=r.Columns(39), Order:=xlAscending  'AM
          .Add Key:=r.Columns(41), Order:=xlAscending  'AO
          .Add Key:=r.Columns(43), Order:=xlAscending  'AQ
          .Add Key:=r.Columns(45), Order:=xlAscending  'AS
          .Add Key:=r.Columns(47), Order:=xlAscending  'AU
          .Add Key:=r.Columns(49), Order:=xlAscending  'AW
      End With
      .SetRange r
      .Header = xlYes
      .Apply
End With: Application.ScreenUpdating = True
End Sub
[/vba]
xlAscending скорее всего по умолчанию (что-то не уверен), можно не указывать, наверное
Взято из полезных приемов :)

Кстати, в Sub InsertHeader() можно без цикла
[vba]
Код
Dim arr
    arr = Array("TIN", "C_DOC", ... )
    ThisWorkbook.Sheets(1).Range("A1").Resize(, UBound(arr) + 1).Value = arr
[/vba]


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Суббота, 07.09.2013, 07:31
 
Ответить
Сообщениепопробуйте так
[vba]
Код
Sub SortForSetRange()
Dim r As Range: Set r = Range("A1:BZ" & Cells(Rows.Count, 1).End(xlUp).Row)
Application.ScreenUpdating = False
With ActiveSheet.Sort
      With .SortFields
          .Clear
          .Add Key:=r.Columns(26), Order:=xlAscending  'Z
          .Add Key:=r.Columns(25), Order:=xlAscending  'Y
          .Add Key:=r.Columns(16), Order:=xlAscending  'P
          .Add Key:=r.Columns(31), Order:=xlAscending  'AE
          .Add Key:=r.Columns(33), Order:=xlAscending  'AG
          .Add Key:=r.Columns(35), Order:=xlAscending  'AI
          .Add Key:=r.Columns(37), Order:=xlAscending  'AK
          .Add Key:=r.Columns(39), Order:=xlAscending  'AM
          .Add Key:=r.Columns(41), Order:=xlAscending  'AO
          .Add Key:=r.Columns(43), Order:=xlAscending  'AQ
          .Add Key:=r.Columns(45), Order:=xlAscending  'AS
          .Add Key:=r.Columns(47), Order:=xlAscending  'AU
          .Add Key:=r.Columns(49), Order:=xlAscending  'AW
      End With
      .SetRange r
      .Header = xlYes
      .Apply
End With: Application.ScreenUpdating = True
End Sub
[/vba]
xlAscending скорее всего по умолчанию (что-то не уверен), можно не указывать, наверное
Взято из полезных приемов :)

Кстати, в Sub InsertHeader() можно без цикла
[vba]
Код
Dim arr
    arr = Array("TIN", "C_DOC", ... )
    ThisWorkbook.Sheets(1).Range("A1").Resize(, UBound(arr) + 1).Value = arr
[/vba]

Автор - nilem
Дата добавления - 07.09.2013 в 07:23
SergeyKorotun Дата: Суббота, 07.09.2013, 14:23 | Сообщение № 38
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
попробуйте так
ничего не изменилось, как были в конце второй строки пустые ячейки, так и остались.
 
Ответить
Сообщение
попробуйте так
ничего не изменилось, как были в конце второй строки пустые ячейки, так и остались.

Автор - SergeyKorotun
Дата добавления - 07.09.2013 в 14:23
SergeyKorotun Дата: Суббота, 07.09.2013, 14:31 | Сообщение № 39
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
Изменил
[vba]
Код
Set r = Range("A1:BZ" & Cells(Rows.Count, 1).End(xlUp).Row)
[/vba]на
[vba]
Код
Set r = Range("A2:BZ" & Cells(Rows.Count, 1).End(xlUp).Row)
[/vba]пустых ячеек не стало, но верна ли сортировка - надо анализировать, а это не просто в таком диапазоне.


Сообщение отредактировал SergeyKorotun - Суббота, 07.09.2013, 14:32
 
Ответить
СообщениеИзменил
[vba]
Код
Set r = Range("A1:BZ" & Cells(Rows.Count, 1).End(xlUp).Row)
[/vba]на
[vba]
Код
Set r = Range("A2:BZ" & Cells(Rows.Count, 1).End(xlUp).Row)
[/vba]пустых ячеек не стало, но верна ли сортировка - надо анализировать, а это не просто в таком диапазоне.

Автор - SergeyKorotun
Дата добавления - 07.09.2013 в 14:31
nilem Дата: Суббота, 07.09.2013, 14:41 | Сообщение № 40
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
А вполне может быть. У Вас 13 уровней сортировки, т.е. на 13-м уровне, возможно, только пара строк поменяются местами (а может и не поменяются).
Чтобы не было пустых строк в BN2, отсортируйте по BN.
И для чего такие сложные сортировки?

Сейчас увидел предыдущее сообщение
у нас .Header = xlYes, т.е. берем диапазон с заголовками Set r = Range("A1:BZ" & ...


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Суббота, 07.09.2013, 14:43
 
Ответить
СообщениеА вполне может быть. У Вас 13 уровней сортировки, т.е. на 13-м уровне, возможно, только пара строк поменяются местами (а может и не поменяются).
Чтобы не было пустых строк в BN2, отсортируйте по BN.
И для чего такие сложные сортировки?

Сейчас увидел предыдущее сообщение
у нас .Header = xlYes, т.е. берем диапазон с заголовками Set r = Range("A1:BZ" & ...

Автор - nilem
Дата добавления - 07.09.2013 в 14:41
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

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