Открыть книгу Excel vba в скрытом режиме

Обновлено: 21.11.2024

Используйте сценарий Visual Basic для приложений (VBA), чтобы открывать дополнительные книги Excel в качестве источников данных при открытии книги, зависящей от функции ВПР.

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

Вот гораздо лучшее решение: сценарий VBA, который автоматизирует процесс и минимизирует путаницу для пользователя.

Допустим, у нас есть три листа Excel:

  • ExcelSheet1.xlsm
  • ExcelSheet2.xlsx
  • ExcelSheet3.xlsx

ExcelSheet1.xlsm содержит две таблицы. Первая таблица содержит данные, которые извлекают значения с помощью функции ВПР из таблицы в ExcelSheet2.xlsx. Второй извлекает данные из таблицы в ExcelSheet3.xlsx. Следующие скрипты будут автоматически открывать ExcelSheet2.xlsx и ExcelSheet3.xlsx при открытии ExcelSheet1.xlsm, но будут держать их в фоновом режиме, чтобы пользователь не заметил.

Записать полные пути к файлам? Они не нужны, но полезны. Чтобы включить сценарий, просто вставьте код в кодовую страницу ThisWorkbook в дереве «Объекты Microsoft Excel» для ExcelSheet1.xlsm в Visual Basic для приложений. Вы можете добавить или удалить из списка любое количество файлов.

Эта часть касается открытия файлов, но как насчет закрытия? Я хочу, чтобы все файлы закрывались при закрытии ExcelSheet1.xlsm. Для этого я использовал следующий скрипт, который также находится на кодовой странице ThisWorkbook для ExcelSheet1.xlsm. Не используйте полные пути к файлам!

Это позволяет закрывать файлы без создания диалогового окна «Сохранить как…». Поскольку файлы были открыты (но никогда не были видны), пользователь не должен был вносить какие-либо изменения, поэтому закрытие файлов без сохранения является безопасным вариантом.

Результат

Когда пользователь открывает ExcelSheet1.xlsm, сценарий VBA автоматически открывает ExcelSheet2.xlsx и ExcelSheet3.xlsx в фоновом режиме.

Как обычно, появится диалоговое окно «Эта книга содержит ссылки на другие источники данных». Пользователь может нажать «Обновить», и таблицы обновятся корректно.

При закрытии файла ExcelSheet1.xlsm файлы ExcelSheet2.xlsx и ExcelSheet3.xlsx также закрываются без предупреждения.

Не забывайте: вам необходимо использовать формат файла Excel Macro-Enabled Workbook (xlsm) для исходного файла Excel.

Комментарии

2 ответа на вопрос “Открывать и закрывать книги Excel в фоновом режиме”

Спасибо за это. Я пытаюсь сделать так, как написано, но у меня возникают проблемы (полный новичок в VBA).

Код работает при открытии второй таблицы, но мне приходится запускать макрос вручную, это не происходит автоматически при открытии первой таблицы.

Заинтересованы в разработке решений, расширяющих возможности Office на различных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любые технологии веб-программирования, такие как HTML5, JavaScript, CSS3 и XML.

Синтаксис

выражение. Open (FileName, UpdateLinks, ReadOnly, Format, Пароль, WriteResPassword, ИгнорироватьReadOnlyRecommended, Происхождение, Разделитель, Редактируемый< /em>, Уведомить, Конвертер, AddToMru, Локальный, CorruptLoad)< /p>

выражение Переменная, представляющая объект Workbooks.

Параметры

Имя Обязательный/Необязательный Тип данных Описание
Имя файла Необязательно Вариант String. Имя файла книги, которую необходимо открыть.
UpdateLinks Необязательный Вариант Указывает, как внешние ссылки (ссылки) в файле, такие как ссылка на диапазон в книге Budget.xls в следующей формуле =SUM([Budget.xls]Annual!C10:C25) обновляются. Если этот аргумент опущен, пользователю предлагается указать, как будут обновляться ссылки. Дополнительные сведения о значениях, используемых этим параметром, см. в разделе "Примечания".

