Доброго времени суток уважаемые экселисты. В книге 2 листа: лист с данными (до 1000 строк) и шаблон. Нужно создать листы с именами из столбца А листа данных, копируя на эти листы шаблон. При этом в шаблоне в ячейку А1 устанавливать значение равное названию создаваемого листа. Так же созданный лист нужно сохранить в текст с табуляцией. Т.е. кол-во строк в листе с данными = кол-ву .txt файлов и = кол-во добавленных листов. На основе макросов, найденых на этом форуме, составил под это дело свой. Работает, но некорректно. Кол-во созданных листов получается 56 и не больше, первые 55 листов создаются праильно, а затем сразу идет последний лист. При этом кол-во файлов правильное, но начиная с 57го файла и до конца повторяются данные из 56го. Долблюсь второй день, и кажется, что в открытую дверь. Помогите пожалуйста разобраться где тут собака порылась. Файл как не крутил, но меньше 120Kb никак не выходит, поэтому не прикладываю. Вот макрос: [vba]
Код
Sub Macros4() Application.ScreenUpdating = False Dim i As Long Dim p_ As String For i = 1 To Sheets("Vars").Range("A" & Rows.Count).End(xlUp).Row On Error Resume Next Sheets(Sheets("Vars").Range("A" & i).Value).Select If Err And Sheets("Vars").Range("A" & i) <> "" Then Sheets("Шаблон").Cells(1, 1).Value = Sheets("Vars").Range("A" & i).Value 'дата в шаблон Sheets("Шаблон").copy After:=Sheets(Sheets.Count) ActiveSheet.name = Sheets("Vars").Range("A" & i) p_ = "C:\Users\23Digger\Desktop\TEST\" & ActiveSheet.name & ".txt" ActiveWorkbook.SaveAs Filename:=p_, FileFormat:=xlText, CreateBackup:=False End If Next i Worksheets("Vars").Activate ActiveWorkbook.SaveAs Filename:="C:\Users\23Digger\Desktop\TEST\TEST.xls", FileFormat:=xlNormal, CreateBackup:=False Application.ScreenUpdating = True End Sub
[/vba]
Доброго времени суток уважаемые экселисты. В книге 2 листа: лист с данными (до 1000 строк) и шаблон. Нужно создать листы с именами из столбца А листа данных, копируя на эти листы шаблон. При этом в шаблоне в ячейку А1 устанавливать значение равное названию создаваемого листа. Так же созданный лист нужно сохранить в текст с табуляцией. Т.е. кол-во строк в листе с данными = кол-ву .txt файлов и = кол-во добавленных листов. На основе макросов, найденых на этом форуме, составил под это дело свой. Работает, но некорректно. Кол-во созданных листов получается 56 и не больше, первые 55 листов создаются праильно, а затем сразу идет последний лист. При этом кол-во файлов правильное, но начиная с 57го файла и до конца повторяются данные из 56го. Долблюсь второй день, и кажется, что в открытую дверь. Помогите пожалуйста разобраться где тут собака порылась. Файл как не крутил, но меньше 120Kb никак не выходит, поэтому не прикладываю. Вот макрос: [vba]
Код
Sub Macros4() Application.ScreenUpdating = False Dim i As Long Dim p_ As String For i = 1 To Sheets("Vars").Range("A" & Rows.Count).End(xlUp).Row On Error Resume Next Sheets(Sheets("Vars").Range("A" & i).Value).Select If Err And Sheets("Vars").Range("A" & i) <> "" Then Sheets("Шаблон").Cells(1, 1).Value = Sheets("Vars").Range("A" & i).Value 'дата в шаблон Sheets("Шаблон").copy After:=Sheets(Sheets.Count) ActiveSheet.name = Sheets("Vars").Range("A" & i) p_ = "C:\Users\23Digger\Desktop\TEST\" & ActiveSheet.name & ".txt" ActiveWorkbook.SaveAs Filename:=p_, FileFormat:=xlText, CreateBackup:=False End If Next i Worksheets("Vars").Activate ActiveWorkbook.SaveAs Filename:="C:\Users\23Digger\Desktop\TEST\TEST.xls", FileFormat:=xlNormal, CreateBackup:=False Application.ScreenUpdating = True End Sub
Кол-во созданных листов получается 56 и не больше, первые 55 листов создаются праильно, а затем сразу идет последний лист. При этом кол-во файлов правильное, но начиная с 57го файла и до конца повторяются данные из 56го.
Погуглил немного. Оказывается, это распространенная проблема. Формально количество листов ограничено возможностями компьютера. Но проблемы после 50 листов возникают довольно часто. Может быть, есть смысл изменить принцип организации информации? Если нельзя объединить информацию на разных листах (хотя наверняка есть варианты), то, например, распределять в несколько новых книг?
Кол-во созданных листов получается 56 и не больше, первые 55 листов создаются праильно, а затем сразу идет последний лист. При этом кол-во файлов правильное, но начиная с 57го файла и до конца повторяются данные из 56го.
Погуглил немного. Оказывается, это распространенная проблема. Формально количество листов ограничено возможностями компьютера. Но проблемы после 50 листов возникают довольно часто. Может быть, есть смысл изменить принцип организации информации? Если нельзя объединить информацию на разных листах (хотя наверняка есть варианты), то, например, распределять в несколько новых книг?alex1248
Распределять выходные данные - это вариант, спасибо за совет. Если не добью, придётся. Всё же хочется понять причину, ведь используя добавление листов [vba]
[/vba], кол-во листов нужное и названия верные, но при этом у меня не получается прикрутить копирование шаблона в лист и выгрузку в текст. Это именно копирование вызывает такую проблему? Если копирование, то можно ли, используя Add, огранизовать требуемое?
Распределять выходные данные - это вариант, спасибо за совет. Если не добью, придётся. Всё же хочется понять причину, ведь используя добавление листов [vba]
[/vba], кол-во листов нужное и названия верные, но при этом у меня не получается прикрутить копирование шаблона в лист и выгрузку в текст. Это именно копирование вызывает такую проблему? Если копирование, то можно ли, используя Add, огранизовать требуемое?Digger23
при этом у меня не получается прикрутить копирование шаблона в лист и выгрузку в текст. Это именно копирование вызывает такую проблему?
Я понял так, что проблему вызывает само создание листов. Увы, но в прочитанном я не увидел способа решения проблемы. А по поводу остального, да, лучше бы файлик приложить, архиватор в помощь.
при этом у меня не получается прикрутить копирование шаблона в лист и выгрузку в текст. Это именно копирование вызывает такую проблему?
Я понял так, что проблему вызывает само создание листов. Увы, но в прочитанном я не увидел способа решения проблемы. А по поводу остального, да, лучше бы файлик приложить, архиватор в помощь.alex1248
Насчет архиватора это да. Лицорука. Заработался. А проблему вызывает похоже все же не само создание листов, в приложенном файле Add создает все листы, а вот Copy как я описал в первом посте. Или это код у меня кривой?.
Насчет архиватора это да. Лицорука. Заработался. А проблему вызывает похоже все же не само создание листов, в приложенном файле Add создает все листы, а вот Copy как я описал в первом посте. Или это код у меня кривой?.Digger23
Там не обязательно дата, под рукой файл был, копирнул столбец и всё. Не из-за даты же такое получается? Если из-за даты - можно подставить все что угодно. Тип данных в ячейках влияет на результат? Минута - разве это время .
Там не обязательно дата, под рукой файл был, копирнул столбец и всё. Не из-за даты же такое получается? Если из-за даты - можно подставить все что угодно. Тип данных в ячейках влияет на результат? Минута - разве это время .Digger23
Сообщение отредактировал Digger23 - Вторник, 23.09.2014, 01:38
Всмысле у вас работает как надо? И листы все (не 56), и в файлах нужные данные? А зависания да, пережидал конечно, кнопку нажал и пока не выполниться - ничего не трогал.
Всмысле у вас работает как надо? И листы все (не 56), и в файлах нужные данные? А зависания да, пережидал конечно, кнопку нажал и пока не выполниться - ничего не трогал.Digger23
А у меня 2-й макрос вообще ничего не изменил, причем довольно быстро прекратил работу (1-й отработал как надо и тоже быстро). Digger23, а вот это [vba]
Код
Sheets("Шаблон").copy After:=Sheets(Sheets.Count)
[/vba] во 2-м макросе для чего? Это же копирование ЛИСТА шаблона с последующей вставкой в него данных. У вас 2-й макрос дублирует то, что уже сделал 1-й. Попробуйте запустить сразу 2-й без использования 1-го. У меня стал спрашивать файлы txt, которых у меня нет (хотя новые листы, вроде, создавал качественно, на сколько у меня хватило сил жать отмену работы с файлом txt, но это было порядка 250 листов).
А у меня 2-й макрос вообще ничего не изменил, причем довольно быстро прекратил работу (1-й отработал как надо и тоже быстро). Digger23, а вот это [vba]
Код
Sheets("Шаблон").copy After:=Sheets(Sheets.Count)
[/vba] во 2-м макросе для чего? Это же копирование ЛИСТА шаблона с последующей вставкой в него данных. У вас 2-й макрос дублирует то, что уже сделал 1-й. Попробуйте запустить сразу 2-й без использования 1-го. У меня стал спрашивать файлы txt, которых у меня нет (хотя новые листы, вроде, создавал качественно, на сколько у меня хватило сил жать отмену работы с файлом txt, но это было порядка 250 листов). alex1248
skype alex12481632 Qiwi +79276708519
Сообщение отредактировал alex1248 - Вторник, 23.09.2014, 09:01
Эти два макроса я привел как пример того, что проблему вызывает именно копирование (Copy), а не непосредственно создание листов (Add). Хотел узнать мнение сведующих людей. Использовать их последовательно для решения одной задачи не собирался. НО! alex1248, ваш пост подсказал мне решение - разделить задачу на этапы, если не получается сразу всё. 1 - создать листы, 2 - скопировать в листы шаблон, 3 - экспортировать в текст. 3 отдельных макроса. И всё заработало. Хочется конечно всё в одном флаконе организовать, ну да ладно, главное - работает. Большое спасибо за подсказку. Для себя подробно откомментил 1й макрос. Гляньте пожалуйста, я правильно понимаю работу операторов? Если что не так - не сочтите за труд исправить комент. Понимание - ключ к успеху. Заранее спасибо. [vba]
Код
' Создание листов с именами из столбца A Sub Macros() Application.ScreenUpdating = False 'отключение обновления экрана для ускорения работы макроса Dim i As Long For i = 1 To Sheets("Vars").Range("A" & Rows.Count).End(xlUp).Row 'цикл от 1 до кол-во непустых строк в столбце A листа Vars On Error Resume Next 'включение отображения ошибок Sheets(Sheets("Vars").Range("A" & i).Value).Select 'выбор диапазона имен из столбца A листа Vars If Err And Sheets("Vars").Range("A" & i) <> "" Then 'если ошибок нет и диапазон выбран, то Sheets.Add After:=Sheets(Sheets.Count) 'добавление нового листа после последнего существующего ActiveSheet.name = Sheets("Vars").Range("A" & i) ' имя нового листа End If Next i Worksheets("Vars").Activate 'активация листа Vars Application.ScreenUpdating = True 'включение обновления экрана End Sub
[/vba], если файл с таким именем уже есть, выскакивает запрос о перезаписи. От запроса как избавиться? Чтобы по умолчанию переписывал существующий файл.
Эти два макроса я привел как пример того, что проблему вызывает именно копирование (Copy), а не непосредственно создание листов (Add). Хотел узнать мнение сведующих людей. Использовать их последовательно для решения одной задачи не собирался. НО! alex1248, ваш пост подсказал мне решение - разделить задачу на этапы, если не получается сразу всё. 1 - создать листы, 2 - скопировать в листы шаблон, 3 - экспортировать в текст. 3 отдельных макроса. И всё заработало. Хочется конечно всё в одном флаконе организовать, ну да ладно, главное - работает. Большое спасибо за подсказку. Для себя подробно откомментил 1й макрос. Гляньте пожалуйста, я правильно понимаю работу операторов? Если что не так - не сочтите за труд исправить комент. Понимание - ключ к успеху. Заранее спасибо. [vba]
Код
' Создание листов с именами из столбца A Sub Macros() Application.ScreenUpdating = False 'отключение обновления экрана для ускорения работы макроса Dim i As Long For i = 1 To Sheets("Vars").Range("A" & Rows.Count).End(xlUp).Row 'цикл от 1 до кол-во непустых строк в столбце A листа Vars On Error Resume Next 'включение отображения ошибок Sheets(Sheets("Vars").Range("A" & i).Value).Select 'выбор диапазона имен из столбца A листа Vars If Err And Sheets("Vars").Range("A" & i) <> "" Then 'если ошибок нет и диапазон выбран, то Sheets.Add After:=Sheets(Sheets.Count) 'добавление нового листа после последнего существующего ActiveSheet.name = Sheets("Vars").Range("A" & i) ' имя нового листа End If Next i Worksheets("Vars").Activate 'активация листа Vars Application.ScreenUpdating = True 'включение обновления экрана End Sub
[/vba], если файл с таким именем уже есть, выскакивает запрос о перезаписи. От запроса как избавиться? Чтобы по умолчанию переписывал существующий файл.Digger23
Сообщение отредактировал Digger23 - Вторник, 23.09.2014, 21:02
1 - создать листы, 2 - скопировать в листы шаблон, 3 - экспортировать в текст. 3 отдельных макроса. И всё заработало.
Так теперь просто записать операторы в такой последовательности, в какой они работают, в одном макросе. Думаю, им все равно, с паузой или без. И всё же, у меня создались 250 листов с шаблоном, я сам прервал выполнение из-за того, что каждый раз выскакивало сообщение об отсутствии файла txt.
1 - создать листы, 2 - скопировать в листы шаблон, 3 - экспортировать в текст. 3 отдельных макроса. И всё заработало.
Так теперь просто записать операторы в такой последовательности, в какой они работают, в одном макросе. Думаю, им все равно, с паузой или без. И всё же, у меня создались 250 листов с шаблоном, я сам прервал выполнение из-за того, что каждый раз выскакивало сообщение об отсутствии файла txt.alex1248
skype alex12481632 Qiwi +79276708519
Сообщение отредактировал alex1248 - Вторник, 23.09.2014, 20:45
Гляньте пожалуйста, я правильно понимаю работу операторов?
[vba]
Код
' Создание листов с именами из столбца A Sub Macros() Application.ScreenUpdating = False 'отключение обновления экрана для ускорения работы макроса Dim i As Long For i = 1 To Sheets("Vars").Range("A" & Rows.Count).End(xlUp).Row 'цикл от 1 до ----последней непустой строки----- в столбце A листа Vars On Error Resume Next ' -----в случае ошибки переход к следующему оператору, т.е. без прерывания работы программы----- Sheets(Sheets("Vars").Range("A" & i).Value).Select ' -----выбор листа с именем, равным содержимому указанной ячейки------ из столбца A листа Vars If Err And Sheets("Vars").Range("A" & i) <> "" Then ' ------в случае ошибки (т.е. если лист не найден) и непустой указанной ячейки ------ Sheets.Add After:=Sheets(Sheets.Count) 'добавление нового листа после последнего существующего ActiveSheet.name = Sheets("Vars").Range("A" & i) ' имя нового листа End If Next i Worksheets("Vars").Activate 'активация листа Vars Application.ScreenUpdating = True 'включение обновления экрана ----вроде и не обязательно ------ End Sub
Гляньте пожалуйста, я правильно понимаю работу операторов?
[vba]
Код
' Создание листов с именами из столбца A Sub Macros() Application.ScreenUpdating = False 'отключение обновления экрана для ускорения работы макроса Dim i As Long For i = 1 To Sheets("Vars").Range("A" & Rows.Count).End(xlUp).Row 'цикл от 1 до ----последней непустой строки----- в столбце A листа Vars On Error Resume Next ' -----в случае ошибки переход к следующему оператору, т.е. без прерывания работы программы----- Sheets(Sheets("Vars").Range("A" & i).Value).Select ' -----выбор листа с именем, равным содержимому указанной ячейки------ из столбца A листа Vars If Err And Sheets("Vars").Range("A" & i) <> "" Then ' ------в случае ошибки (т.е. если лист не найден) и непустой указанной ячейки ------ Sheets.Add After:=Sheets(Sheets.Count) 'добавление нового листа после последнего существующего ActiveSheet.name = Sheets("Vars").Range("A" & i) ' имя нового листа End If Next i Worksheets("Vars").Activate 'активация листа Vars Application.ScreenUpdating = True 'включение обновления экрана ----вроде и не обязательно ------ End Sub
[/vba] Пометки и исправления выделил ------alex1248
skype alex12481632 Qiwi +79276708519
Сообщение отредактировал alex1248 - Вторник, 23.09.2014, 20:56
[/vba] , если файл с таким именем уже есть, выскакивает запрос о перезаписи. От запроса как избавиться? Чтобы по умолчанию переписывал существующий файл.
Спасибо, теперь понятнее. И последнее на сегодня. Используя вот это: [vba]
[/vba] , если файл с таким именем уже есть, выскакивает запрос о перезаписи. От запроса как избавиться? Чтобы по умолчанию переписывал существующий файл.Digger23
alex1248, большое спасибо, теперь все работает так, как мне нужно (по крайней мере пока ). Следующий этап - сохранение выходных .txt не в кучу, а каждый месяц в свою папку, но это уже совсем другая история. С этой темой всё.
alex1248, большое спасибо, теперь все работает так, как мне нужно (по крайней мере пока ). Следующий этап - сохранение выходных .txt не в кучу, а каждый месяц в свою папку, но это уже совсем другая история. С этой темой всё.Digger23