Добрый день! Требуется помощь, ибо мозг уже взрывается В общем ситуация следующая, есть книга в которой макрос разбивает данные на отдельные листы (макрос "а"), спасибо отдельное за помощь в его написании bigor, теперь же нужно сохранить все эти листы отдельными файлами. Нашел макрос который это делает, но беда в том, что он сохраняет файл по имени листа, а имя листа ограничено 31 символом. Поэтому нашел выход, что можно сохранить с именем, взяв данные из ячейки. Но у меня не получается это сделать ((( либо выдаёт ошибку, либо сохраняет с одним и тем же именем. Прошу помощи у специалистов! А если еще и о бъясните где я затупил будет просто превосходно!
Добрый день! Требуется помощь, ибо мозг уже взрывается В общем ситуация следующая, есть книга в которой макрос разбивает данные на отдельные листы (макрос "а"), спасибо отдельное за помощь в его написании bigor, теперь же нужно сохранить все эти листы отдельными файлами. Нашел макрос который это делает, но беда в том, что он сохраняет файл по имени листа, а имя листа ограничено 31 символом. Поэтому нашел выход, что можно сохранить с именем, взяв данные из ячейки. Но у меня не получается это сделать ((( либо выдаёт ошибку, либо сохраняет с одним и тем же именем. Прошу помощи у специалистов! А если еще и о бъясните где я затупил будет просто превосходно! kot2012
Sub SaveSheetsAsFiles() Application.ScreenUpdating = False 'Отключение обновления экрана Dim MySheet As Worksheet 'Ввод переменной MySheet типа "лист" Dim MyWorkbook As Workbook 'Ввод переменной MyWorkbook типа "книга"
Set MyWorkbook = ActiveWorkbook For Each MySheet In MyWorkbook.Worksheets 'Цикл по каждому листу книги (файла) newName =MySheet.Cells(2,21).value & ".xlsx" MySheet.Copy 'Копирование листа в новую книгу (файл) ActiveWorkbook.SaveAs MyWorkbook.Path & "\" & newName 'Сохранение новой книги (файла) ActiveWorkbook.Close 'Закрытие новой книги (файла) Next Application.ScreenUpdating = True 'Включение обновления экрана End Sub
[/vba] Исправленные ошибки: 1. У Вас newName присваивалось до цикла, т.е. для всех листов оно было одинаковое 2. Изменил строку присваивания newName
Попробуйте так: [vba]
Код
Sub SaveSheetsAsFiles() Application.ScreenUpdating = False 'Отключение обновления экрана Dim MySheet As Worksheet 'Ввод переменной MySheet типа "лист" Dim MyWorkbook As Workbook 'Ввод переменной MyWorkbook типа "книга"
Set MyWorkbook = ActiveWorkbook For Each MySheet In MyWorkbook.Worksheets 'Цикл по каждому листу книги (файла) newName =MySheet.Cells(2,21).value & ".xlsx" MySheet.Copy 'Копирование листа в новую книгу (файл) ActiveWorkbook.SaveAs MyWorkbook.Path & "\" & newName 'Сохранение новой книги (файла) ActiveWorkbook.Close 'Закрытие новой книги (файла) Next Application.ScreenUpdating = True 'Включение обновления экрана End Sub
[/vba] Исправленные ошибки: 1. У Вас newName присваивалось до цикла, т.е. для всех листов оно было одинаковое 2. Изменил строку присваивания newNamebigor
Hugo, вы были правы! В ячейках бывают символы "/" а я так понимаю с таким именем нельзя сохранять, есть ли возможность так же с помощью макроса заменить "/" на "_" ? Буду очень вам признателен за помощь
Hugo, вы были правы! В ячейках бывают символы "/" а я так понимаю с таким именем нельзя сохранять, есть ли возможность так же с помощью макроса заменить "/" на "_" ? Буду очень вам признателен за помощьkot2012
есть ли возможность так же с помощью макроса заменить "/" на "_" ?
[vba]
Код
Function Replace_symbols(ByVal txt As String) As String St$ = "~!@#$%^&*=/\|`'""" For i% = 1 To Len(St$) txt = Replace(txt, Mid(St$, i, 1), "_") Next Replace_symbols = txt End Function
Пример использования:
' формируем путь к новому файлу Путь = ThisWorkbook.Path & "\" & Replace_symbols(sh.Name) & _ "\" & Replace_symbols(cell) & "\" & Replace_symbols(cell.Next) & ".jpg"
есть ли возможность так же с помощью макроса заменить "/" на "_" ?
[vba]
Код
Function Replace_symbols(ByVal txt As String) As String St$ = "~!@#$%^&*=/\|`'""" For i% = 1 To Len(St$) txt = Replace(txt, Mid(St$, i, 1), "_") Next Replace_symbols = txt End Function
Пример использования:
' формируем путь к новому файлу Путь = ThisWorkbook.Path & "\" & Replace_symbols(sh.Name) & _ "\" & Replace_symbols(cell) & "\" & Replace_symbols(cell.Next) & ".jpg"
Никто не мешает добавить. Вообще просили только / Я просто взял в закромах первое что попалось... Можно у мелкомягких спросить какие символы в винде запрещены, чтоб точно никого не забыть.
Никто не мешает добавить. Вообще просили только / Я просто взял в закромах первое что попалось... Можно у мелкомягких спросить какие символы в винде запрещены, чтоб точно никого не забыть.Hugo
bigor, еще такой вопрос, информация при этом измениться в ячейке или в самой ячейке не измениться а только изменится имя листа для которого брались данные? И еще попутно, можно ли как-то избежать чтобы форматирование не слетало после копирования на новый лист?
bigor, еще такой вопрос, информация при этом измениться в ячейке или в самой ячейке не измениться а только изменится имя листа для которого брались данные? И еще попутно, можно ли как-то избежать чтобы форматирование не слетало после копирования на новый лист?kot2012
bigor, дико извиняюсь просто всё смешалось в голове! ((( Не в той теме вопрос задал (( [vba]
Код
Sub a() Dim Bg As Long, En As Long Dim ws As Worksheet
Set ws = ActiveSheet With ws En = .Cells(Rows.Count, 1).End(xlUp).Row Do Until En < 2 Bg = En Do Until (.Cells(Bg, 21).Value = "Приложение") Bg = Bg - 1
Loop Sheets.Add after:=Worksheets(Sheets.Count) ActiveSheet.Name = Left(.Cells(Bg + 1, 21).Value, 31) .Range(.Rows(Bg), .Rows(En)).Copy Destination:=Rows(1) En = Bg - 1 Loop End With End Sub
[/vba] я про вот этот код. Тут получается что если в ячейке 21 содержаться непотребные символы, то макрос посылает соответственно. А в рабочих спецификациях как раз в названиях присутствует символ "/" соответственно чтобы сохранить новый лист нужно менять в самой ячейки "/" к примеру на "_" чтобы макрос отработал. Хорошо когда 6 спецификация а если их 200 ((( Суть задачи в следующем, как сделать так чтобы имя листа было с "_" и при этом информация в ячейки не менялась. Надеюсь доступно описал
bigor, дико извиняюсь просто всё смешалось в голове! ((( Не в той теме вопрос задал (( [vba]
Код
Sub a() Dim Bg As Long, En As Long Dim ws As Worksheet
Set ws = ActiveSheet With ws En = .Cells(Rows.Count, 1).End(xlUp).Row Do Until En < 2 Bg = En Do Until (.Cells(Bg, 21).Value = "Приложение") Bg = Bg - 1
Loop Sheets.Add after:=Worksheets(Sheets.Count) ActiveSheet.Name = Left(.Cells(Bg + 1, 21).Value, 31) .Range(.Rows(Bg), .Rows(En)).Copy Destination:=Rows(1) En = Bg - 1 Loop End With End Sub
[/vba] я про вот этот код. Тут получается что если в ячейке 21 содержаться непотребные символы, то макрос посылает соответственно. А в рабочих спецификациях как раз в названиях присутствует символ "/" соответственно чтобы сохранить новый лист нужно менять в самой ячейки "/" к примеру на "_" чтобы макрос отработал. Хорошо когда 6 спецификация а если их 200 ((( Суть задачи в следующем, как сделать так чтобы имя листа было с "_" и при этом информация в ячейки не менялась. Надеюсь доступно описал kot2012
Не нужно менять в самой ячейке, делайте с именем листа аналогично как с именем файла. Нужно тоже погуглить какие тут символы запрещены. Там правда пара запрещённых слов кажется было. но надеюсь не попадутся Пока нагуглил [] */\?
Не нужно менять в самой ячейке, делайте с именем листа аналогично как с именем файла. Нужно тоже погуглить какие тут символы запрещены. Там правда пара запрещённых слов кажется было. но надеюсь не попадутся Пока нагуглил [] */\?Hugo
Hugo, аналогично это как? Я очень слабо разбираюсь в макросах, от слова - ни как ) подскажите пожалуйста, мне необходимо добавить в код из поста #12 [vba]
Hugo, аналогично это как? Я очень слабо разбираюсь в макросах, от слова - ни как ) подскажите пожалуйста, мне необходимо добавить в код из поста #12 [vba]
Hugo, разобрался! да уж тяжко быть деревянным, хорошо что есть специалисты, Спасибо вам большое!!! Если я вас еще в край не достал, может подскажете как сделать так чтобы листы копировались с сохранением форматирования средствами VBA? Нашел на форуме только это: [vba]
[/vba] а куда это нужно вставить понятия не имею ))) не поможете?
Hugo, разобрался! да уж тяжко быть деревянным, хорошо что есть специалисты, Спасибо вам большое!!! Если я вас еще в край не достал, может подскажете как сделать так чтобы листы копировались с сохранением форматирования средствами VBA? Нашел на форуме только это: [vba]
Hugo, смотрите какая ситуация, попытаюсь в кратце объяснить, что необходимо в конечном итоге получить и в связи с чем все эти пляски с макросами. Приходит эксел файл, в неё на одном листе идут спецификации, их нужно разбить на отдельные лист/файлы, с сохранением названия из ячейки в которой прописано имя спецификации. Как то так. Если можно сразу сохранять в файл без разбивания одного листа на несколько а потом сохранять каждый лист как отдельный файл, буду признателен если подскажите как это можно реализовать средствами vba
Hugo, смотрите какая ситуация, попытаюсь в кратце объяснить, что необходимо в конечном итоге получить и в связи с чем все эти пляски с макросами. Приходит эксел файл, в неё на одном листе идут спецификации, их нужно разбить на отдельные лист/файлы, с сохранением названия из ячейки в которой прописано имя спецификации. Как то так. Если можно сразу сохранять в файл без разбивания одного листа на несколько а потом сохранять каждый лист как отдельный файл, буду признателен если подскажите как это можно реализовать средствами vbakot2012
Листы ведь уже сделали, или это не устраивает? Можно как вариант, но не факт что лучше - копировать первый лист, удалять из него лишние строки, сохранять сразу не в книгу, а в файл.
Листы ведь уже сделали, или это не устраивает? Можно как вариант, но не факт что лучше - копировать первый лист, удалять из него лишние строки, сохранять сразу не в книгу, а в файл.Hugo
Hugo, да разнести листы получилось, но при разбивки на них слетает форматирование от исходного, что не есть гуд. Потом приходится каждый лист руками подгонять под первый с которого их разносили
Hugo, да разнести листы получилось, но при разбивки на них слетает форматирование от исходного, что не есть гуд. Потом приходится каждый лист руками подгонять под первый с которого их разносилиkot2012