VBA Excel. Рабочая книга (открыть, создать новую, закрыть)

Открытие книги Excel из кода VBA. Создание новой книги, присвоение ей имени. Обращение к открытой книге и закрытие. Методы Open, Add и Close объекта Workbooks.

Открытие существующей книги

Существующая книга открывается из кода VBA Excel с помощью метода Open:

или

В кавычках указывается полный путь к открываемому файлу Excel. Если такой файл не существует, произойдет ошибка.
Проверить существование файла можно с помощью функции Dir:

Или, если файл существует, можно сразу его открыть:

Создание новой книги

Новая рабочая книга Excel создается в VBA с помощью метода Add:

Созданную книгу, если она не будет использоваться как временная, лучше сразу сохранить:

В кавычках указывается полный путь сохраняемого файла Excel, включая присваиваемое имя, в примере – это «test2.xls».

Обращение к открытой книге

Обращение к активной книге:

Обращение к книге с выполняемым кодом:

Обращение к книге по имени:

Обратиться по имени можно только к уже открытой книге, а чтобы из кода VBA Excel книгу открыть, необходимо указать полный путь к файлу.

Как закрыть книгу Excel из кода VBA

Открытая рабочая книга закрывается из кода VBA Excel с помощью метода Close:

Если закрываемая книга редактировалась, а внесенные изменения не были сохранены, тогда при ее закрытии Excel отобразит диалоговое окно с вопросом: Вы хотите сохранить изменения в файле test1.xlsx? Чтобы файл был закрыт без сохранения изменений и вывода диалогового окна, можно воспользоваться параметром метода Close – SaveChanges:

или

Закрыть книгу Excel из кода VBA с сохранением внесенных изменений можно также с помощью параметра SaveChanges:

или


Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

