Открытие книги Excel из кода VBA. Проверка существования книги. Создание новой книги, обращение к открытой книге и ее закрытие. Методы Open, Add и Close.
Открытие существующей книги
Существующая книга открывается из кода VBA Excel с помощью метода Open:
1 |
Workbooks.Open Filename:="D:\test1.xls" |
или
1 |
Workbooks.Open ("D:\test1.xls") |
В кавычках указывается полный путь к открываемому файлу Excel. Если такой файл не существует, произойдет ошибка.
Проверка существования файла
Проверить существование файла можно с помощью функции Dir. Проверка существования книги Excel:
1 2 3 4 5 |
If Dir("D:\test1.xls") = "" Then MsgBox "Файл не существует" Else MsgBox "Файл существует" End If |
Или, если файл (книга Excel) существует, можно сразу его открыть:
1 2 3 4 5 |
If Dir("D:\test1.xls") = "" Then MsgBox "Файл не существует" Else Workbooks.Open Filename:="D:\test1.xls" End If |
Создание новой книги
Новая рабочая книга Excel создается в VBA с помощью метода Add:
1 |
Workbooks.Add |
Созданную книгу, если она не будет использоваться как временная, лучше сразу сохранить:
1 2 |
Workbooks.Add ActiveWorkbook.SaveAs Filename:="D:\test2.xls" |
В кавычках указывается полный путь сохраняемого файла Excel, включая присваиваемое имя, в примере — это «test2.xls».
Обращение к открытой книге
Обращение к активной книге:
1 |
ActiveWorkbook |
Обращение к книге с выполняемым кодом:
1 |
ThisWorkbook |
Обращение к книге по имени:
1 2 |
Workbooks("test1.xls") Workbooks("test2.xls") |
Обратиться по имени можно только к уже открытой книге, а чтобы из кода VBA Excel книгу открыть, необходимо указать полный путь к файлу.
Как закрыть книгу Excel из кода VBA
Открытая рабочая книга закрывается из кода VBA Excel с помощью метода Close:
1 |
Workbooks("test1.xlsx").Close |
Если закрываемая книга редактировалась, а внесенные изменения не были сохранены, тогда при ее закрытии Excel отобразит диалоговое окно с вопросом: Вы хотите сохранить изменения в файле test1.xlsx? Чтобы файл был закрыт без сохранения изменений и вывода диалогового окна, можно воспользоваться параметром метода Close — SaveChanges:
1 |
Workbooks("test1.xlsx").Close SaveChanges:=False |
или
1 |
Workbooks("test1.xlsx").Close (False) |
Закрыть книгу Excel из кода VBA с сохранением внесенных изменений можно также с помощью параметра SaveChanges:
1 |
Workbooks("test1.xlsx").Close SaveChanges:=True |
или
1 |
Workbooks("test1.xlsx").Close (True) |
Фразы для контекстного поиска: открыть книгу, открытие книги, создать книгу, создание книги, закрыть книгу, закрытие книги, открыть файл Excel, открытие файла Excel, существование книги, обратиться к открытой книге.
А что делать если открываемая книга спрашивает, стоит ли ей обновляться и выполнение кода приостанавливается, пока пользователь не нажмёт кнопку? Как скрывать это сообщение? Пытался писать
или
— не помогает
Если речь идет об обновлении связей между книгами, то попробуйте так:
Лучше
т.к. в других местах обновление, возможно, нужно.
Жаль, спасибо.
Кстати, если вдруг кому-то нужно, изменить название excel в шапке документа (но при сохранении всё равно будет предлагаться «Книга n»), то можно сделать так:
Здравствуйте.
А как поступить, если имя книги заранее неизвестно. Есть-ли в VBA что-нибудь вроде диалогового окна «Открыть книгу».
Или, допустим, поиск всех книг в определённой папке.
Здравствуйте, Вячеслав!
Для выбора книги в определённой папке используйте Стандартный диалог выбора файлов Application.GetOpenFilename.
Добрый!
Из Аутлука открываю эксель файл. Имя его каждый раз — разное. Как закрыть его так, чтобы при этом закрывалось само приложение Эксель? Сохранять изменения не нужно.
Код:
закрывает саму книгу, но при этом сама прога остаётся висеть со своим интерфейсом. Можно нажать Ctlr+O и открыть какой-нибудь xls-файл.
При этом на компе могут быть открыты другие файлы, поэтому команда
не допустима.
Что делать?
Сергей, используйте глобальные переменные, если файл Excel открывается и закрывается разными процедурами (переменные позволят закрыть тот самый файл и тот самый экземпляр приложения, в котором открыт файл):
А как открывать книгу, если имя файла совпадает с названием из массива.
То есть есть массив переменных которые записаны в столбец начиная с столбца А строки 2. Названия всегда разные.но совпадают с названием файла. Можно ли поочередно открыть их для редактирования через VBA
Привет, YAN!
Используйте следующий код для открытия по очереди файлов Excel, имена которых записаны в первый столбец со второй ячейки:
Объявление глобальной переменной
n
размещено в разделе Declarations программного модуля. Число 15 соответствует номеру строки последней ячейки диапазона с именами рабочих книг.имеется 2 книги (обе открытые)
Книга 1 Лист1 ячейка D4 формула ссылается на вторую книгу
='[Книга 2.xls]Лист1′!$F$5
Используя ссылку (без ручного ввода) надо обратиться Книга 2, скопировать 5 строк ниже ссылки (строка6:строка10) и вставить в рабочую книгу(Книга 1)
0mega, а
'[Книга 2.xls]Лист1'!$F$5
— это постоянное значение? И в какое место какого листа Книги 1 строки должны быть вставлены?«… а
'[Книга 2.xls]Лист1'!$F$5
– это постоянное значение? …»Нет !
Сценарий такой.
В бухгалтерии есть такой термин «Инвентаризация»
В связи с пандемией — движение по складу было минимальное. Большинство позиций остались нетронутыми.
Значит нет необходимости «набивать мозоли» на повторном вводе.
Я вижу такое решение
Есть Книга1.
Юзер открывает прошлогодний файл и (напр. в ячейке F5) визуально сравнивает итоговые значения с настоящими.
если показания совпадают — тогда проверяется Лист2, Лист3…потом будет другая книга
Если значение F5 (это тоже не постоянный адрес ) не совпадает с реальным, тогда в Книга1 юзер ставит «=» и кликает на F5 другой книги
В Книге1 автоматически формируется адрес неправильного значения.
Теперь топчем кнопочку макроса.
макрос берет адрес из ссылки и обращается ко второй Книге, копирует нужный мне массив и загружает в Первую книгу.
Юзер лечит (меняет, добавляет, редактирует ) больной массив и отправляет обратно.
Возможно есть какой-то более простой способ, но «самая короткая дорога — это та которую ты знаешь»
Этот код VBA копирует пять строк под указанной ячейкой из открытой книги Excel по адресу из ячейки D4 Листа1 текущей книги и вставляет их в текущую книгу в пять строк под ячейкой D4 Листа1:
Предыдущие варианты кода я удалил, так как этот — самый простой и надежный.
Евгений, спасибо за уделенное время.
Все работает как я заказывал.
Есть маленькая просьба.
Стартовый вопрос имел «упрощенный вид». И чтобы вас не нагружать, я предполагал что смогу самостоятельно «запилить» под себя
Ошибся!
Что надо изменить чтобы макрос копировал не 5 строк, а 3 000 (с 1-ой по 3000-ую) ?
и еще 1 вопрос:
После редактирования надо Range(«A1:AZ3000») из рабочей книги (Книга1) отправить обратно (Книга2 на лист, который был указан в ссылке) ?
Спасибо. Все работает
то что врач прописал
Евгений, что и как надо изменить чтобы учитывалась высота строк и ширина столбцов ?
Копировать высоту строк и ширину столбцов из Книги2 в Книгу1 или наоборот?
Есть книга 2 (донор, образец)
Есть книга 1 (Workbook)
Машина копирует файл у «донора» (вторая) книги и помещает в первую (активную, рабочую) книгу
Надо чтобы в первой книге была точная копия как в доноре
Если все-таки не файл, а диапазон, тогда так:
Здравствуйте!
Подскажите, Запускаю макрос и при сохранении книги появляется диалоговое окно о Замене, Как можно сохранить книгу без вопроса замены с помощью макроса. Чтобы замена происходила, но диалоговое окно не появлялось?
Спасибо Вашему сайту!
Здравствуйте, Роман!
Отключите оповещения перед строками кода, при выполнении которых не должны выводиться диалоговые окна, и не забудьте включить показ сообщений после тех строк:
Все работает, от души Спасибо!
есть 2 книги
Book 1
Sheet1
Cells (n, «D») = 25.07. 21 (дата 25 июля 2021 г)
Надо в Book2 на Sheet1 в столбце «F» найти такую же дату,
— скопировать столбцы «J»; «L» и «N» от даты и до конца таблицы
— вставить в Book1 Sheet1 Range(Cells(n,»F»),Cells(9999,»H»))
На каком этапе возникло затруднение?
сложности в том чтобы в другой книге найти информацию, которая (задается/определяется)в рабочей книге.
Без проблем напишу нужный мне код если это все будет в одной книге.
В качестве плана «Б» предполагается скопировать лист из другой книг и вставить в WorkBook.
потом сделать все что надо и удалить лист-донор.
Но при таком подходе больше половины — это лишняя работа
Евгений, похоже я объяснил недостаточно грамотно …
If myCell = "25.07. 21" Then
Это как раз и есть тот самый камень преткновения .
"25.07. 21"
— это ПЕРЕМЕННОЕ значение , которое каждый раз меняетсяВо второй книге машина должна найти такое же значение как в первой книге, в ячейке (n,»D»)
в формульном исполнении это будет так:
=ПОИСКПОЗ(D14;[Book2.xlsx]Sheet1!$F:$F;0)
во второй книге на первом Листе в столбце «F» ищем значение такое же как в первой книге в ячейке D14
Имя переменной я изменил, так как n в моем примере уже используется.
Сейчас нет возможности проверить.
Отпишусь позже
именно так я и хотел
спасибо
Добрый день! Excel создали, ещё не сохраняли (сохранять будет сам пользователь). Можно изменить название «Книга 1» на своё без сохранения? Это чтобы пользователю не приходилось при сохранении менять имя exel «Книга 1»
Здравствуйте, Мария!
По моему, это невозможно.
Добрый день.
Открываю книгу методом
Workbooks.Open Filename:="D:\test1.xls"
В самой книге несколько листов, макросы и кнопки.
При открытии книга активирует режим конструктора. Не пониманию почему это происходит и как этого избежать?
Из-за этого режима дальше не работает код.
Добрый день, Андрей!
Найдите в модуле книги, которая открывается в режиме конструктора, строку с методом
.ToggleFormsDesign
и закомментируйте ее.Если такой строки нет, попробуйте следующий вариант:
Спасибо за оперативный ответ.
1. Я пробовал этот вариант и другие из этой серии, ничего не помогало.
2. Проверил, что макрос работает и при режиме конструктора, то есть дело не в этом.
2. Разобрался, что если запускать макрос через кнопку, то все работает, а если через горячие клавиши, то макрос только открывает файл и дальше не выполняется. Буду разбираться в этом направлении.
Здравствуйте. как можно открыть файлы на отдельном экземпляре?
Здравствуйте, Akmal!
Сначала надо создать новый экземпляр приложения Excel (в примере он создается сразу при объявлении переменной), открыть книгу и сделать новый экземпляр Excel видимым, так как изначально он будет открыт в фоновом режиме:
спс за ответ Женя.
попробуем вдруг получится.
Обсуждение закрыто.