Возвращаемое значение

Объект Workbook, представляющий открытую книгу.

Примечания

По умолчанию макросы включены при программном открытии файлов. Используйте свойство AutomationSecurity, чтобы установить режим безопасности макросов, используемый при программном открытии файлов.

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

< /th>
Значение Описание
0 Внешние ссылки (ссылки) не будут обновляться при рабочая книга открыта.
3 Внешние ссылки ( ссылки) будут обновляться при открытии книги.

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

< /th> < tr> < td style="text-align: left;">Ничего
Значение Разделитель
1 Вкладки
2 Запятые
3 Пробелы
4 Точка с запятой
5
6 Пользовательский символ (см. аргумент Delimiter)

Пример

В следующем примере кода открывается книга Analysis.xls, а затем выполняется ее макрос Auto_Open.

В следующем примере кода лист из другой книги импортируется на новый лист в текущей книге. Лист1 в текущей книге должен содержать путь к книге для импорта в ячейке D3, имя файла в ячейке D4 и имя листа в ячейке D5. Импортированный рабочий лист вставляется после Sheet1 в текущую книгу.

Поддержка и обратная связь

Есть вопросы или отзывы об Office VBA или этой документации? См. раздел Поддержка и отзывы об Office VBA, чтобы узнать, как получить поддержку и оставить отзыв.

У меня есть основная рабочая книга, которую люди будут открывать для
взаимодействия. Всякий раз, когда открывается эта основная книга, я хотел бы, чтобы она открывала другую
книгу "данных" в ФОНЕ, чтобы я мог копировать данные туда и обратно между ними,
используя различные сценарии. Я не хочу, чтобы внешний пользователь мог
видеть лист данных или (в идеале) даже знать, что он был открыт в
фоновом режиме.

В коде "ThisWorkbook" в основной рабочей книге внешнего интерфейса у меня есть:

Затемнить objApp как Excel.Application
Private Sub Workbook_Open()
Set objApp = CreateObject("Excel.Application")
objApp.Workbooks.Open ("X:\pathto\Data .xls")
objApp.Visible = False
End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)
Dim DataSheet As Worksheet
Set DataSheet = objApp.Workbooks("Data.xls").Sheets(1)
[. ]
Конец подписки

Итак, с кодом, который я показал выше, я обычно получаю ошибку "Object
Expected" в моей строке Set Datasheet, из-за чего я думаю, что он
не распознает мою общедоступную переменную objApp. который я объявил в коде для
ThisWorkbook. Должен ли я объявлять это по-другому?

Если я просто удалю "objApp." префикс в этой строке, конечно, он говорит, что
индекс вне допустимого диапазона. Если я использую обычный Worksheets.Open (вместо
создания нового объекта приложения), он выводит книгу Data.xls
на передний план, и я не могу понять, как ее скрыть. Я хочу, чтобы открытие
книги данных было незаметным и скрытым, если это вообще возможно.

Мы будем очень признательны за любую помощь. Спасибо,

Включение вашего кода в:

Application.Screenupdating = False
[code]
Application.Screenupdating = True

Это предотвратит обновление экрана, и пользователь не увидит, что
происходит. Это тоже ускоряет процесс.
Запретите использование активации или выбора в коде, чтобы запустить его быстрее и
эффективнее

Рабочие книги("A"). Активировать
Листы(1).Выбрать
Диапазон("A1").Выбрать
Выделение.Копировать

Рабочие книги("B"). Активировать
Листы(1).Выбрать
Диапазон("A1").Выбрать
Выделение.Вставить

Используйте что-то вроде:
Workbooks("B").Sheets(1).Range("A1") =
Workbooks("A").Sheets(1).Range("A1 ")
Вы также можете добавить .Value, .Formula или .

Чем есть конструкции с использованием:
With

Но с отключенным обновлением экрана вы можете делать все, что хотите, при условии,
если вы выберете свою основную книгу в конце, и пользователь
не увидит, что происходит.

