Страницы: 1
RSS
Можно ли сохранить файл при закрытии с некими параметрами?
 
test.xlsx (9.04 КБ) Есть файл, в нем несколько заполненных ячеек, можно ли сделать так, чтобы файл сохранялся автоматически при закрытии в определенную директорию и название этого файла формировалось из конкретных заполненных ячеек?
 
Да, можно - пишите нужный код в предопределенную процедуру модуля книги "BeforeClose".
 
А если доступным языком?
 
Да куда уж доступнее... Макрос в процедуру события закрытия книги - так понятно?
 
Понятно что макрос - может есть какой-то пример или тема, где можно поколдовать? Просто сам я не сильно с макросами...
 
Цитата
Jonny написал: есть какой-то пример или тема, где можно поколдовать?
https://www.google.ru/search?q=workbook_beforeclose+site%3Aplanetaexcel.ru
 
Уважаемые форумчане, не могу разобраться с макросом. Знаю, что Private Sub Workbook_BeforeClose(Cancel As Boolean) нужно дописать... Сам не программист помогите нацарапать хоть что-то примитивное. Перечитал кучу постов с этим кодом, но ничего более подходящего найти не могу. Спасибо за понимание.
 
Тестируйте.
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Set WshShell = CreateObject("WScript.Shell")
    With ActiveSheet
        trgt_path$ = WshShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop") & _
            "\Отчет\" & .Range("B1").Value & "_" & .Range("A1").Value & "_" & .Range("C1").Value
    End With
    Me.SaveCopyAs trgt_path
End Sub
Папка "Отчет" должна быть на рабочем столе, иначе будет ошибка. Проверку на наличие папки не писал - лень.
Изменено: JayBhagavan - 16.09.2015 11:19:29

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Пример. Только путь правильно напишите
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил Лебедев, JayBhagavan, не могли бы вы небольшие комментарии дать, может когда пригодится использовать..
в первом коде сохраняется без расширения, как потом открыть файл
в примере от Михаила - файл же надо сохранить наверное без макросов, на сохранении вылетает ошибка
у меня был вариант переноса всех листов в новую книгу, и уже сохранение новой книги без поддержки макросов, но если можно проще, то подскажите, пожалуйста, как
Изменено: yoozhik - 16.09.2015 11:48:51
 
yoozhik, а что в размещённом мной коде комментировать? Там только заморочка с определением пути к рабочему столу из реестра - нашёл на просторах Интернета. Иных трудностей в понимании макроса не наблюдаю. Без расширения - да. Опять же, было лень заморачиваться, а то опять будут пинать, что оказываю медвежью услугу ТС и забезоплатно - не оставляю человеку возможности для роста. :)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan,  дело-то как раз в расширении, при попытке пересохранить в книгу без поддержки макросов. У меня не получается, только через создание новой книги, а как проще - не знаю

можно ли как-то упростить код? (путь к рабочему столу взял из примера JayBhagavan)
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Dim awb As Workbook, nwb As Workbook
Set awb = ActiveWorkbook
With Worksheets("Аркуш1")
fn = .Cells(1, 2).Value & "_" & .Cells(1, 1).Value & "_" & .Cells(1, 3).Value
End With
pth = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop") & _
            "\Отчет\" & fn & ".xlsx"
nsh = ActiveWorkbook.Sheets.Count
Set nwb = Workbooks.Add(1)
For x = nsh To 1 Step -1
awb.Sheets(x).Copy After:=nwb.Sheets(1)
Next
Application.DisplayAlerts = False
nwb.Sheets(1).Delete
nwb.SaveCopyAs Filename:=pth
nwb.Close
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Изменено: yoozhik - 16.09.2015 12:09:39
 
yoozhik, а зачем делать SaveCopyAs  для новой книги? Сохраняйте её через SaveAs. Там и тип файла укажите. Расширение, вроде бы, точно не помню, само добавится к имени файла.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, вот такой код не работает
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Worksheets("Аркуш1")
fn = .Cells(1, 2).Value & "_" & .Cells(1, 1).Value & "_" & .Cells(1, 3).Value
End With
pth = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop") & _
            "\Отчет\" & fn & ".xlsx"
 ThisWorkbook.SaveAs Filename:=pth, _
        FileFormat:=xlExcel12, CreateBackup:=False
End Sub
работает с .xlsm, но тогда мы получаем доп книги с макросом на закрытие книги, которая в случае открытия-закрытия будет или книги в папке плодить (вдруг мы чего в ячейках, из которых имя формируется, поменяем), или сама себя перезаписывать (может оно для ТС и не имеет значения)

