Можно, как у вас, записывать номера листов в столбик, а потом другим макросом быстро раскидывать по листам.
В таблицу можно добавлять сколько угодно служебных столбцов и нет требования, чтобы все выполнялось одним макросом. Очень желательно чтобы код был интуитивно понятен, так как форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные. Лист4 для анализа данных не будет использоваться, я добавил его лишь с целью тестирования правильности разброски данных по листам. По листам распределение данных в процентах будет примерно следующее: лист2 - 90%, лист3 - ~10%, лист4 - ~0%
Можно, как у вас, записывать номера листов в столбик, а потом другим макросом быстро раскидывать по листам.
В таблицу можно добавлять сколько угодно служебных столбцов и нет требования, чтобы все выполнялось одним макросом. Очень желательно чтобы код был интуитивно понятен, так как форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные. Лист4 для анализа данных не будет использоваться, я добавил его лишь с целью тестирования правильности разброски данных по листам. По листам распределение данных в процентах будет примерно следующее: лист2 - 90%, лист3 - ~10%, лист4 - ~0%SergeyKorotun
Сообщение отредактировал SergeyKorotun - Пятница, 12.07.2013, 00:46
форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?
AndreTM, в 3 посте я описал не все условия, а только то, что можно было изменить в 1 посте. Условие с 1 поста "Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку" тоже должно выполняться. В приложенном файле описано, какие строки на какой лист должны попасть и почему.
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, такую, что следующая имеет priz=1, а предыдущая - совпадает с текущей по четырем ключевым столбцам )
форма для экспорта данных в xls еще не подключена и сколько будет столбцов и как они будут называться пока неизвестно и когда ее введут, нужно будет быстро подогнать код под реальные данные
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?
AndreTM, в 3 посте я описал не все условия, а только то, что можно было изменить в 1 посте. Условие с 1 поста "Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку" тоже должно выполняться. В приложенном файле описано, какие строки на какой лист должны попасть и почему.
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, такую, что следующая имеет priz=1, а предыдущая - совпадает с текущей по четырем ключевым столбцам )AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Пятница, 12.07.2013, 01:00
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, если следующая не имеет priz=1 smile )
Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2. Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает. SQl for excel ранжирующие функции не поддерживает?
Цитата
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?
Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.
А кто запрещает обработать дополнительно Лист4? То есть сначала - мы весь список разбиваем на три части (и имеем на Лист4 повторы), а затем - анализируем полученный список и удаляем записи (допустим, достаточно просто найти и удалить каждую запись, если следующая не имеет priz=1 smile )
Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2. Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает. SQl for excel ранжирующие функции не поддерживает?
Цитата
И кто запрещает использовать AS <Имя поля> ? Или вообще - список полей с переименованием?
Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.SergeyKorotun
Сообщение отредактировал SergeyKorotun - Пятница, 12.07.2013, 01:52
Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2. ... Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает ... Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.
1) Не верю. Пример с данными и объяснением, почему именно данная запись должна попасть на Лист2? 2) если priz=0,0 - это это две абсолютно одинаковых строки. Полные дубли, естественно, удаляются (вы же с SQL знакомы, запросы проанализировали?) Я вас незря спрашивал о возможности добавлять поле с уникальным ключом... 3) Какое такое имя столбца неизвестно? Выражайтесь яснее - в примере я увидел имена полей. Совпадающие "" и 0... я понял, явно вы запросы не смотрели
Запись, которую вы предлагаете удалить в листе 4 по условию задачи должна была попасть в лист2. ... Кроме того если три строки различаются только priz, то если он принимает три различных значения ("", 0, 1), то в лист4 попадут все три строки, а если priz={0, 0, 1}, то в лист4 попадает только две строки, а третья пропадает ... Так неизвестно не только имя столбца, но и количество столбцов. А также в некоторых столбцах разные значения (напр. "" и 0) нужно считать совпадающими.
1) Не верю. Пример с данными и объяснением, почему именно данная запись должна попасть на Лист2? 2) если priz=0,0 - это это две абсолютно одинаковых строки. Полные дубли, естественно, удаляются (вы же с SQL знакомы, запросы проанализировали?) Я вас незря спрашивал о возможности добавлять поле с уникальным ключом... 3) Какое такое имя столбца неизвестно? Выражайтесь яснее - в примере я увидел имена полей. Совпадающие "" и 0... я понял, явно вы запросы не смотрели AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Пятница, 12.07.2013, 15:22
В реальных данных столбцов будет побольше и их названия в первой строке будут прописаны, но сколько их будет и как они будут называться, пока не знаю. Поэтому позже макросы придется править. И в вашем макросе мне было бы легче разобраться, чем в макросе 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 правильно распределяет строки по лисам.
В реальных данных столбцов будет побольше и их названия в первой строке будут прописаны, но сколько их будет и как они будут называться, пока не знаю. Поэтому позже макросы придется править. И в вашем макросе мне было бы легче разобраться, чем в макросе 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
да и думаю запросы должны быстрее выполняться чем циклы.
Наверное, нет. На Программерс как-то раз играли в догонялки - словарь с циклами отработал быстрее, чем SQL-запросы (правда, разница была незначительная). И сам код, имхо, проще и короче.
да и думаю запросы должны быстрее выполняться чем циклы.
Наверное, нет. На Программерс как-то раз играли в догонялки - словарь с циклами отработал быстрее, чем SQL-запросы (правда, разница была незначительная). И сам код, имхо, проще и короче.nilem
Поскольку в реальной таблице названия листов будут отличаться от тех, что в примере, решил первый лист переименовать на такой, как в макросе nilem (Sheet1), все остальные листы удалить и создать новые с именами Sheet2, Sheet3, Sheet4. Тогда макрос nilem не нужно будет править для реальной таблицы. Как в процедуре удаления листов подавить сообщения: "В листах, выбранных для удаления, могут существовать данные. Чтобы удалить данные, нажмите кнопку "Удалить"
Поскольку в реальной таблице названия листов будут отличаться от тех, что в примере, решил первый лист переименовать на такой, как в макросе nilem (Sheet1), все остальные листы удалить и создать новые с именами Sheet2, Sheet3, Sheet4. Тогда макрос nilem не нужно будет править для реальной таблицы. Как в процедуре удаления листов подавить сообщения: "В листах, выбранных для удаления, могут существовать данные. Чтобы удалить данные, нажмите кнопку "Удалить"SergeyKorotun
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]
[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
Цельных две недели я ждал, что будет адекватный ответ по поводу "выбрасывания непонятных строчек" . Ну и "ранг" - понятие относительное - вы бы так сразу и заявляли , что "нужно удалить именно и точно первую в списке (sic!)" (причём, что такое "спысок по вашэму - это мы должны догадаться), ибо для SQL нет понятия "номер записи"... и через некоторое время вы очень долго в Excel будете искать, где же вы ошиблись в сортировке. Ну, или загружать четыре ядра пользователя пересчётами
Цельных две недели я ждал, что будет адекватный ответ по поводу "выбрасывания непонятных строчек" . Ну и "ранг" - понятие относительное - вы бы так сразу и заявляли , что "нужно удалить именно и точно первую в списке (sic!)" (причём, что такое "спысок по вашэму - это мы должны догадаться), ибо для SQL нет понятия "номер записи"... и через некоторое время вы очень долго в Excel будете искать, где же вы ошиблись в сортировке. Ну, или загружать четыре ядра пользователя пересчётами AndreTM
Предприятия сдают отчеты. В отчете много строк. Последний столбец priz равен нулю или пустому значению. Но если предприятие нашло в своем отчете в какой то строке ошибку, то оно повторно присылает отчет, в котором один к одному повторяет ошибочные строки, изменяя только значение priz на 1, и добавляет в этот же отчет строки с правильными значениями с priz={0 or ""}, но не все строки с первого отчета, а только те в которых нашли ошибки. priz=1 означает, что в базе нужно найти одну точно такую (а не все) строку, только с priz={0 or ""} и эту пару исключить из выборок. Эти пары и должны попасть на лист4. Они вообще то не нужны, просто я попросил поместить их на отдельный лист чтобы легче было проверить правильность работы макроса. Если строке с priz=1 нет пары с priz={0 or ""}, то предприятие при повторной сдаче отчета снова допустило ошибку (не смогло набрать точно такую же неправильную строку, как и первом отчете). Эти строки помещаем на лист3. Все оставшиеся строки помещаем на лист2.
Ранжирующие функции нумеруют не записи в базе, где действительно нет понятия номера записи, а строки в запросе. А в результате выборки каждая строка имеет свой порядковый номер. Но в этой задаче номера строк не нужно ранжировать. Ранжировать нужно сцепленные значения строк. Пусть у нас есть 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 столбец. А это бы не соответствовало условию задачи.
Предприятия сдают отчеты. В отчете много строк. Последний столбец priz равен нулю или пустому значению. Но если предприятие нашло в своем отчете в какой то строке ошибку, то оно повторно присылает отчет, в котором один к одному повторяет ошибочные строки, изменяя только значение priz на 1, и добавляет в этот же отчет строки с правильными значениями с priz={0 or ""}, но не все строки с первого отчета, а только те в которых нашли ошибки. priz=1 означает, что в базе нужно найти одну точно такую (а не все) строку, только с priz={0 or ""} и эту пару исключить из выборок. Эти пары и должны попасть на лист4. Они вообще то не нужны, просто я попросил поместить их на отдельный лист чтобы легче было проверить правильность работы макроса. Если строке с priz=1 нет пары с priz={0 or ""}, то предприятие при повторной сдаче отчета снова допустило ошибку (не смогло набрать точно такую же неправильную строку, как и первом отчете). Эти строки помещаем на лист3. Все оставшиеся строки помещаем на лист2.
Ранжирующие функции нумеруют не записи в базе, где действительно нет понятия номера записи, а строки в запросе. А в результате выборки каждая строка имеет свой порядковый номер. Но в этой задаче номера строк не нужно ранжировать. Ранжировать нужно сцепленные значения строк. Пусть у нас есть 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
Сообщение отредактировал SergeyKorotun - Воскресенье, 21.07.2013, 03:26
Помогите переделать макрос 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 проставить номера листов, на которые в предыдущем варианте предлагалось скопировать строки.
Помогите переделать макрос 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
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
Запишите сортировку рекордером. Про ограничения по количеству строк в словаре не знаю. Миллион помещался - не хватит? Там думаю скорее может памяти не хватить, если ключи и итемы большие.
Запишите сортировку рекордером. Про ограничения по количеству строк в словаре не знаю. Миллион помещался - не хватит? Там думаю скорее может памяти не хватить, если ключи и итемы большие.Hugo
Записал сортировку рекордером [в модуль1 предпоследняя процедура SortForSetRange()], подправил количество строк, введя переменную r. Сортирует с ошибкой. По крайней мере почему то в BN2:BZ2 пусто. Что не так подправил? Записываю по новому макрос, сравниваю с подправленным, ошибок не нахожу. Распаковывать вместе с подпапкой. Лист заполнится макросом данными с xml файлов.
Записал сортировку рекордером [в модуль1 предпоследняя процедура SortForSetRange()], подправил количество строк, введя переменную r. Сортирует с ошибкой. По крайней мере почему то в BN2:BZ2 пусто. Что не так подправил? Записываю по новому макрос, сравниваю с подправленным, ошибок не нахожу. Распаковывать вместе с подпапкой. Лист заполнится макросом данными с xml файлов.SergeyKorotun
А вполне может быть. У Вас 13 уровней сортировки, т.е. на 13-м уровне, возможно, только пара строк поменяются местами (а может и не поменяются). Чтобы не было пустых строк в BN2, отсортируйте по BN. И для чего такие сложные сортировки?
Сейчас увидел предыдущее сообщение у нас .Header = xlYes, т.е. берем диапазон с заголовками Set r = Range("A1:BZ" & ...
А вполне может быть. У Вас 13 уровней сортировки, т.е. на 13-м уровне, возможно, только пара строк поменяются местами (а может и не поменяются). Чтобы не было пустых строк в BN2, отсортируйте по BN. И для чего такие сложные сортировки?
Сейчас увидел предыдущее сообщение у нас .Header = xlYes, т.е. берем диапазон с заголовками Set r = Range("A1:BZ" & ...nilem
Яндекс.Деньги 4100159601573
Сообщение отредактировал nilem - Суббота, 07.09.2013, 14:43