I know to run a macro in a module from vbscript it’s as simple as
objexcel.Application.Run "Filename!MacroName"
But, what if the file name is variable—but the directory only contains one file (which has already been opened)?
Could it be as simple as:
objexcel.Application.Run wkbk.path "Macroname"
asked Mar 4, 2015 at 14:49
1
It works with
objexcel.run "MacroName"
qwerty_so
35.2k8 gold badges62 silver badges85 bronze badges
answered Mar 4, 2015 at 16:24
Assuming wkbk
is a workbook object, you can use:
objexcel.Application.Run "'" & wkbk.Name & "'!Macroname"
the single quotes are there in case the workbook name contains spaces. Note you don’t need the path since the workbook is open.
answered Mar 4, 2015 at 16:12
RoryRory
32.4k5 gold badges31 silver badges34 bronze badges
Irbis_evs
Пользователь
Сообщений: 337
Регистрация: 30.03.2017
частично, забыл уточнить, что код открывает другой файл, необходимо вернуться обратно.
начало кода:
Код |
---|
Dim sh 'As Worksheet, i&, lRow Dim lSpisok, itable, dSpisok, prod, dd book = ThisWorkbook.Name ' Настройка списка фильтров Filt = ("XLS Files(*.xl*),*.xl*") 'Получение имени файла FileName1 = Application.GetOpenFilename(FileFilter:=Filt) ' При отмене выйти иэ окна If FileName1 = False Then MsgBox "Файл не выбран." End If Set objCloseBook = GetObject(FileName1) 'objCloseBook.Close False Windows("123.xlsm").Activate Worksheets("Список").Select ActiveSheet.Unprotect ' Отображение полного имени и пути 'MsgBox OpenWorkbook(GetObject(FileName1).Name) |
Инженер не тот, кто все знает, а тот кто знает где найти ответ.
Открыть макросом файл с переменным именем |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Привет, сейчас мы рассмотрим ситуацию, когда у Вас возникла необходимость в Excel сохранять файл с определенным названием, которое необходимо сформировать из значения ячейки или даже нескольких. В этой заметке я приведу простой пример реализации данной задачи.
Содержание
- Исходные данные
- Сохранение файла Excel с названием из ячейки — с привязкой к этой ячейке
- Добавление кнопки в Excel для запуска макроса
- Сохранение файла Excel с названием из ячейки — без привязки к ячейке
- Сохранение файла Excel с названием, которое сформировано из значений двух ячеек
Исходные данные
Сначала давайте разберем исходные данные, которые я буду использовать в примерах. Пусть это будет некая абстракция марок автомобилей с указанием их VIN номера.
Примечание! Я использую Excel 2013.
В зависимости от конкретных требований и условий, задачу можно реализовать по-разному, хотя принцип будет один и тот же, в этой статье мы рассмотрим несколько вариаций реализации.
Начнем мы с самой простой ситуации, когда заранее известна ячейка, на основе которой будет сформировано имя файла, и адрес этой ячейки изменяться не будет.
Заметка! Этапы разработки программы – как создаются и проектируются программы?
Итак, данные у нас есть, теперь необходимо написать процедуру на VBA (макрос), которая брала бы значение из конкретной ячейки, в данном случае это будет ячейка B14, и присваивала бы это значение имени файла.
Ниже представлен код процедуры, я его подробно прокомментировал. Единственное скажу, что я во всех примерах сохраняю новые файлы без макросов (расширение .xlsx), т.е. по факту будет один файл с поддержкой макросов, а все производные — без.
Если нужно сохранять макрос в каждом файле, т.е. файлы с поддержкой макросов (расширение .xlsm), то необходимо просто указать другой тип файла при сохранении, а именно xlOpenXMLWorkbookMacroEnabled, в процедурах в комментариях я это указываю.
Открываем в Excel редактор Visual Basic, и вставляем код следующей процедуры в исходный код этой книги (ЭтаКнига, открыть двойным кликом) или в модуль, который Вы предварительно должны создать.
Примечание! Для того чтобы открыть редактор Visual Basic в Excel, необходимо перейти на вкладку «Разработчик» и нажать на кнопку «Visual Basic». Файл Excel с кодом процедуры необходимо сохранить с типом «Книга Excel с поддержкой макросов».
Код процедуры
Sub SaveFile() 'Объявление переменных Dim CellValue As String Dim Path As String Dim FinalFileName As String 'Временно отключаем показ вспомогательных сообщений Application.DisplayAlerts = False 'Задаём каталог сохранения файла (в данном случае текущий каталог) Path = ThisWorkbook.Path & "" 'Получаем значение ячейки CellValue = Range("B14") 'Формируем итоговый путь и название файла FinalFileName = Path & CellValue 'Сохраняем файл ActiveWorkbook.SaveAs FileName:=FinalFileName, _ FileFormat:=xlOpenXMLWorkbook 'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом 'Включаем вывод сообщений Application.DisplayAlerts = True 'Сообщение с результатом выполнения процедуры MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат" End Sub
После сохранения файла запустите макрос («Макросы -> Выполнить -> SaveFile»).
В результате в моем случае процедура успешно выполнилась, файл сохранился с названием «Марка Авто 1», данное значение взято из ячейки B14, о чем будет свидетельствовать сообщение в конце процедуры. Файл сохранен в каталоге, где и исходный файл (во всех примерах ниже прописано то же самое, т.е. сохранение рядом с исходником, но это Вы можете изменить).
Заметка! Статический анализ кода в теории и на практике.
Добавление кнопки в Excel для запуска макроса
Каждый раз открывать окно с макросами и выбирать нужный макрос не очень удобно, поэтому можно легко добавить кнопку где-нибудь рядом с данными и просто нажимать ее. Это делается следующим образом «Вкладка Разработчик -> Вставить -> Кнопка (элемент управления формы)».
Затем выберите место, где вставить кнопку, и нажмите туда. После этого появится окно назначения действия, т.е. нужно выбрать, какой макрос запускать при нажатии этой кнопки, выбираем наш макрос, т.е. SaveFile, и нажимаем «ОК».
В итоге появится кнопка с названием «Кнопка», это название лучше изменить, например, на «Сохранить файл». Для этого нажмите правой кнопкой мыши на кнопку и выберите настройки «Изменить текст». В итоге у Вас должно получиться что-то вроде этого.
Заметка! ТОП 7 популярных языков программирования.
Сохранение файла Excel с названием из ячейки — без привязки к ячейке
Теперь давайте представим, что заранее мы не можем определить, какая именно ячейка будет формировать название файла (может B14, а может и нет), поэтому мы можем немного скорректировать алгоритм таким образом, чтобы он брал значение из ячейки, которая является активной, но в этом случае Вы, конечно же, предварительно, должны выбрать ее (т.е. встать на нее).
Замените код процедуры следующим кодом, который совсем немного, но изменен.
Sub SaveFile() 'Объявление переменных Dim CellValue As String Dim Path As String Dim FinalFileName As String 'Временно отключаем показ вспомогательных сообщений Application.DisplayAlerts = False 'Задаём каталог сохранения файла (в данном случае текущий каталог) Path = ThisWorkbook.Path & "" 'Проверка значения ячейки If ActiveCell.Value = "" Then MsgBox "В ячейке отсутствует значение", vbCritical, "Ошибка!" Exit Sub End If 'Получаем значение активной ячейки CellValue = ActiveCell.Value 'Формируем итоговый путь и название файла FinalFileName = Path & CellValue 'Сохраняем файл ActiveWorkbook.SaveAs FileName:=FinalFileName, _ FileFormat:=xlOpenXMLWorkbook 'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом 'Включаем вывод сообщений Application.DisplayAlerts = True MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат" End Sub
Проверяем работу, становимся на нужную ячейку, и запускаем макрос (в процедуре я добавил проверку, если выбрана пустая ячейка, возникнет ошибка).
Как видим, все отработало.
Сохранение файла Excel с названием, которое сформировано из значений двух ячеек
Теперь представим, что нам нужно сформировать файл с названием из значений двух ячеек. Например, в нашем случае это может быть «Марка Авто – VIN Номер», в качестве разделителя я указал символ – (дефис), но им может выступать любой символ или вовсе отсутствовать.
В этом примере я покажу, как можно это реализовать с привязкой к конкретным ячейкам, в нашем случае B14 и D14.
Код процедуры в данном случае будет выглядеть следующим образом.
Sub SaveFile() 'Объявление переменных Dim CellValue As String Dim Path As String Dim FinalFileName As String 'Временно отключаем показ вспомогательных сообщений Application.DisplayAlerts = False 'Задаём каталог сохранения файла (в данном случае текущий каталог) Path = ThisWorkbook.Path & "" 'Проверка значения ячеек B14 и D14 If Range("B14").Value = "" Or Range("D14").Value = "" Then MsgBox "В ячейке отсутствует значение", vbCritical, "Ошибка!" Exit Sub End If 'Складываем значения из двух ячеек B14 и D14 CellValue = Range("B14").Value & " - " & Range("D14").Value 'Формируем итоговый путь и название файла FinalFileName = Path & CellValue 'Сохраняем файл ActiveWorkbook.SaveAs FileName:=FinalFileName, _ FileFormat:=xlOpenXMLWorkbook 'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом 'Включаем вывод сообщений Application.DisplayAlerts = True MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат" End Sub
Запускаем макрос.
Все ОК, файл создан.
Заметка! Как измерить сложность кода программы при программировании?
Если вдруг нужно реализовать без привязки к конкретным ячейкам, например, значения хранятся в определённых столбцах, но конкретная строка неизвестна Вам заранее. Например, у меня несколько строк со значениями, и какие конкретно значения взять за основу названия файла, я хочу указывать самостоятельно, непосредственно перед сохранением, но при этом не редактировать код процедуры.
Для этого мы снова внесем изменения в нашу процедуру, которая будет работать от активной ячейки (смещение от активной ячейки), только с условием того, что выбран столбец с теми значениями, которые необходимо использовать.
Код процедуры
Sub SaveFile() 'Объявление переменных Dim CellValue As String Dim Path As String Dim FinalFileName As String 'Временно отключаем показ вспомогательных сообщений Application.DisplayAlerts = False 'Задаём каталог сохранения файла (в данном случае текущий каталог) Path = ThisWorkbook.Path & "" 'Проверка номера столбца If ActiveCell.Column <> 2 Then MsgBox "Указан некорректный столбец", vbCritical, "Ошибка!" Exit Sub End If 'Проверка значения ячейки If ActiveCell.Value = "" Then MsgBox "В ячейке отсутствует значение", vbCritical, "Ошибка!" Exit Sub End If 'Получаем значение активной ячейки CellValue = ActiveCell.Value 'Смещаемся на 2 столбца, относительно активной ячейки ActiveCell.Offset(0, 2).Select 'Складываем значения из двух ячеек CellValue = CellValue & " - " & ActiveCell.Value 'Формируем итоговый путь и название файла FinalFileName = Path & CellValue 'Сохраняем файл ActiveWorkbook.SaveAs FileName:=FinalFileName, _ FileFormat:=xlOpenXMLWorkbook 'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом 'Включаем вывод сообщений Application.DisplayAlerts = True MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат" End Sub
Становитесь на любую ячейку со значением в столбце B, и запускайте макрос.
Заметка! Опрос. Какой операционной системой Вы пользуетесь?
У меня на этом все, надеюсь, материал был Вам полезен, пока!
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
1 |
|
Присвоение переменной имени книги и листа17.11.2013, 19:04. Показов 52469. Ответов 34
Есть файл (Расчет.xls). В нем 3 листа(Лист1, Лист2, Лист3). Как при открытии файла присвоить переменной (F) имя файла и имя нужного листа для использования в range(F.cells(….))
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||
17.11.2013, 19:09 |
2 |
|||
вариантов несколько. Некоторые из них?
0 |
ali_vlad 5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
||||
17.11.2013, 19:11 [ТС] |
3 |
|||
вариантов несколько. Некоторые из них?
Мне надо F=Файл(«Расчет»)+Worksheets(«Лист1»)’ так можно?
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 19:17 |
4 |
|||
Так нельзя.
1 |
ali_vlad 5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
||||
17.11.2013, 19:23 [ТС] |
5 |
|||
Так нельзя.
А VBA не перепутает книги, например если открыто 2 файла и в каждом есть свой код на VBA Добавлено через 4 минуты
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 19:23 |
6 |
|||
Вопрос был «Как при открытии файла присвоить переменной» — так что смотрите сами не перепутайте
1 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 19:59 [ТС] |
7 |
Set wb = Workbooks.Open(filename, False, True) По моему это не совсем то, что я хотел. Я хотел, чтобы при открытии книги переменной присваивалось имя этой же книги: wb=имя_книги.xls Добавлено через 18 минут
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 20:16 |
8 |
|||
Ещё за час до того, как Вы разобрались, было написано:
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 20:22 [ТС] |
9 |
В Вашем примере указывается непосредственно «Лист1». Я же хотел, чтобы VBA сам получал имя файла и имя листа и присваивал это переменной. Set F = Application.ActiveWorkbook.Sheets(1)
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 20:34 |
10 |
В чём принципиальная разница? Лист могут переименовать? Так могут же и передвинуть!
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 20:45 [ТС] |
11 |
В чём принципиальная разница? Лист могут переименовать? Так могут же и передвинуть! В таком случае можно ли при загрузке книги запретить переименование и перемещение листов?
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 20:50 |
12 |
При загрузке? Вы им запретите это делать до сохранения!
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 21:02 [ТС] |
13 |
При загрузке? Вы им запретите это делать до сохранения! В моей книге идет «онлайн» расчет, При работе на 1м листе идет выборка данных со 2-го и наоборот. Если в процессе работы переименовать или переместить листы, то это вызовет «kernel panic» . Вот бы запретить переименование и перемещение сразу после открытия. Как бы «защита от дурака». А как они называются — это не важно. Да и еще как запретить открывать другие книги при открытой этой?
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 21:11 |
14 |
Линейкой по пальцам. Думаю самое простое и надёжное P.S. Вообще правильно написанному макросу другие книги не помеха.
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 21:19 [ТС] |
15 |
Сразу это Workbook_Open()
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 21:22 |
16 |
Ну просто старайтесь нигде не использовать selection и activate — и уже будет намного надёжнее. И быстрее.
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 21:25 [ТС] |
17 |
Как это правильно оформить
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 21:29 |
18 |
|||
Хотя и Ваш вариант рабочий, но я обычно пишу Not.
0 |
ali_vlad 5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
||||
17.11.2013, 21:38 [ТС] |
19 |
|||
Хотя и Ваш вариант рабочий, но я обычно пишу Not. Так на что заменить (ячейка_в_которую_вводится_значение)
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 21:43 |
20 |
|||
Я например так сделал:
Хотя конечно сомнительно, что тут нужна переменная, но бывает что и нужна…
0 |