Доброго времени суток.Проконсультируйте,пожалуйста,как сделать макрос,который бы сохранял копию книги в определенной папке под именем вида Имя(I)[I-переменная;I=1,2,...n]. Если такое имя уже существует,то сохраняет под именем Имя(max(I)+1),где max(I)-максимальная из переменных I,содержащихся в именах файлов,сохраненных в папке. Заранее благодарен за любую помощь.
Доброго времени суток.Проконсультируйте,пожалуйста,как сделать макрос,который бы сохранял копию книги в определенной папке под именем вида Имя(I)[I-переменная;I=1,2,...n]. Если такое имя уже существует,то сохраняет под именем Имя(max(I)+1),где max(I)-максимальная из переменных I,содержащихся в именах файлов,сохраненных в папке. Заранее благодарен за любую помощь.VanDerGraat
А Вам нужна именно нумерация? А сохранение под именем с добавкой суффикса из даты и времени не подойдёт? Если подойдёт, то посмотрите в топике Макрос Save_Copy_As . Честно говоря, мне лень возиться с переделкой того макроса... Попробуйте на его основе сами. А для получения имени с номером можете ввести туда вычисление имени такой функцией:[vba]
Code
Private Function NextName(sPath$, sWdROOT$, sExp$) ' вычисление очередного уникального имени файла с корнем sWdROOT в папке sPath NextName = False On Error GoTo eXXit GetAttr (sPath) ' если папка не существует, то будет ошибка и NextName=False Dim i% Do NextName = sPath & sWdROOT & "(" & i & ")" & sExp i = i + 1 Loop While Dir(NextName) <> "" ' пока имя не будет уникальным в папке eXXit: End Function
[/vba]
А Вам нужна именно нумерация? А сохранение под именем с добавкой суффикса из даты и времени не подойдёт? Если подойдёт, то посмотрите в топике Макрос Save_Copy_As . Честно говоря, мне лень возиться с переделкой того макроса... Попробуйте на его основе сами. А для получения имени с номером можете ввести туда вычисление имени такой функцией:[vba]
Code
Private Function NextName(sPath$, sWdROOT$, sExp$) ' вычисление очередного уникального имени файла с корнем sWdROOT в папке sPath NextName = False On Error GoTo eXXit GetAttr (sPath) ' если папка не существует, то будет ошибка и NextName=False Dim i% Do NextName = sPath & sWdROOT & "(" & i & ")" & sExp i = i + 1 Loop While Dir(NextName) <> "" ' пока имя не будет уникальным в папке eXXit: End Function
Вот, в обеденный перерыв сделал с автонумерацией:[vba]
Code
Sub Save_Copy_As_I() '--------------------------------------------------------------------------------------- ' Procedure : Save_Copy_As_I ' Author : Alex_ST ' Topic_HEADER : Сохранить копию текущего файла, запомнив папку для сохранения ' Topic_URL : http://www.excelworld.ru/forum/2-1639-18265-16-1335949159 ' DateTime : 02.05.12, 12:59 ' Purpose : Сохранение копии активного файла с автоматическим увеличением суффикса (номера копии) ' Notes : Путь сохранения копий хранится в коллекции .Names книги (в именованном диапазоне) '--------------------------------------------------------------------------------------- Const sPath_in_Names = "Path4SaveCopyAs" ' имя элемента коллекции .Names, в котором должен храниться путь для сохранения копий файла Dim sDirPath$, sExp$, sMainName$, FileName, i% With ActiveWorkbook On Error Resume Next sDirPath = .Names(sPath_in_Names).Value ' считать из коллекции .Names значение, ранее сохраненное под именем sPath_in_Names If Err Then .Names.Add sPath_in_Names, .Path & "\": sDirPath = .Path & "\" ' если считать не удалось, значит путь ранее не задавался и он для первого раза задаётся равным ActiveWorkbook.Path sDirPath = Mid(sDirPath, 3, Len(sDirPath) - 3) ' убрать из считанного значения в начале "= и в конце " sDirPath = sDirPath & IIf(Right(sDirPath, 1) = "\", "", "\") ' на всякий случай (если имя было задано в ручную и при этом не верно - без слэша) .Names(sPath_in_Names).Value = sDirPath ' запомнить путь сохранения копий в коллекции .Names под именем sPath_in_Names
sExp = Right(.Name, Len(.Name) - InStrRev(.Name, ".") + 1) ' расширение файла вместе с точкой (например, ".xls") sMainName = Left(.Name, Len(.Name) - Len(sExp)) Do FileName = sDirPath & sMainName & "(" & i & ")" & sExp: i = i + 1 Loop While Dir(FileName) <> "" ' пока имя не будет уникальным в папке FileName = Application.GetSaveAsFilename(InitialFileName:=FileName, _ FileFilter:="Excel Files (*" & sExp & "), *" & sExp & ", All Files (*.*),*.*", _ Title:="Сохранение копии файла") 'задать путь сохранения и имя копии файла в окне выбора If VarType(FileName) = vbBoolean Then Exit Sub ' если нажали "Отмена", то FileName = False, если "Сохранить" - полный путь к файлу вместе с его именем sDirPath = Left(FileName, InStrRev(FileName, "\")) ' путь к папке сохранения копий без имени файла .Names(sPath_in_Names).Value = sDirPath ' запомнить выбранный в диалоге путь в коллекции .Names под именем sPath_in_Names .SaveCopyAs FileName End With End Sub
[/vba]
Вот, в обеденный перерыв сделал с автонумерацией:[vba]
Code
Sub Save_Copy_As_I() '--------------------------------------------------------------------------------------- ' Procedure : Save_Copy_As_I ' Author : Alex_ST ' Topic_HEADER : Сохранить копию текущего файла, запомнив папку для сохранения ' Topic_URL : http://www.excelworld.ru/forum/2-1639-18265-16-1335949159 ' DateTime : 02.05.12, 12:59 ' Purpose : Сохранение копии активного файла с автоматическим увеличением суффикса (номера копии) ' Notes : Путь сохранения копий хранится в коллекции .Names книги (в именованном диапазоне) '--------------------------------------------------------------------------------------- Const sPath_in_Names = "Path4SaveCopyAs" ' имя элемента коллекции .Names, в котором должен храниться путь для сохранения копий файла Dim sDirPath$, sExp$, sMainName$, FileName, i% With ActiveWorkbook On Error Resume Next sDirPath = .Names(sPath_in_Names).Value ' считать из коллекции .Names значение, ранее сохраненное под именем sPath_in_Names If Err Then .Names.Add sPath_in_Names, .Path & "\": sDirPath = .Path & "\" ' если считать не удалось, значит путь ранее не задавался и он для первого раза задаётся равным ActiveWorkbook.Path sDirPath = Mid(sDirPath, 3, Len(sDirPath) - 3) ' убрать из считанного значения в начале "= и в конце " sDirPath = sDirPath & IIf(Right(sDirPath, 1) = "\", "", "\") ' на всякий случай (если имя было задано в ручную и при этом не верно - без слэша) .Names(sPath_in_Names).Value = sDirPath ' запомнить путь сохранения копий в коллекции .Names под именем sPath_in_Names
sExp = Right(.Name, Len(.Name) - InStrRev(.Name, ".") + 1) ' расширение файла вместе с точкой (например, ".xls") sMainName = Left(.Name, Len(.Name) - Len(sExp)) Do FileName = sDirPath & sMainName & "(" & i & ")" & sExp: i = i + 1 Loop While Dir(FileName) <> "" ' пока имя не будет уникальным в папке FileName = Application.GetSaveAsFilename(InitialFileName:=FileName, _ FileFilter:="Excel Files (*" & sExp & "), *" & sExp & ", All Files (*.*),*.*", _ Title:="Сохранение копии файла") 'задать путь сохранения и имя копии файла в окне выбора If VarType(FileName) = vbBoolean Then Exit Sub ' если нажали "Отмена", то FileName = False, если "Сохранить" - полный путь к файлу вместе с его именем sDirPath = Left(FileName, InStrRev(FileName, "\")) ' путь к папке сохранения копий без имени файла .Names(sPath_in_Names).Value = sDirPath ' запомнить выбранный в диалоге путь в коллекции .Names под именем sPath_in_Names .SaveCopyAs FileName End With End Sub
Вадим, ну я же не с нуля набирал, а подпиливал свой же Макрос Save_Copy_As (в тот топик, к стати, я и этот макрос добавил чтобы "Готовое решение" было на любой вкус ). А там больше всяких примочек для удобства, проверок и "защит от дурака", чем собственно главного действия - сохранения копии. А все эти прибамбасы остались практически неизменными. VanDerGraat, пожалуйста, юзайте. Но с суффиксом - датой и временем, ИМХО всё-таки лучше. Т.к. при сортировке в проводнике Виндов самый последний файл окажется самым нижним. А вот при обычной нумерации всё красиво будет только до тех пор, пока копий в папке будет до 10 (с суффиксами от 0 до 9). А если больше, то сортировка в окне начнёт сбиваться (ведь она идёт по тексту в именах файлов). Чтобы этого не было нужно ограничиться максимальным количеством копий, например в 1000 и присваивать суффиксы типа 001, 002, ..., 998, 999. Но даже если это сделать, то опять же возникнут проблемы когда Вы через некоторое время, сохранив уже сотню копий, захотите удалить совсем старые и уже не нужные. После такого удаления макрос начнёт нумерацию с 000 и продолжит её пока не упрётся в Ваш самый старый из оставленных не стёртыми файлов. Так что чистить хранилище лучше только полностью. А вот при времени и дате никаких ограничений нет. Потому я изначально макрос так и сделал.
Вадим, ну я же не с нуля набирал, а подпиливал свой же Макрос Save_Copy_As (в тот топик, к стати, я и этот макрос добавил чтобы "Готовое решение" было на любой вкус ). А там больше всяких примочек для удобства, проверок и "защит от дурака", чем собственно главного действия - сохранения копии. А все эти прибамбасы остались практически неизменными. VanDerGraat, пожалуйста, юзайте. Но с суффиксом - датой и временем, ИМХО всё-таки лучше. Т.к. при сортировке в проводнике Виндов самый последний файл окажется самым нижним. А вот при обычной нумерации всё красиво будет только до тех пор, пока копий в папке будет до 10 (с суффиксами от 0 до 9). А если больше, то сортировка в окне начнёт сбиваться (ведь она идёт по тексту в именах файлов). Чтобы этого не было нужно ограничиться максимальным количеством копий, например в 1000 и присваивать суффиксы типа 001, 002, ..., 998, 999. Но даже если это сделать, то опять же возникнут проблемы когда Вы через некоторое время, сохранив уже сотню копий, захотите удалить совсем старые и уже не нужные. После такого удаления макрос начнёт нумерацию с 000 и продолжит её пока не упрётся в Ваш самый старый из оставленных не стёртыми файлов. Так что чистить хранилище лучше только полностью. А вот при времени и дате никаких ограничений нет. Потому я изначально макрос так и сделал.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 03.05.2012, 08:56
Не понял вопроса... Как у Вас нумеруются файлы в папке? Т.е. какой шаблон имени? Что в этом шаблоне - постояная часть, одинаковая у всех файлов, а что - нумерация, уникальная для каждого файла? Вопрос возник из-за того, что Вы, спросив про первые 4 символа, указали в качестве переменного номера ТЕКСТОВУЮ строку "№ 12". А НУМЕРАЦИЯ возможна только цифрами.
Не понял вопроса... Как у Вас нумеруются файлы в папке? Т.е. какой шаблон имени? Что в этом шаблоне - постояная часть, одинаковая у всех файлов, а что - нумерация, уникальная для каждого файла? Вопрос возник из-за того, что Вы, спросив про первые 4 символа, указали в качестве переменного номера ТЕКСТОВУЮ строку "№ 12". А НУМЕРАЦИЯ возможна только цифрами.Alex_ST
sdart, на форуме запрещено задавать новые вопросы в чужих темах. Читайте Правила форума, создавайте свою тему в разделе ВОПРОСЫ ПО VBA. Эта тема закрыта
sdart, на форуме запрещено задавать новые вопросы в чужих темах. Читайте Правила форума, создавайте свою тему в разделе ВОПРОСЫ ПО VBA. Эта тема закрытаPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816