Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Office (Word, Excel, Outlook и т.д.) (http://forum.oszone.net/forumdisplay.php?f=115)
-   -   [решено] Сохранение Excel файла из макроса (http://forum.oszone.net/showthread.php?t=347074)

mastertm 19-11-2020 17:45 2940453

Сохранение Excel файла из макроса
 
Здравствуйте!
Каждый день создается файл .xlsx в названии которго изменяется дата создания. Например, сегодня - "FIC_09.10.2020", завтра - "FIC_10.10.2020".
Создал макрос, который форматирует этот файл, сохраняет его и закрывает. Но понадобилось перед закрытием сохранить этот файл еще и на другой носитель (USB). Функция "Запись макроса" не помогда, так как макрос запоминает команду как "ChDir "I:\ABC (перенос) ActiveWorkbook.SaveAs Filename:="I:\ABC\FIC_10.10.2020 и т.д.".
Но завтра дата изменится и макрос выдаст ошибку.
Пролистал книги, но ничего похожего не нашел.
Подскажите, пожалуйста: как написать команду, чтобы файл каждый день сохранялся под новым именем (с измененной датой).

Спасибо

С уважением...

Iska 19-11-2020 19:42 2940462

mastertm, упакуйте в архив всё, что у Вас сейчас есть, каковой приложите к сообщению.

megaloman 19-11-2020 20:35 2940465

Вложений: 1
Я понимаю задачу так: имеем рабочую книгу, например, MyMacros.xlsm, содержащую макрос(ы) для обработки файлов, например, вида FIC_дд.мм.гггг.xlsx. То есть, макрос(ы) хранятся в отдельной книге, обрабатывают другие книги указанного вида.
Вот пример двух макросов.
Код:

Sub MyMacros()

FileInPref = "Z:\Box_In\FIC_"
BoxOut = "Z:\Box_Out"

' Обрабатываем файл текущего дня "FIC_дд.мм.гггг.xlsx"

FileIn = FileInPref + Mid(Now, 1, 10) + ".xlsx"
Workbooks.Open Filename:=FileIn
   
Call Processing  'Процедура для обработки открытой таблицы

ActiveWorkbook.Save
ActiveWorkbook.Close

With CreateObject("Scripting.FileSystemObject")
    .CopyFile FileIn, BoxOut + "\" + .GetFileName(FileIn), True
End With

End Sub

Sub MyDial()

FileInPref = "Z:\Box_In\FIC_"
BoxOut = "Z:\Box_Out"

' Выбираем для обработки файл из "Префикс_дд.мм.гггг.xlsx"

With Application.FileDialog(msoFileDialogFilePicker)
    .InitialFileName = FileInPref + "*.xlsx"
    .InitialView = msoFileDialogViewList
    .AllowMultiSelect = False

    fileChosen = .Show
    If fileChosen = -1 Then
        FileIn = .SelectedItems(1)
        Workbooks.Open Filename:=FileIn
       
        Call Processing  'Процедура для обработки открытой таблицы

        ActiveWorkbook.Save
        ActiveWorkbook.Close

        With CreateObject("Scripting.FileSystemObject")
            .CopyFile FileIn, BoxOut + "\" + .GetFileName(FileIn), True
        End With
    Else
        MsgBox "Файл не выбран"
    End If
End With

End Sub

Sub Processing()
        ' ==== Просто пример обработки исходного активного листа книги =========
            Columns("C:C").NumberFormat = "0.00"
        ' ==== Конец примера обработки исходного файла =========
End Sub

Оба макроса в принципе очень похожи.

MyMacros обрабатывает файл текущего дня,
MyDial позволяет выбрать файл для обработки.

FileInPref = "Z:\Box_In\FIC_" - путь и префикс исходных файлов
BoxOut = "Z:\Box_Out" - папка для записи копии обработанного файла

Обработку Вашей рабочей книги лучше выделить в отдельную процедуру, я это сделал как пример в процедуре Processing

Прикрепляю пример книги с макросами. Уберите расширение .txt

mastertm 20-11-2020 09:32 2940485

Iska и megaloman спасибо, что откликнулись!

Макрос сохранен в отдельной книге. Запускается файл с макросом, затем исходный файл, который становится активным. Из этого исходного файла запускается макрос, который производит форматирование содержимого (приводит в читабельный вид). В конце макроса записал:

ActiveWorkbook.Save (файл сохраняется в ту папку, из которой был вызван)
ActiveWorkbook.SaveAs "I:\ABC\xxxxx"
ActiveWindow.Close (файл закрывается)

Если запустить макрос в таком виде, файл сохранится на диск I, в папку АВС с именем ххххх.xlsx/

Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.xlsx" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.*" - выдает ошибку.

То есть название файла нужно вводить! Мне же нужно, чтобы файл сохранялся под исходным именем автоматом.
Вообще-то, конечно, не проблема вручную скинуть на флешку. Но интересно решить эту, казалось бы, простую задачу.

Спасибо

Iska, Вам отдельное спасибо. Каждый раз вы приходите мне на помощь. Я два или три раза создавал темы.
megaloman, спасибо за приведенный листинг, но это чересчур сложно. Я надеялся на простое решение. Ваше решение сугубо профессиональное, а я - простой пользователь.

С уважением...

megaloman 20-11-2020 17:02 2940521

Цитата:

Цитата mastertm
Макрос сохранен в отдельной книге. Запускается файл с макросом, затем исходный файл, который становится активным. »

Файл с макросом имеет расширение .xlsm, исходный файл, например, "FIC_09.10.2020.xlsx", не может содержать макрос. Поэтому:
Цитата:

Цитата mastertm
Из этого исходного файла запускается макрос, который производит форматирование содержимого »

этого не может быть. У Вас макрос с форматированием может быть только в файле с макросом с расширением .xlsm. Вот эта фраза:
Цитата:

Цитата mastertm
а я - простой пользователь. »

с моей точки зрения - кокетство. Вы решаете задачу - здорово, но неверно выбрать путь решения, которое ни к чему не привёл и требовать от других ему следовать. Возьмите не мой листинг, а мою таблицу с макросами, подкорректируйте мои пути на свои, создайте тестовую исходную таблицу, убедитесь, что использовать оба макроса не составляет труда для "простой пользователь". Вам только надо вписать свою процедуру форматирования открытой исходной книги, которая после открытия становится активной.
Цитата:

Цитата Iska
mastertm, упакуйте в архив всё, что у Вас сейчас есть, каковой приложите к сообщению. »

Прислушайтесь!

Iska 20-11-2020 19:07 2940533

Я после этого:
Цитата:

Цитата mastertm
Запускается файл с макросом, затем исходный файл, который становится активным. Из этого исходного файла запускается макрос, »

перестал понимать кто на ком стоял где же макрос.

a_axe 21-11-2020 21:28 2940643

Цитата:

Цитата mastertm
Создал макрос, который форматирует этот файл, сохраняет его и закрывает. Но понадобилось перед закрытием сохранить этот файл еще и на другой носитель (USB). »

Цитата:

Цитата mastertm
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.xlsx" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.*" - выдает ошибку. »

mastertm, сохранить копию файла под исходным именем, но по новому пути (флешка или просто папка бэекапа) в 2016 офисе успешно решается строчкой
Код:

ActiveWorkbook.SaveAs "I:\ABC\" & ActiveWorkbook.Name
На заявленном 2010 проверяйте сами, возможно нужно добавить & ".xlsx" (в поиске проскакивает указание расширения, у меня все прекрасно работает и без него).
Цитата:

Цитата megaloman
только в файле с макросом с расширением .xlsm. »

Ну строго говоря - xlsm, xls, xlsb, xla, xlam :), хотя смысла это разумеется не меняет.
Цитата:

Цитата mastertm
Из этого исходного файла запускается макрос »

Полагаю, это просто неточная фигура речи: я нахожусь в рабочем файле xlsx и вызываю, находясь в нем - "из него" - макрос (который хранится и в конечном итоге вызывается разумеется из стороннего xlsm файла).
Цитата:

Цитата megaloman
с моей точки зрения - кокетство. »

megaloman, объективно говоря - код у Вас достаточно сложный :) , мне кажется, на первых шагах изучения VBA - неподъемный.