"g-boy" написал в сообщении
news:0FBF0965-30D7-4F12-903E-2931A4F2894A@microsoft.com.
>У меня есть основная рабочая книга, которую люди будут открывать для
> взаимодействия. Всякий раз, когда открывается эта основная рабочая книга, я хотел бы, чтобы она открывала другую
> рабочую книгу "data" в BACKGROUND, чтобы я мог копировать данные туда и обратно
> между
> ими, используя различные сценарии. Я не хочу, чтобы клиентский пользователь мог
> видеть лист данных или (в идеале) даже знать, что он был открыт
> в фоновом режиме.
>
> В коде для «ThisWorkbook» в основной рабочей книге внешнего интерфейса у меня есть:
>
> Dim objApp As Excel.Application
> Private Sub Workbook_Open()
> Set objApp = CreateObject("Excel.Application")
> objApp.Workbooks.Open ("X:\pathto\Data.xls")
> objApp.Visible = False
> End Sub
>
> В коде для основного рабочего листа в основной внешней рабочей книге у меня есть:
>
> Private Sub Worksheet_Change(ByVal Target As Range)
> Dim DataSheet As Worksheet
> Set DataSheet = objApp.Workbooks("Data.xls").Sheets(1)
> [. ]
> End Sub
>
> Итак, с кодом, показанным выше, я обычно получаю ошибку «Object
> Expected» в строке Set Datasheet, которая заставляет меня думать, что это не
> распознавание моей общедоступной переменной objApp, которую я объявил в коде для
> ThisWorkbook. Должен ли я объявлять это по-другому?
>
> Если я просто удалю "objApp." префикс в этой строке, конечно, он говорит, что нижний индекс
> вне допустимого диапазона. Если я использую обычный Worksheets.Open (вместо
> создания нового объекта приложения), он выводит книгу Data.xls на
> передний план, и я не могу понять, как ее скрыть. Я хочу, чтобы открытие
> книги данных было незаметным и скрытым, если это вообще
> возможно.
>
> Мы будем очень признательны за любую помощь. Спасибо,
>
> ---G

Dim во многом похож на Private. Если вы хотите, чтобы переменная распознавалась
другим модулем, используйте Public:
Public objApp As Excel.Application

HTH,
--
Джордж Николсон

Удалить "Спам" из обратного адреса.


"g-boy" написал в сообщении
news: 0FBF0965-30D7-4F12-903E-2931A4F2894A@microsoft.com.
>У меня есть основная рабочая книга, которую люди будут открывать для
> взаимодействия. Всякий раз, когда открывается эта основная рабочая книга, я хотел бы, чтобы она открывала другую
> рабочую книгу "data" в BACKGROUND, чтобы я мог копировать данные туда и обратно
> между
> ими, используя различные сценарии. Я не хочу, чтобы клиентский пользователь мог
> видеть лист данных или (в идеале) даже знать, что он был открыт
> в фоновом режиме.
>
> В коде для «ThisWorkbook» в основной рабочей книге внешнего интерфейса у меня есть:
>
> Dim objApp As Excel.Application
> Private Sub Workbook_Open()
> Set objApp = CreateObject("Excel.Application")
> objApp.Workbooks.Open ("X:\pathto\Data.xls")
> objApp.Visible = False
> End Sub
>
> В коде для основного рабочего листа в основной внешней рабочей книге у меня есть:
>
> Private Sub Worksheet_Change(ByVal Target As Range)
> Dim DataSheet As Worksheet
> Set DataSheet = objApp.Workbooks("Data.xls").Sheets(1)
> [. ]
> End Sub
>
> Итак, с кодом, показанным выше, я обычно получаю ошибку «Object
> Expected» в строке Set Datasheet, которая заставляет меня думать, что это не
> распознавание моей общедоступной переменной objApp, которую я объявил в коде для
> ThisWorkbook. Должен ли я объявлять это по-другому?
>
> Если я просто удалю "objApp." префикс в этой строке, конечно, он говорит, что нижний индекс
> вне допустимого диапазона. Если я использую обычный Worksheets.Open (вместо
> создания нового объекта приложения), он выводит книгу Data.xls на
> передний план, и я не могу понять, как ее скрыть. Я хочу, чтобы открытие
> книги данных было незаметным и скрытым, если это вообще
> возможно.
>
> Мы будем очень признательны за любую помощь. Спасибо,
>
> ---G