30 комментариев для “VBA Excel. Рабочая книга (открыть, создать новую, закрыть)”

  1. А что делать если открываемая книга
    спрашивает, стоит ли ей обновляться
    и выполнение кода приостанавливается,
    пока пользователь не нажмёт кнопку?
    Как скрывать это сообщение?
    пытался писать

    или

    – не помогает

    1. Евгений (автор статьи)

      Если речь идет об обновлении связей между книгами, то попробуйте так:

  2. Вячеслав

    Здравствуйте.
    А как поступить, если имя книги заранее неизвестно. Есть-ли в VBA что-нибудь вроде диалогового окна “Открыть книгу”.
    Или, допустим, поиск всех книг в определённой папке.

  3. Добрый!
    Из Аутлука открываю эксель файл. Имя его каждый раз – разное. Как закрыть его так, чтобы при этом закрывалось само приложение Эксель? Сохранять изменения не нужно.
    Код:

    закрывает саму книгу, но при этом сама прога остаётся висеть со своим интерфейсом. Можно нажать Ctlr+O и открыть какой-нибудь xls-файл.
    При этом на компе могут быть открыты другие файлы, поэтому команда

    не допустима.
    Что делать?

    1. Евгений

      Сергей, используйте глобальные переменные, если файл Excel открывается и закрывается разными процедурами (переменные позволят закрыть тот самый файл и тот самый экземпляр приложения, в котором открыт файл):

  4. А как открывать книгу, если имя файла совпадает с названием из массива.
    То есть есть массив переменных которые записаны в столбец начиная с столбца А строки 2. Названия всегда разные.но совпадают с названием файла. Можно ли поочередно открыть их для редактирования через VBA

    1. Евгений

      Привет, YAN!
      Используйте следующий код для открытия по очереди файлов Excel, имена которых записаны в первый столбец со второй ячейки:

      Объявление глобальной переменной n размещено в разделе Declarations программного модуля. Число 15 соответствует номеру строки последней ячейки диапазона с именами рабочих книг.

  5. имеется 2 книги (обе открытые)

    Книга 1 Лист1 ячейка D4 формула ссылается на вторую книгу
    ='[Книга 2.xls]Лист1′!$F$5

    Используя ссылку (без ручного ввода) надо обратиться Книга 2, скопировать 5 строк ниже ссылки (строка6:строка10) и вставить в рабочую книгу(Книга 1)

    1. Евгений

      0mega, а '[Книга 2.xls]Лист1'!$F$5 – это постоянное значение? И в какое место какого листа Книги 1 строки должны быть вставлены?

      1. “… а '[Книга 2.xls]Лист1'!$F$5 – это постоянное значение? …”
        Нет !
        Сценарий такой.
        В бухгалтерии есть такой термин “Инвентаризация”
        В связи с пандемией – движение по складу было минимальное. Большинство позиций остались нетронутыми.
        Значит нет необходимости “набивать мозоли” на повторном вводе.
        Я вижу такое решение
        Есть Книга1.
        Юзер открывает прошлогодний файл и (напр. в ячейке F5) визуально сравнивает итоговые значения с настоящими.
        если показания совпадают – тогда проверяется Лист2, Лист3…потом будет другая книга
        Если значение F5 (это тоже не постоянный адрес ) не совпадает с реальным, тогда в Книга1 юзер ставит “=” и кликает на F5 другой книги
        В Книге1 автоматически формируется адрес неправильного значения.
        Теперь топчем кнопочку макроса.
        макрос берет адрес из ссылки и обращается ко второй Книге, копирует нужный мне массив и загружает в Первую книгу.
        Юзер лечит (меняет, добавляет, редактирует ) больной массив и отправляет обратно.
        Возможно есть какой-то более простой способ, но “самая короткая дорога – это та которую ты знаешь”

        1. Евгений

          Этот код VBA копирует пять строк под указанной ячейкой из открытой книги Excel по адресу из ячейки D4 Листа1 текущей книги и вставляет их в текущую книгу в пять строк под ячейкой D4 Листа1:

          Предыдущие варианты кода я удалил, так как этот – самый простой и надежный.

          1. Евгений, спасибо за уделенное время.
            Все работает как я заказывал.
            Есть маленькая просьба.
            Стартовый вопрос имел “упрощенный вид”. И чтобы вас не нагружать, я предполагал что смогу самостоятельно “запилить” под себя
            Ошибся!
            Что надо изменить чтобы макрос копировал не 5 строк, а 3 000 (с 1-ой по 3000-ую) ?

            и еще 1 вопрос:
            После редактирования надо Range(“A1:AZ3000”) из рабочей книги (Книга1) отправить обратно (Книга2 на лист, который был указан в ссылке) ?

        2. Евгений

  6. Евгений, что и как надо изменить чтобы учитывалась высота строк и ширина столбцов ?

    1. Евгений

      Копировать высоту строк и ширину столбцов из Книги2 в Книгу1 или наоборот?

      1. Есть книга 2 (донор, образец)
        Есть книга 1 (Workbook)

        Машина копирует файл у “донора” (вторая) книги и помещает в первую (активную, рабочую) книгу
        Надо чтобы в первой книге была точная копия как в доноре

        1. Евгений

          Если все-таки не файл, а диапазон, тогда так:

  7. Здравствуйте!
    Подскажите, Запускаю макрос и при сохранении книги появляется диалоговое окно о Замене, Как можно сохранить книгу без вопроса замены с помощью макроса. Чтобы замена происходила, но диалоговое окно не появлялось?
    Спасибо Вашему сайту!

    1. Евгений

      Здравствуйте, Роман!
      Отключите оповещения перед строками кода, при выполнении которых не должны выводиться диалоговые окна, и не забудьте включить показ сообщений после тех строк:

  8. есть 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”))

  9. сложности в том чтобы в другой книге найти информацию, которая (задается/определяется)в рабочей книге.
    Без проблем напишу нужный мне код если это все будет в одной книге.
    В качестве плана “Б” предполагается скопировать лист из другой книг и вставить в WorkBook.
    потом сделать все что надо и удалить лист-донор.
    Но при таком подходе больше половины – это лишняя работа

    1. Евгений

  10. Евгений, похоже я объяснил недостаточно грамотно …
    If myCell = “25.07. 21” Then
    Это как раз и есть тот самый камень преткновения .
    “25.07. 21″ – это ПЕРЕМЕННОЕ значение , которое каждый раз меняется
    Во второй книге машина должна найти такое же значение как в первой книге, в ячейке (n,”D”)
    в формульном исполнении это будет так:
    =ПОИСКПОЗ(D14;[Book2.xlsx]Sheet1!$F:$F;0)
    во второй книге на первом Листе в столбце “F” ищем значение такое же как в первой книге в ячейке D14

    1. Евгений

      Имя переменной я изменил, так как n в моем примере уже используется.

Добавить комментарий

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.