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. Евгений

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

            1. Евгений

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

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

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

                1. Евгений

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

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

                1. Евгений

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

                2. есть 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»))

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

                  1. Евгений

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

                  1. Евгений

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

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

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