"STEVE BELL" написал:
> Заключите свой код в:
>
> Application.Screenupdating = False
> [code]
> Application.Screenupdating = True
>
> Это предотвратит обновление экрана, и пользователь не увидит, что
> происходит. Это также ускоряет процесс.

Вау. это интересно, и я не знал об этом. Так что спасибо за
совет.

Однако в этом конкретном случае я хотел бы (если это возможно) иметь возможность
ОСТАВЛЯТЬ книгу открытой в фоновом режиме, чтобы я мог ссылаться на нее "по запросу",
как это было с скрипты, но хотелось бы, чтобы он был невидимым.

Обновление экрана для этого не годится, потому что я хотел бы, чтобы пользователь
мог делать что-то и взаимодействовать с внешней рабочей книгой, в то время как
книга данных открыта ( но скрыто).

Похоже, вы объявили objApp как модульную переменную в модуле
ThisWorkbook, которая не будет видна где-либо еще в вашем проекте,
например, в модулях вашего листа. В обычном модуле попробуйте -
Public objApp As Excel.Application

Чтобы упростить задачу, почему бы не сохранить файл данных как скрытую книгу и
открыть ее обычным способом в том же экземпляре, что и основную книгу. Хотя,
конечно, пользователь может увидеть его в окне > Показать.

С уважением,
Питер Т

"g-boy" написал в сообщении
news:0FBF0965-30D7-4F12-903E-2931A4F2894A@microsoft.com.
> У меня есть основная рабочая книга, которую люди будут открывать для
> взаимодействия. Всякий раз, когда открывается эта основная рабочая книга, я хотел бы, чтобы она открывала другую
> рабочую книгу "data" в BACKGROUND, чтобы я мог копировать данные туда и обратно
между ними,
> используя различные сценарии. Я не хочу, чтобы клиентский пользователь мог
> видеть лист данных или (в идеале) даже знать, что он был открыт
> в фоновом режиме.
>
> В коде для «ThisWorkbook» в основной рабочей книге внешнего интерфейса у меня есть:
>
> Dim objApp As Excel.Application
> Private Sub Workbook_Open()
> Set objApp = CreateObject("Excel.Application")
> objApp.Workbooks.Open ("X:\pathto\Data.xls")
> objApp.Visible = False
> End Sub
>
> В коде для основного рабочего листа в основной внешней рабочей книге у меня есть:
>
> Private Sub Worksheet_Change(ByVal Target As Range)
> Dim DataSheet As Worksheet
> Set DataSheet = objApp.Workbooks("Data.xls").Sheets(1)
> [. ]
> End Sub
>
> Итак, с кодом, показанным выше, я обычно получаю ошибку «Object
> Expected» в строке Set Datasheet, которая заставляет меня думать, что это не
> распознавание моей общедоступной переменной objApp, которую я объявил в коде для
> ThisWorkbook. Должен ли я объявлять это по-другому?
>
> Если я просто удалю "objApp." префикс в этой строке, конечно, он говорит, что нижний индекс
> вне допустимого диапазона. Если я использую обычный Worksheets.Open (вместо
> создания нового объекта приложения), он выводит книгу Data.xls на
> передний план, и я не могу понять, как ее скрыть. Я хочу, чтобы открытие
> рабочей книги данных было незаметным и скрытым, если это вообще
возможно.
>
> Мы будем очень признательны за любую помощь. Спасибо,
>
> ---G

«Джордж Николсон» написал:
> Дим действует так же, как рядовой. Если вы хотите, чтобы переменная распознавалась
> другим модулем, используйте Public:
> Public objApp As Excel.Application