mastertm 23-11-2020 09:39 2940764

a_axe - браво!

Всем - здравствуйте!
Поподробнее обо всем. Каждый день скачиваю данные с десяти узлов с параметрами работы в виде файла .xlsx. Эти десять файлов нужно привести в читабельный вид. Для этого написал макрос:

Sub Macros1ALL()
'
' Macros1
'
For i = 1 To 10
' тут производится форматирование
ActiveWorkbook.Save
ActiveWindow.Close
Next i
End Sub

Сохраняю макрос и не забываю указать, что он находится в "Все открытые книги".
Запускаю файл с макросом, затем в проводнике выделяю все 10 файлов и нажимаю "Открыть".
Последний открытый файл становится "ActiveWindow". Из этого файла выбираю: Разработчик-Макросы-Macros1-Выполнить.
Все прекрасно работает, файлы сохраняются в той папке, откуда были вызваны . Проблема была в том, что нужно было сохранять эти файлы еще и на USB-диск.
Сегодня утром нашел (до того как зашел на форум - a_axe опередил): https://docs.microsoft.com/ru-ru/off...-network-drive
После этого макрос принял вид:

Sub Macros2GALL()
'
' Macros1
'
For i = 1 To 10

ActiveWorkbook.Save
MyFile = ActiveWorkbook.Name
ActiveWorkbook.SaveAs Filename:="I:\CG\KPR\" & MyFile
ActiveWindow.Close
Next i
End Sub