Я хотел узнать, можно ли без создания книги просто пересохранить активную, но без макросов
Изменено: yoozhik - 16.09.2015 12:44:48
 
yoozhik, не знаю что за формат файла Вы указали в параметрах. Вот, такой код выдаёт макрорекордер.
Скрытый текст

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, спасибо, что-то где-то меня переклинило...)
разобрался...только не понял, чего сразу не получилось..
 
JayBhagavan интересный вариант поиска рабочего стола (положу в копилку для коллекции), взамен выложу альтернативу, на мой взгляд проще и понятней. Использует также WSH
Код
Sub Desktp()
Dim oWSH As Object, oFS As Object, Path As String, DST As String
Set oWSH = CreateObject("WScript.Shell")
Set oFS = CreateObject("Scripting.FileSystemObject")
  DST = oWSH.SpecialFolders("Desktop") 'рабочий стол
  Path = DST & "Отчет"
  If oFS.FolderExists(Path) Then  'проверка на наличие папки
      MsgBox "Папка " & Chr(34) & Path & Chr(34) & " существует"
  Else
      MsgBox "Папка " & Chr(34) & Path & Chr(34) & " не существует"
  End If
End Sub
 
TSN, спасибо. На такой вариант поиск меня не навёл. Тоже себе в копилку возьму. :)
Изменено: JayBhagavan - 16.09.2015 15:29:48

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Проигрался, ничего понять не могу - что-то не работает у меня этот макрос.
 
Что именно не работает ?
 
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Dim awb As Workbook, nwb As Workbook
Set awb = ActiveWorkbook
With Worksheets("Аркуш1")
fn = .Cells(1, 2).Value & "_" & .Cells(1, 1).Value & "_" & .Cells(1, 3).Value
End With
pth = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop") & _
            "\Отчет\" & fn & ".xlsx"
nsh = ActiveWorkbook.Sheets.Count
Set nwb = Workbooks.Add(1)
For x = nsh To 1 Step -1
awb.Sheets(x).Copy After:=nwb.Sheets(1)
Next
Application.DisplayAlerts = False
nwb.Sheets(1).Delete
nwb.SaveCopyAs Filename:=pth
nwb.Close
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Это не удалось запустить, а вариант Михаила Лебедева, не пойму где код скопировать, чтобы вставить в свой файл

Кнопка форматирования кода <...> [МОДЕРАТОР]
 
Попробуйте так, немного подредактированный код от JayBhagavan
Адрес сохранения "рабочий стол \отчет", с проверкой папки на наличие
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim WshShell As Object, oFS As Object
Dim target_path As String
    Set WshShell = CreateObject("WScript.Shell")
    Set oFS = CreateObject("Scripting.FileSystemObject")
    target_path = WshShell.SpecialFolders("Desktop") & "Отчет\" 'на рабочий стол в \отчет
    If Not oFS.FolderExists(target_path) Then 'проверка на наличие папки
        MsgBox "Папка " & Chr(34) & target_path & " не существует, создайте папку." & vbCrLf & _
               "Копия файла не сохранена.", 16
        Cancel = True
        Exit Sub
    End If
    With ActiveSheet
        target_path = target_path & .Range("B1").Value & "_" & .Range("A1").Value & "_" & .Range("C1").Value & ".xls"
    End With
    Me.SaveCopyAs target_path
End Sub 

Jonny код следует оформлять тегом. - Это касается поста №21

Код Михаила Лебедева
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.SaveAs Filename:=Range("Имя"), _
        FileFormat:=xlExcel12, CreateBackup:=False
End Sub
Процедура ссылается на именованный диапазон "Имя" = ячейка "В3".
FileFormat:=xlExcel12 -  формат Ексель 2010.  Лучше заменить на FileFormat:=xlNormal - так будет работать в любой версии.
Изменено: TSN - 16.09.2015 16:28:49
 
Jonny, если я правильно понял, то у Вас отсутствует понимание куда разместить код. Почитайте.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Та вроде бы понимаю. В любом случае - огромнейшее спасибо. Скажите может этот макрос конфликтовать с комбобоксом?
 
Jonny, а как комбобокс у Вас может влиять на событие закрытия книги?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Все, разобрался. Ура. Ребята, вы лучшие - не знаю что бы я без вас шаманил??? Всем спасибо.
Страницы: 1
Наверх