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

    Открытие книги Excel из кода VBA. Проверка существования книги. Создание новой книги, обращение к открытой книге и ее закрытие. Методы Open, Add и Close.

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

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

    или

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

    Проверка существования файла

    Проверить существование файла можно с помощью функции Dir. Проверка существования книги Excel:

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

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

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

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

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

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

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

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

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

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

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

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

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

    или

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

    или


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

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

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

      или

      — не помогает

      1. Евгений

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

        1. Сбитый Лётчик Небосводов

          Лучше

          т.к. в других местах обновление, возможно, нужно.

          1. Жаль, спасибо.
            Кстати, если вдруг кому-то нужно, изменить название excel в шапке документа (но при сохранении всё равно будет предлагаться «Книга n»), то можно сделать так:

    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 в моем примере уже используется.

    11. Добрый день! Excel создали, ещё не сохраняли (сохранять будет сам пользователь). Можно изменить название «Книга 1» на своё без сохранения? Это чтобы пользователю не приходилось при сохранении менять имя exel «Книга 1»

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

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