В своих поисках я исходил из следующего: не может быть, чтобы для выполнение такой рутинной операции было необходимо вызывать целую процедуру. Должен был быть более простой путь. Разработчики пакета Office не могли об этом не подумать!
Я скачал и исследовал несколько книг по VBA-программированию, но ни одна из них мне не помогла.
Зато помогли мне вы, мои друзья. Надеюсь, я могу Вас так назвать. Всем большое спасибо. Удачи!

Пожалуйста, научите напоследок как ставить благодарности.

С уважением...

Всех поблагодарил! Всем спасибо!

megaloman 23-11-2020 15:51 2940803

Вложений: 1
mastertm, Вот вариант с возможностью выбора группы файлов (уберите только расширение txt), в макросе пропишите свои пути и вставьте свой код из макроса форматирования. Для удобства связал с макросом кнопку. Вы пишите:
Цитата:

Цитата mastertm
затем в проводнике выделяю все 10 файлов »

Если в папке содержатся только те файлы, которые надо обработать, вообще можно написать загрузку всех этих файлов без Ваших лишних телодвижений в проводнике. А чтобы не путаться, я бы предложил перемещать обработанные файлы в другую, архивную папку. Можно сделать выбор указания пути для копирования на флэшку - вдруг её буковка изменилась. Лень - двигатель прогресса, эта рутина должна отрабатываться одной кнопкой. Развивайтесь, на вопросы по коду готов помогать.

Iska 23-11-2020 21:57 2940834

mastertm, лучше использовать не макрос, а внешний WSH/PoSH скрипт. Потом просто перетаскиваете из Проводника на скрипт/ярлык на скрипт Рабочую книгу — и всё.

mastertm 25-11-2020 14:36 2940988

Спасибо за рекомендации.
Непременно воспользуюсь. Нужно время, чтобы разобраться. Раньше это не применял.

С уважением...


Время: 18:33.

Время: 18:33.
© OSzone.net 2001-