Excel VBA Макросы: Макрос без учета имени файла.

Автор дед Пихто, 25 августа 2020, 21:47

дед Пихто

Есть программа которая каждый день создает отчет примерно с таким названием "отчет 20.08.2020_19.35.xlsx". Этот отчет нужно привести к более читаемому и красивому виду и вставить в него шапку из другого екселевского файла.

Я сделал макрос, который все это делает, но вот проблема, при создании макроса с помощью макрорекордера создаётся макрос, в котором используется имя файла, с которым работает макрос. Если затем применить полученный макрос к файлу, у которого другое имя, то макрос не работает. А в следующий день отчет будет называться по другому.

Я в макросе указал имя "1.xlsx" и перед запуском макроса переименовываю файл в "1.xlsx".
Можно сделать так, чтобы макрос работал с любым именем файла?

Действия пользователя по работе с макросом:
1. Переименовываю свежесозданнный "отчет 25.08.2020_16.35.xlsx" в "1.xlsx".
2. Запускаю макрос.
3. Получаю готовый документ. Вручную "сохраняю как".
4. Вручную закрываю "другой файл.xlsx", который открылся в процессе работы макроса.

Ниже краткий пример такого макроса.

Макрос
Sub Макрос1()

    Workbooks.Open Filename:="C:\Users\User\Desktop\другой файл.xlsx"
    Range("C4:H12").Select
    Selection.Copy
    Windows("отчет 20.08.2020_19.35.xlsx").Activate
    ActiveSheet.Paste
    Range("K21").Select
    ActiveWindow.Close

End Sub
[свернуть]

Администратор

В программировании можно использовать имена. Можно назначить имя файлу, листу и затем можно обращаться к файлу, листу по имени. Такое имя называется "ссылка".

Не всегда есть необходимость выделять диапазон, чтобы с ним что-то сделать: можно сделать действия с диапазоном без использования "Selection".

Код
Sub Макрос()
   
    Dim КнигаОтчёт As Workbook, КнигаДругая As Workbook
    Dim ЛистОтчёт As Worksheet, ЛистДругой As Worksheet
   
   
    '1. Присваиваем имя "КнигаОтчёт" активному файлу. Далее макрос будет
        ' обращаться к этому файлу по этому имени.
        ' Активный файл - это файл, который пользователь видит на мониторе.
        ' Перед запуском макроса активным файлом должен быть отчёт.
    Set КнигаОтчёт = ActiveWorkbook
   
    '2. Присваиваем имя "ЛистОтчёт" активному листу. Далее макрос будет
        ' обращаться к этому листу по этоиму имени.
        ' Активный лист - это лист, который пользователь видит на мониторе.
    Set ЛистОтчёт = ActiveSheet
   
    '3. Открытие другого файла. Ему присваиваем имя "КнигаДругая".
    Set КнигаДругая = Workbooks.Open(Filename:="C:\Users\User\Desktop\другой файл.xlsx")
   
    '4. Присваиваем имя "ЛистДругой" активному листу другого файла.
    Set ЛистДругой = КнигаДругая.ActiveSheet
   
    '5. Копирование фрагмента из одного файла в другой.
    ЛистДругой.Range("C4:H12").Copy
    ЛистОтчёт.Paste
   
    '6. Переход в отчёт, чтобы выделить ячейку "K21".
    КнигаОтчёт.Activate
   
    '7. Выделение ячейки.
    ЛистОтчёт.Range("K21").Select
   
    '8. Закрытие другого файла.
    КнигаДругая.Close SaveChanges:=False

End Sub
[свернуть]

дед Пихто

Все работает.
Спасибо большое за помощь, я получил бесценный опыт.