Страницы: 1
RSS
Как макросом сохранить копию текущего файла?
 
По работе на своём компе создаю/модернизирую/заполняю разные таблицы.  
По окончании какого-нибудь этапа КОПИЮ таблицы надо выкладывать на общий диск с паролем на изменение (ну, просто для страховки одних пользователей от действий других...).  
Конечно, можно воспользоваться стандартными средствами:    
- открыть папку назначения, скопировать (drag & drop' ом) туда файл, открыть его и поставить пароль на открытие... Но уж больно это не удобно, т.к. надо после копирования закрыть свой рабочий файл (имена-то совпадают!!!).  
или  
- сказать Ёкселю "Сохранить как..." и указать с каким именем, куда и с какими паролями сохранить файл. А потом закрыть тот сетевой, видный для всех, файл и открыть свой рабочий. Это тоже не слишком удобно, т.к. требует много "мышкодвижений".  
А недавно поставил себе прогу "PDF-Exchange" и увидел там возможность "Сохранить копию как ...".    
Оказалось очень удобно, т.к. при этом текущий открытый файл не закрывается, а просто его копия сохраняется в указанном месте с указанными свойствами (всё это задаётся в стандартных виндовых окнах).  
Вот и подумал, а вдруг гуру форума посоветуют как можно сделать макрос, осуществляющий аналогичную вункцию в Ёкселе?  
Очевидно, что макрос (ну, например, Save_Copy_As) должен лежать в личной книге макросов (Personal.xls)...  
А вот как "Сохранить как...", не закрывая текущего файла?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Сразу оговариваю:  
макросы типа  
Sub Save_File_As()  
  ActiveWorkbook.SaveAs _  
        Filename:="трам-пам-пам.xls", _  
        FileFormat:=xlNormal, _  
        Password:="", _  
        WriteResPassword:="", _  
        ReadOnlyRecommended:=True, _  
        CreateBackup:=False  
End Sub  
не подходят, т.к. это как раз и есть описанный мною выше второй случай...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
.SaveCopyAs чем не устраивает?
 
ThisWorkbook.Password = "1"  
ThisWorkbook.SaveCopyAs 'полный путь, включая расширение файла. ДОЛЖЕН БЫТЬ В ДРУГОЙ ПАПКЕ, дабы не было конфликта при совпадении имен.  
ThisWorkbook.Password = ""
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Метод SaveCopyAs требует непосредственного указания пути и имени сохранения, а хотелось бы по вызову макроса выйти на стандартное окно выбора пути и имени сохранения ...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да и к тому же метод SaveCopyAs не предполагает задания опций сохранения (пароль, предложение открыть только для чтения и т.п.)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Наверное, я что-то не понял...  
Т.к. думал, что пользователь класса Alex_ST уж сумеет как-то в макросе подогнать под себя SaveCopyAs через InputBox или ещё как-то...  
В чём хитрость-то?
 
{quote}{login=Alex_ST}{date=01.06.2010 01:56}{thema=}{post}Метод SaveCopyAs требует непосредственного указания пути и имени сохранения, а хотелось бы по вызову макроса выйти на стандартное окно выбора пути и имени сохранения ...{/post}{/quote}А кто мешает перед этим вывести диалог?  
 
   Dim sFileName As String, sExpansion As String  
BEGIN_:  
   sFileName = ThisWorkbook.Name  
   sExpansion = Right(sFileName, Len(sFileName) - InStrRev(sFileName, ".") + 1)  
   sFileName = Application.GetSaveAsFilename  
   If sFileName = "False" Then Exit Sub  
 
   sFileName = sFileName & IIf(Right(sFileName, Len(sExpansion)) <> sExpansion, sExpansion, "")  
   If sFileName = ThisWorkbook.FullName Then  
   MsgBox "Нельзя сохранить файл под имененм открытого файла!", vbCritical + vbYesNo, "Ошибка"  
   GoTo BEGIN_  
   End If  
   ThisWorkbook.Password = "1"  
   ThisWorkbook.SaveCopyAs sFileName  
   ThisWorkbook.Password = ""
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
{quote}{login=Alex_ST}{date=01.06.2010 01:59}{thema=}{post}Да и к тому же метод SaveCopyAs не предполагает задания опций сохранения (пароль, предложение открыть только для чтения и т.п.){/post}{/quote}Алекс, Вы хоть посмотрели, что я предложил? Вы сначала задаете книге пароль, затем сохраняете, затем убираете пароль.    
 
Тоже самое можно сделать и с другими атрибутами(только чтение через GetAttr например).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Я, конечно, естественно, смогу сделать InputBox для задания пути для SaveCopyAs, но, ИМХО, InputBox и окно задания пути сохранения файла - это "две большие разницы" ...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=01.06.2010 02:08}{thema=}{post}Я, конечно, естественно, смогу сделать InputBox для задания пути для SaveCopyAs, но, ИМХО, InputBox и окно задания пути сохранения файла - это "две большие разницы" ...{/post}{/quote}Я Вам уже целый пример накатал - чем он не устраивает? Выбор через диалог, сохраняет куда укажешь и с паролем, да еще и предупреждает, если такой файл есть.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, вы с такой скоростью создаёте свои ответы пока я ввожу свои, что я их просто не успеваю читать...  
Ща буду разбираться... Беру тайм-аут на осмысливание.    
Скорее всего до завтра, т.к.у нас на работе сегодня отмечается "День Корпорации" (ввиду кризиса - на рабочих местах, а не на природе), поэтому, прошу пардону, с ответами немного торможу, хотя пока ещё вполне адекватен, но что будет дальше ...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
The_Prist,спасибо!  
Всё отлично работает. Завтра "дополирую" диалогами для задания пассворда ...  
А как бы при сохранении копии задавать "Рекомендовать открытие только для чтения?"
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
К стати, не подскажите "на вскидку" как к имени файла при сохранении добавить перед расширением суффикс - дату и время сохранения? (ну, например, Имя_моего_рабочего_файла(01-06-2010 14-30).xls
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
SetAttr ThisWorkbook.FullName, vbReadOnly
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
К сожалению, свойство vbReadOnly при SaveCopyAs задать не удаётся...  
А нельзя ли его задать для уже созданного файла-копии?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс, ну чтоже ВЫ так? Я ж еще в начале писал - "Вы сначала задаете книге пароль, затем сохраняете, затем убираете пароль.  
 
Тоже самое можно сделать и с другими атрибутами(только чтение через GetAttr например)."  
 
Т.е. сначала Вы сохраняемой книги присваиваете все эти атрибуты, затем сохраняете, потом убираете.  
 
Dim sFileName As String, sExpansion As String  
BEGIN_:  
sFileName = ThisWorkbook.Name  
sExpansion = Right(sFileName, Len(sFileName) - InStrRev(sFileName, ".") + 1)  
sFileName = Application.GetSaveAsFilename  
If sFileName = "False" Then Exit Sub  
 
sFileName = sFileName & IIf(Right(sFileName, Len(sExpansion)) <> sExpansion, sExpansion, "")  
If sFileName = ThisWorkbook.FullName Then  
MsgBox "Нельзя сохранить файл под имененм открытого файла!", vbCritical + vbYesNo, "Ошибка"  
GoTo BEGIN_  
End If  
ThisWorkbook.Password = "1":SetAttr ThisWorkbook.FullName, vbReadOnly  
ThisWorkbook.SaveCopyAs sFileName  
ThisWorkbook.Password = "":SetAttr ThisWorkbook.FullName, vbNormal
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 

Alex_ST, про дату в названии есть в приёмах: http://www.planetaexcel.ru/tip.php?aid=72

 
Спасибо. Разобрался.  
Только чтобы всё правильно работало нужно не атрибуты файла через  
SetAttr ActiveWorkbook.FullName, vbReadOnly устанавливать, т.к. это ничего не даёт , а    
ActiveWorkbook.Password = "ххх" задаёт пароль НА ОТКРЫТИЕ  
 
Надо вот так:    
With ActiveWorkbook  
     .WritePassword = "1"  
     .ReadOnlyRecommended = True  
     .SaveCopyAs sFileName  
     .WritePassword = ""  
     .ReadOnlyRecommended = False  
End With  
   
Если кому-нибудь интересно, то "причёсанный" вариант - в файле.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Приходится у себя на компе вести несколько учётных файлов, а их копии регулярно скидывать в разные директории на общем ресурсе.  
Достало постоянно выбирать куда и какой файл сохранять...  
Переделал макрос Save_Copy_As так, что путь последнего сохранения копии запоминается в самом файле в коллекции Names  
Два дня поюзал - понравилось!  
Код
Sub Save_Copy_As()   
'---------------------------------------------------------------------------------------   
' Procedure    : Save_Copy_As   
' Author       : Alex_ST   
' Topic_HEADER : Как макросом сохранить копию текущего файла?   
' Topic_URL    : http://www.planetaexcel.ru/forum.php?thread_id=16506   
' DateTime     : 08.02.12, 12:00   
' Purpose      : Сохранение копии активного файла   
' Notes        : Путь сохранения копий хранится в коллекции .Names книги (в именованном диапазоне)   
'---------------------------------------------------------------------------------------   
   Const sPath_in_Names = "Path4SaveCopyAs"   ' имя элемента коллекции .Names, в котором должен храниться путь для сохранения копий файла   
   Dim sSuff$: sSuff = " [" & Format(Now, "yyyy/mm/dd hh-mm'ss''") & "]"    ' суффикс к имени файла копии - дата и время сохренения копии файла   
   Dim FileName, sExp$, sDirPath$, sFullFilePath$, sNewPath$   
   Dim bReadOnlyRecommended As Boolean   
   With ActiveWorkbook   
      FileName = .Name   ' например, "Книга1.xls"   
      sExp = Right(FileName, Len(FileName) - InStrRev(FileName, ".") + 1)   ' расширение файла вместе с точкой (например, ".xls")   
      FileName = Left(FileName, Len(FileName) - Len(sExp)) & sSuff & sExp   ' например, "Книга1 [2012.02.06 15-24'39''].xls"   
      On Error Resume Next   
      sDirPath = .Names(sPath_in_Names).Value   ' считать из коллекции .Names значение, ранее сохраненное под именем sPath_in_Names   
      If Err Then .Names.Add sPath_in_Names, .Path & "\": sDirPath = .Names(sPath_in_Names).Value   ' если считать не удалось, значит путь ранее не задавался и он для первого раза задаётся равным 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   
      sFullFilePath = sDirPath & FileName   ' полный путь сохранения вместе с полным именем копии   