Спасибо. Я этого не знал. Я полагал, что "dim" является общим, а "Public"
и "Private" — в качестве особых случаев.

Однако, к сожалению, *просто* изменение строки объявления на

Общее приложение objApp как Excel.Application

в объявлении ThisWorkbook проблема не устранена. Я все еще получаю ошибку
"Требуется объект" в строке:

Set DataSheet = objApp.Workbooks("Data.xls").Sheets(1)

в коде листа.

Может ли это быть связано с тем, что в коде рабочей книги объявлена ​​одна из них, а
подпрограмма, использующая эту переменную, находится в коде рабочего листа? Мне
нужно что-то сделать, чтобы явно объявить вещь как "глобальную" или что-то в этом роде?

Еще одна вещь, о которой следует помнить:
В вашем коде вы можете скрывать и показывать любую книгу. Таким образом, вы можете отобразить
книгу и работать с ней, а затем снова скрыть ее, когда закончите. Таким образом,
пользователь никогда не увидит его и не получит к нему доступ. И вы можете использовать
xlVeryHidden, чтобы убедиться, что пользователь не сможет его найти.

--
rand451
"g-boy" написал в сообщении
news:676B9DD2-2A83-4332-967B-4B329ADED65E@microsoft.com.
> "Джордж Николсон" писал:
>> Дим действует так же, как рядовой. Если вы хотите, чтобы переменная распознавалась
>> другим модулем, используйте Public:
>> Public objApp As Excel.Application
>
> Спасибо. Я этого не знал. Я полагал, что слово "dim" является общим, а
> "Public"
> и "Private" используются в качестве особых случаев.
>
> Однако, к сожалению, *просто* изменение строки объявления на
>
> Public objApp As Excel.Application
>
> в ThisWorkbook декларация не устранила проблему. Я по-прежнему получаю сообщение об ошибке
> "Требуется объект" в строке:
>
> Set DataSheet = objApp.Workbooks("Data.xls").Sheets(1)
>
> в коде рабочего листа.
>
> Может ли это быть связано с тем, что в коде рабочей книги объявлена ​​одна из них, а
> подпрограмма, использующая эту переменную, находится в коде рабочего листа?
> Нужно ли мне
> что-то делать, чтобы явно объявить вещь как "глобальную" или
> что-то еще?
>

Информация о теме

Пользователи, просматривающие эту тему

В настоящее время эту тему просматривают 1 пользователь. (0 участников и 1 гость)

VBA позволяет открывать и закрывать файлы стандартными методами .Open и .Close.

Если вы хотите узнать, как проверить, существует ли файл, прежде чем пытаться его открыть, вы можете нажать на эту ссылку: Файл VBA существует

Открыть книгу в VBA

Открыть книгу из пути

Если вы знаете, какой файл вы хотите открыть, вы можете указать его полный путь в функции. Вот код:

Эта строка кода открывает файл «Sample file 1» из «папки VBA».

Открыть книгу — ActiveWorkbook

Когда вы открываете книгу, она автоматически становится ActiveWorkbook. Вы можете ссылаться на недавно открытую книгу следующим образом:

Когда вы ссылаетесь на лист или диапазон и опускаете имя книги, VBA предполагает, что вы имеете в виду ActiveWorkbook:

Открыть книгу и назначить переменную

Вы также можете открыть книгу и назначить ее непосредственно переменной объекта. Эта процедура откроет книгу в переменной wb, а затем сохранит книгу.

Назначение книг переменным при их открытии — лучший способ отслеживать ваши книги

Диалоговое окно открытия файла книги

Вы также можете вызвать диалоговое окно открытия файла рабочей книги. Это позволяет пользователю перейти к файлу и открыть его:

Как видно на изображении 1, при таком подходе пользователи могут выбирать, какой файл открывать. Диалоговое окно «Открыть файл» может быть сильно настроено. Вы можете по умолчанию выбрать определенную папку, выбрать, какие типы файлов будут видны (например, только .xlsx) и многое другое. Прочтите наш учебник по диалоговому окну «Открыть файл», где приведены подробные примеры.

Открыть новую книгу

Эта строка кода откроет новую книгу:

Программирование VBA стало проще

Прекратите искать код VBA в Интернете. Узнайте больше об AutoMacro — конструкторе кода VBA, который позволяет новичкам создавать процедуры с нуля с минимальными знаниями в области кодирования и множеством функций, позволяющих сэкономить время для всех пользователей!

Открыть новую книгу для переменной

Эта процедура откроет новую книгу, назначив ее переменной wb:

Синтаксис открытой книги

При использовании Workbooks.Open вы можете заметить, что при открытии книги доступно множество параметров:

Требуется имя файла. Все остальные аргументы являются необязательными, и вам, вероятно, не потребуется знать большинство других аргументов. Вот два самых распространенных:

Открыть книгу только для чтения

Когда книга открыта только для чтения, вы не можете сохранить исходный файл. Это предотвращает редактирование файла пользователем.

Открыть книгу, защищенную паролем

Книга может быть защищена паролем. Используйте этот код, чтобы открыть книгу, защищенную паролем:

Примечания по синтаксису Open Workbook

Обратите внимание, что на изображении выше мы включили скобки «(», чтобы показать синтаксис. Если вы используете скобки при работе с Workbooks.Open, вы должны назначить книгу переменной:

Закрыть книгу в VBA

Закрыть определенную книгу

Как и при открытии книги, файл можно закрыть несколькими способами. Если вы знаете, какой файл вы хотите закрыть, вы можете использовать следующий код:

Эта строка кода закрывает файл «Пример файла 1», если он был открыт. В противном случае будет возвращена ошибка, поэтому вам следует позаботиться об ее обработке.

Закрыть активную книгу

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

Закрыть все открытые книги

Чтобы закрыть все открытые рабочие книги, вы можете просто использовать этот код:

Закрыть первую открытую книгу

Это закроет первую открытую/созданную книгу:

Замените 1 на 2, чтобы закрыть вторую открытую/созданную книгу и т. д.

Закрыть без сохранения

Это закроет книгу без сохранения и без отображения запроса на сохранение:

Сохранить и закрыть без запроса

Аналогично это сохранит и закроет книгу без отображения запроса на сохранение:

Примечание. Существует несколько других способов указать, следует ли сохранять книгу или нет, а также показывать или нет подсказки. Более подробно это обсуждается здесь.

Другие примеры открытия книги

Открыть несколько новых книг

Эта процедура откроет несколько новых книг, назначив новые книги массиву:

Открыть все книги Excel в папке

Эта процедура откроет все книги Excel в папке с помощью диалогового окна открытия файла.

Проверить, открыта ли рабочая книга

Событие Workbook_Open

События VBA — это «триггеры», которые сообщают VBA о выполнении определенного кода. Вы можете настроить события книги для открытия, закрытия, перед сохранением, после сохранения и т. д.

Прочитайте наше руководство Workbook_Open Event, чтобы узнать больше об автоматическом запуске макросов при открытии книги.

Открытие файлов других типов в VBA

Вы можете использовать VBA для открытия файлов других типов с помощью VBA, например файлов txt или Word.

Открыть текстовый файл и прочитать его содержимое

Метод open VBA позволяет вам читать или писать в файл после того, как вы его открыли. Чтобы прочитать содержимое файла, мы можем открыть файл для ВВОДА.

Приведенный выше код открывает текстовый файл «test.txt», а затем считывает все содержимое файла в переменную strBody. После того, как вы извлекли данные файла в переменную strBody, вы можете использовать их по своему усмотрению. Использование приведенной выше команды Debug.Print позволяет нам увидеть содержимое переменной strBody в окне Immediate в VBE.

Открыть текстовый файл и добавить к нему добавление

Мы также можем открыть текстовый файл в VBA, а затем добавить его в конец файла с помощью метода Append.

Читайте также: