Показать полную графическую версию : [решено] Сохранение Excel файла из макроса
mastertm
19-11-2020, 17:45
Здравствуйте!
Каждый день создается файл .xlsx в названии которго изменяется дата создания. Например, сегодня - "FIC_09.10.2020", завтра - "FIC_10.10.2020".
Создал макрос, который форматирует этот файл, сохраняет его и закрывает. Но понадобилось перед закрытием сохранить этот файл еще и на другой носитель (USB). Функция "Запись макроса" не помогда, так как макрос запоминает команду как "ChDir "I:\ABC (перенос) ActiveWorkbook.SaveAs Filename:="I:\ABC\FIC_10.10.2020 и т.д.".
Но завтра дата изменится и макрос выдаст ошибку.
Пролистал книги, но ничего похожего не нашел.
Подскажите, пожалуйста: как написать команду, чтобы файл каждый день сохранялся под новым именем (с измененной датой).
Спасибо
С уважением...
mastertm, упакуйте в архив всё, что у Вас сейчас есть, каковой приложите к сообщению.
megaloman
19-11-2020, 20:35
Я понимаю задачу так: имеем рабочую книгу, например, 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
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
Макрос сохранен в отдельной книге. Запускается файл с макросом, затем исходный файл, который становится активным. »Файл с макросом имеет расширение .xlsm, исходный файл, например, "FIC_09.10.2020.xlsx", не может содержать макрос. Поэтому:Из этого исходного файла запускается макрос, который производит форматирование содержимого » этого не может быть. У Вас макрос с форматированием может быть только в файле с макросом с расширением .xlsm. Вот эта фраза:а я - простой пользователь. » с моей точки зрения - кокетство. Вы решаете задачу - здорово, но неверно выбрать путь решения, которое ни к чему не привёл и требовать от других ему следовать. Возьмите не мой листинг, а мою таблицу с макросами, подкорректируйте мои пути на свои, создайте тестовую исходную таблицу, убедитесь, что использовать оба макроса не составляет труда для "простой пользователь". Вам только надо вписать свою процедуру форматирования открытой исходной книги, которая после открытия становится активной. mastertm, упакуйте в архив всё, что у Вас сейчас есть, каковой приложите к сообщению. »Прислушайтесь!
Я после этого:
Запускается файл с макросом, затем исходный файл, который становится активным. Из этого исходного файла запускается макрос, »
перестал понимать кто на ком стоял где же макрос.
Создал макрос, который форматирует этот файл, сохраняет его и закрывает. Но понадобилось перед закрытием сохранить этот файл еще и на другой носитель (USB). »
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.xlsx" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.*" - выдает ошибку. »
mastertm, сохранить копию файла под исходным именем, но по новому пути (флешка или просто папка бэекапа) в 2016 офисе успешно решается строчкой
ActiveWorkbook.SaveAs "I:\ABC\" & ActiveWorkbook.Name
На заявленном 2010 проверяйте сами, возможно нужно добавить & ".xlsx" (в поиске проскакивает указание расширения, у меня все прекрасно работает и без него).
только в файле с макросом с расширением .xlsm. »
Ну строго говоря - xlsm, xls, xlsb, xla, xlam :), хотя смысла это разумеется не меняет.
Из этого исходного файла запускается макрос »
Полагаю, это просто неточная фигура речи: я нахожусь в рабочем файле xlsx и вызываю, находясь в нем - "из него" - макрос (который хранится и в конечном итоге вызывается разумеется из стороннего xlsm файла).
с моей точки зрения - кокетство. »
megaloman, объективно говоря - код у Вас достаточно сложный :) , мне кажется, на первых шагах изучения VBA - неподъемный.
mastertm
23-11-2020, 09:39
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/office/troubleshoot/excel/save-file-to-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
mastertm, Вот вариант с возможностью выбора группы файлов (уберите только расширение txt), в макросе пропишите свои пути и вставьте свой код из макроса форматирования. Для удобства связал с макросом кнопку. Вы пишите:затем в проводнике выделяю все 10 файлов »Если в папке содержатся только те файлы, которые надо обработать, вообще можно написать загрузку всех этих файлов без Ваших лишних телодвижений в проводнике. А чтобы не путаться, я бы предложил перемещать обработанные файлы в другую, архивную папку. Можно сделать выбор указания пути для копирования на флэшку - вдруг её буковка изменилась. Лень - двигатель прогресса, эта рутина должна отрабатываться одной кнопкой. Развивайтесь, на вопросы по коду готов помогать.
mastertm, лучше использовать не макрос, а внешний WSH/PoSH скрипт. Потом просто перетаскиваете из Проводника на скрипт/ярлык на скрипт Рабочую книгу — и всё.
mastertm
25-11-2020, 14:36
Спасибо за рекомендации.
Непременно воспользуюсь. Нужно время, чтобы разобраться. Раньше это не применял.
С уважением...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.