REPEAT_:   
      FileName = Application.GetSaveAsFilename(InitialFileName:=sFullFilePath, _   
                                               FileFilter:="Excel Files (*" & sExp & "), *" & sExp & ", All Files (*.*),*.*", _   
                                               Title:="Сохранение копии файла")   'задать путь сохранения и имя копии файла в окне выбора   
      If VarType(FileName) = vbBoolean Then Exit Sub   ' если нажали "Отмена", то FileName = False, если "Сохранить" - полный путь к файлу вместе с его именем   
      If FileName = .FullName Then MsgBox "Здесь нельзя сохранить файл под таким именем!", 16, "Ошибка": GoTo REPEAT_   
      sDirPath = Left(FileName, InStrRev(FileName, "\"))   ' путь к папке сохранения копий без имени файла   
      .Names(sPath_in_Names).Value = sDirPath   ' запомнить выбранный в диалоге путь в коллекции .Names под именем sPath_in_Names   
      bReadOnlyRecommended = .ReadOnlyRecommended   ' запомнить параметры исходного файла   
      .ReadOnlyRecommended = --(MsgBox("Рекомендовать открывать файл только для чтения?", 36) - 7)   ' MsgBox Argument 4==vbYesNo 32==vbQuestion, MsgBox Return Values: vbYes=6, vbNo=7   
      .SaveCopyAs FileName   
      .ReadOnlyRecommended = bReadOnlyRecommended   ' восстановить параметры исходного файла   
   End With   
End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх