Vba excel данные не открывая

3 / 3 / 0

Регистрация: 20.07.2012

Сообщений: 27

1

23.07.2012, 09:48. Показов 17250. Ответов 5


Студворк — интернет-сервис помощи студентам

как в приложении VBA открыть для записи и чтения файл Excel, чтобы окно с этим файлом не появлялось на экране?



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

23.07.2012, 10:04

2

Лучший ответ Сообщение было отмечено как решение

Решение

Или

Visual Basic
1
2
Set wb = Workbooks.Open("d:Книга1.xls")
wb.Windows(1).Visible = False

или

Visual Basic
1
Set wb = GetObject("d:Книга1.xls")

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

Visual Basic
1
2
wb.Windows(1).Visible = True
wb.Close True

Чтобы не было мелькания на экране, используйте

Visual Basic
1
2
3
Application.ScreenUpdating = False
'отображение окна
Application.ScreenUpdating = True



4



3 / 3 / 0

Регистрация: 20.07.2012

Сообщений: 27

23.07.2012, 12:08

 [ТС]

3

Спасибо. Но это не то, что я имел в виду.

Поясню: если в книге Book1 в ячейку листа вставить формулу, ссылающуюся на ячейку в другой книге Book2, то при пересчете значения этой формулы книга Book2 (закрытая на момент пересчета) не открывается. Пересчет происходит практически мгновенно, в то время как открытие новой книги занимает ощутимое время (около 2 секунд). Из чего я делаю вывод, что Excel дотягивается до данных в закрытой книге Book2, не просто скрывая открытое окно, а просто считывая данные из файла, как это происходит, например в C++ или Java, где при открытии файлов для чтения, окна с файлами не открываются.

Скажите, верны ли такие рассуждения.



0



2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

23.07.2012, 13:37

4

Цитата
Сообщение от bodeaux
Посмотреть сообщение

Скажите, верны ли такие рассуждения.

По большому счету все верно, хотя мне неизвестны все технические особенности считывания внешними ссылками из отдельного файла Excel. Внешние ссылки для данной ситуации заменить вреде нечем, разве что можно макросом динамически сгенерировать нужные формулы, вычислить значения формул и разорвать внешний связи. Из альтернатив — чтение таблиц SQL-запросами на ADO через подходящий драйвер баз данных Excel. Там я не помню, будут ли отображаться листы или нет.



1



2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

24.07.2012, 10:00

6

Цитата
Сообщение от Dragokas
Посмотреть сообщение

Но видя это Create Excel Workbook (BIFF8) without having Excel Installed думается, что возможно все.

Спасибо за ссылку. Круто навороченная гора кода! Интересные возможности. Сейчас нет возможности посмотреть это в действии, нужен VB6.



0



Как получить данные из закрытой книги?

Достаточно часто появляется вопрос: как извлечь данные из закрытой книги Excel через VBA? Звучит может быть странновато, но это так: вопрос регулярно поднимается на форумах. Собственно, именно в связи с этим и появилась на свет данная статья. В принципе ничего сложного в задаче нет. При этом получить данные можно разными способами, в том числе при помощи функций пользователя(UDF).
Хотя если вдаваться в технические подробности, то получить данные из закрытой книги вообще нельзя. Так или иначе, на уровне системы файл все равно открывается, различие лишь в том как именно и к чему при этом предоставляется доступ. Поэтому переозвучим классическую постановку задачи в более распространенную в жизни: «Как получить данные из книги, не открывая её так, чтобы об этом узнал пользователь»

Попробуем разобраться с некоторыми методами, их плюсами и минусами:

Получение данных из закрытой книги при помощи процедуры VBA

Sub Get_Value_From_Close_Book_Formula() Dim sPath As String, sFile As String, sShName As String sPath = «C:Documents and Settings» ‘» sFile = «Книга1.xls» ‘» sShName = «Лист1″ ‘» Application.DisplayAlerts = 0 With Range(«A1:A100») .Formula = «=’» & sPath & «[» & sFile & «]» & sShName & «‘!» & «A1″ ‘» ‘»A1″ — указывается начальная ячейка диапазона, из которого необходимо получить значения .Value = .Value End With Application.DisplayAlerts = 1 End Sub

Данный код работает достаточно медленно, но с его помощью можно «вытащить» из закрытой книги значения сразу нескольких ячеек. Код ниже работает быстрее, но с его помощью можно извлечь значения лишь одной ячейки:

Sub Get_Value_From_Close_Book_Excel4Macro() Dim sPath As String, sFile As String, sShName As String Dim sAddress As String, vData sPath = «C:Documents and Settings» ‘» sFile = «Книга1.xls» ‘» sShName = «Лист1″ ‘» sAddress = «‘» & sPath & «[» & sFile & «]» & sShName & «‘!» & Range(«A1″).Address(ReferenceStyle:=xlR1C1) ‘» vData = ExecuteExcel4Macro(sAddress) End Sub

Если честно, сам я не очень-то люблю ни один из данных методов, т.к. они совершенно лишены гибкости. С их помощью можно получить исключительно значения ячеек. Форматы, формулы или другие свойства ячеек получить уже не получится. Поэтому я предпочитаю открывать книгу и копировать то, что мне надо. Делаю это, скрывая от пользователя при помощи свойства ScreenUpdating объекта Application.

Sub Get_Value_From_Close_Book() Dim sShName As String, sAddress As String, vData Dim objCloseBook As Workbook ‘Отключаем обновление экрана Application.ScreenUpdating = False Set objCloseBook = Workbooks.Open(«C:Documents and SettingsКнига1.xls») sAddress = «A1:C100» ‘или одна ячейка — «A1» ‘получаем значение vData = Sheets(«Лист1»).Range(sAddress).Value ‘Записываем данные на активный лист книги, ‘с которой запустили макрос If IsArray(vData) Then [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData Else [A1] = vData End If ‘если надо копировать ячейки с форматами, ‘то можно использовать стандартные методы копирования вставки ‘objCloseBook.Sheets(«Лист1»).Range(sAddress).Copy ‘[A1].PasteSpecial xlPasteValues ‘вставляем значения ‘[A1].PasteSpecial xlPasteFormats ‘вставляем форматы ‘закрываем книгу(из которой получали значения) без сохранения objCloseBook.Close False ‘Включаем обновление экрана Application.ScreenUpdating = True End Sub

Есть и более экзотический метод — при помощи GetObject:

Sub Get_Value_From_Close_Book2() Dim sShName As String, sAddress As String, vData Dim objCloseBook As Object ‘Отключаем обновление экрана Application.ScreenUpdating = False Set objCloseBook = GetObject(«C:Documents and SettingsКнига1.xls») sAddress = «A1:C100» ‘или одна ячейка — «A1» ‘получаем значение vData = objCloseBook.Sheets(«Лист1»).Range(sAddress).Value ‘Записываем данные на активный лист книги, ‘с которой запустили макрос If IsArray(vData) Then [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData Else [A1] = vData End If ‘если надо копировать ячейки с форматами, ‘то можно использовать стандартные методы копирования вставки ‘objCloseBook.Sheets(«Лист1»).Range(sAddress).Copy ‘[A1].PasteSpecial xlPasteValues ‘вставляем значения ‘[A1].PasteSpecial xlPasteFormats ‘вставляем форматы ‘закрываем книгу(из которой получали значения) без сохранения objCloseBook.Close False ‘Включаем обновление экрана Application.ScreenUpdating = True End Sub

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

Получение данных из закрытой книги при помощи UDF
Тот же код, что уже был рассмотрен выше, но оформленный в виде UDF(функции пользователя):

Function Get_Value_From_Close_Book(sWb As String, sShName As String, sAddress As String) Dim vData, objCloseBook As Object Set objCloseBook = GetObject(sWb) ‘получаем значение vData = objCloseBook.Sheets(sShName).Range(sAddress).Value objCloseBook.Close False Set objCloseBook = Nothing ‘Возвращаем данные в ячейку с функцией Get_Value_From_Close_Book = vData End Function

Синтаксис функции (вызов с листа):
=Get_Value_From_Close_Book(«C:Книга1.xls»;»Лист1″;»B1″)
sWb — полный путь до книги, данные из которой необходимо извлечь ( «C:Книга1.xls» )
sShName — имя листа в указанной книге, данные из которого необходимо извлечь ( «Лист1» )
sAddress — адрес ячейки(диапазона) данные которой необходимо получить ( «B1» )

Чтобы получить массив ячеек(например B1:B10), необходимо выделить необходимое количество ячеек и ввести в них эту функцию, как формулу массива.
Думаю, не надо пояснять, что любой аргумент может быть задан не статичным текстом, а ссылкой на ячейку с этим текстом. Именно в этом и преимущество использования именно функций, а не процедур.

ПОЛУЧЕНИЕ ДАННЫХ ПРИ ПОМОЩИ ЗАПРОСА ADO
Так же есть еще один достаточно экзотический метод получения данных из действительно закрытой книги — через ADO(ActiveX Data Objects). По сути это получение данных через запрос SQL, используя для этого технологию ADO.

‘————————————————————————————— ‘ Procedure : Extract_Value_ADO ‘ DateTime : 02.07.2014 16:47 ‘ Author : The_Prist(Щербаков Дмитрий) ‘ http://www.excel-vba.ru ‘ Purpose : Функция получения данных из закрытой книги при помощи ADO ‘ в таком виде не может быть использована вызовом с листа ‘————————————————————————————— Function Extract_Value_ADO(sPath As String, sFileName As String, sShName As String, sRng As String) Dim objADO_Con As Object, objRS As Object Dim sFullFileName As String, sADORng As String ‘проверяем наличие слеша в пути к файлу If Right(sPath, 1) <> «» Then sPath = sPath & «» ‘если ячейка только одна — меняем вид адресации на ячейка:ячейка, как того требует ADO If Range(sRng).Count = 1 Then sADORng = sRng & «:» & sRng Else sADORng = sRng End If sFullFileName = sPath & sFileName With CreateObject(«ADODB.Connection») ‘подключаемся к файлу .Open «Driver=;ReadOnly=1;DBQ=» & sFullFileName & «;» ‘извлекаем записи из указанного диапазона в objRS Set objRS = .Execute(«select * FROM [» & sShName & «$» & sADORng & «]») ‘выгружаем извлеченные данные на активный лист, начиная с ячейки А1 Cells(1, 1).CopyFromRecordset objRS ‘Extract_Value_ADO = objRS.Fields(0).Value End With Set objRS = Nothing End Function

Вызывать эту функцию следует из другой процедуры или функции. Пример процедуры, для вызова этой функции:

Для вызова функции Extract_Value_ADO непосредственно с листа(в виде функции UDF) придется несколько изменить приведенный выше код функции, либо извлекать функцией значение только одной ячейки, что будет не очень экономично с точки зрения ресурсов и использование для этого ADO будет слишком неоправданным. Если кому необходимо, то для вызова функции с ячейки листа и возврата значения одной ячейки, необходимо заменить строку:

Cells(1, 1).CopyFromRecordset objRS

Синтаксис вызова с листа в таком случае будет следующим:
=Extract_Value_ADO(«C:»; «Книга1.xls»; «Лист1»; «A1»)
Важно: если данные извлекаются только из одной ячейки, то следует указать две ячейки: А1:А2 . Это особенность работы с запросами

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

‘————————————————————————————— ‘ Procedure : Extract_Value_ADO ‘ DateTime : 02.07.2014 16:47 ‘ Author : The_Prist(Щербаков Дмитрий) ‘ http://www.excel-vba.ru ‘ Purpose : Функция получения данных из закрытой книги при помощи ADO ‘ вызывается с листа как функция массива(если получаем данные с диапазона) ‘————————————————————————————— Function Extract_Value_ADO_Sh(sPath As String, sFileName As String, sShName As String, sRng As String) Dim objADO_Con As Object, objRS As Object Dim sFullFileName As String, sADORng As String Dim avTmp(), avRes(), li As Long, lr As Long, lc As Long ‘проверяем наличие слеша в пути к файлу If Right(sPath, 1) <> «» Then sPath = sPath & «» ‘если ячейка только одна — меняем вид адресации на ячейка:ячейка, как того требует ADO If Range(sRng).Count = 1 Then sADORng = sRng & «:» & sRng Else sADORng = sRng End If sFullFileName = sPath & sFileName With CreateObject(«ADODB.Connection») ‘подключаемся к файлу .Open «Driver=;ReadOnly=1;DBQ=» & sFullFileName & «;» ‘получаем кол-во строк в запросе Set objRS = .Execute(«SELECT COUNT(*) FROM [» & sShName & «$» & sADORng & «]») li = objRS.Fields(0).Value ‘извлекаем записи из указанного диапазона в objRS Set objRS = .Execute(«SELECT * FROM [» & sShName & «$» & sADORng & «]») ‘выгружаем извлеченные данные на активный лист, начиная с ячейки А1 ReDim avRes(1 To li, 1 To objRS.Fields.Count) avTmp = objRS.getrows(li, 0) ‘получаем массив данных запроса For lr = 0 To li — 1 ‘цикл по строкам For lc = 0 To UBound(avTmp, 1) ‘цикл по столбцам ‘значения Null не допускаются, поэтому приходится их подменять до выгрузки на лист If IsNull(avTmp(lc, lr)) Then avTmp(lc, lr) = Empty End If avRes(lr + 1, lc + 1) = avTmp(lc, lr) Next lc Next lr End With Extract_Value_ADO_Sh = avRes Set objRS = Nothing End Function

Синтаксис вызова с листа точно такой же как и в функции выше, только нужно будет выделить необходимое количество ячеек и ввести в них эту функцию, как формулу массива.:
=Extract_Value_ADO_Sh(«C:»; «Книга1.xls»; «Лист1»; «A1:B10»)
sPath — путь к папке с книгой, данные из которой необходимо извлечь ( «C:» )
sWb — имя книги, включая расширение(.xls в примере), данные из которой необходимо извлечь ( «Книга1.xls» )
sShName — имя листа в указанной книге, данные из которого необходимо извлечь ( «Лист1» )
sAddress — адрес ячейки(диапазона) данные которой необходимо получить ( «A1» )
Важно: если данные извлекаются только из одной строки, то следует все равно указать минимум две строки: А1:B10 . Это особенность работы с запросами. При попытке указать только одну строку А1:A10 функция вернет значение ошибки. При этом первая строка воспринимается как заголовки. Т.е. данные должны начинаться как минимум со второй строк(A2), а в A1 — заголовок
Хоть эта функция имеет определенные недостатки — она может быть в разы быстрее предыдущей.

Получение данных из закрытой книги при помощи Power Query

Если еще не работали с надстройкой PowerQuery и не знаете что это такое, то для начала лучше ознакомиться со статьей: Power Query — что такое и почему её необходимо использовать в работе?

Переходим на вкладку Данные(для Excel ниже 2016 вкладка PowerQuery) —Получить данныеИз файлаИз книги

Выбираем нужный лист

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

Но если необходимо отобрать только определенные столбцы и строки — тут придется хитрить. Например, нам необходимо получить данные ячеек C2:D20 , но в листе у нас заполнены ячейки A1:H89 . А зачем нам лишнее? Самое простое, конечно, это диапазон C2:D20 скопировать на отдельный лист и сделать из него умную таблицу. Далее в запросе выбрать именно эту одну таблицу и все. Но. Не всегда есть такая возможность и поэтому рассмотрим более тернистый путь. Итак, мы подключились к книге. И после выбора листа выбираем не Загрузить, а Преобразовать

Попадаем в редактор запросов PowerQuery и видим там данные нашего листа. Чтобы удалить лишние строки нам придется для начала их пронумеровать, т.к. в PowerQuery нет вменяемой нумерации строк по умолчанию.
Идем на вкладку Добавление столбцаСтолбец индексаНастроить

Начальный индекс ставим 2 (2 потому что первая строка листа у нас стала заголовком, значит первая строка в запросе будет равна 2-ой строке на листе Excel и так нам будет проще потом отбирать)
Инкремент — 1 (это шаг, нам нужно просто пронумеровать строки)

Теперь раскрываем фильтр на добавленном столбце индекса —Числовые фильтры —Между

Указываем «больше или равно» — 2, «меньше или равно» — 20 (это строки нужного нам диапазона C2:D20 ).

После нажатия Ок останутся только нужные нам строки. А удалить столбцы проще простого: выделяем нужные нам 3-й и 4-ый столбцы(это как C и D на листе Excel, только номерами) -правая кнопка мыши —Удалить другие столбцы.

Вуаля!
Осталось выгрузить в нашу книгу: идем на вкладку ГлавнаяЗакрыть и загрузить.
В дальнейшем надо будет просто выделить любую ячейку этой полученной из PowerQuery умной таблицы правой кнопкой мыши и нажать обновить.
Правда, есть нюанс: если вдруг заголовки у нашего файла поменяются — то мы получим ошибку на шаге удаления столбцов. Это происходит потому, что PowerQuery использует абсолютные имена столбцов в запросах. Но это решаемо. Идем на вкладку ГлавнаяРасширенный редактор:

Находим там строку:
#»Removed Other Columns» = Table.SelectColumns(#»Filtered Rows»,< «Товар», «Группа» >)
Это и есть наша строка удаления всех столбцов, кроме указанных в фигурных скобках( <«Товар», «Группа»>). Как видим, там жестко прописаны имена столбцов и нам надо как-то обратиться к ним через номера, чтобы не привязываться к их именами. Для этого перед этой строкой добавляем еще одну:
ColNames = Table.ColumnNames(#»Filtered Rows»),
этой строкой мы получаем список всех имен столбцов и запоминаем в список ColNames. А далее мы используем этот список для указания нужных номеров:
#»Removed Other Columns» = Table.SelectColumns(#»Filtered Rows»,< ColNames<2>, ColNames <3>>)
Только необходимо обращать внимание, что здесь индексация идет с 0. Т.е. если нам нужным были столбцы С(3) и D(4), то мы указываем на 1 меньше: 2 и 3. Если столбцов будет больше — перечисляем через запятые все, которые надо оставить. Зато теперь наш запрос не зависит ни от чего и мы в итоге получаем именно то, что хотим.
И маленькая ложка дегтя: PowerQuery не очень дружелюбен к форматам файлов .xls и .xlsb. Поэтому если нет сильной необходимости использовать именно эти форматы в качестве книг, из которых надо получить данные — лучше их и не использовать.

Статья помогла? Поделись ссылкой с друзьями!

Источник

 

Добрый день!
Прошу подсказать, как можно при помощи макроса вставить данные с одного файла в другой файл, при этом не открывая другой файл.
В файле Book1 есть данные которые будут меняться. Как сделать так чтобы в файл Book2 они вставлялись подряд (вниз каждый раз — ниже и ниже) и при этом только те, где в файле Book1 в столбце Date есть данные.

Прикрепленные файлы

  • Book2.xlsx (8.08 КБ)
  • Book1.xlsx (9.56 КБ)

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Практически никак. Теоретически делали на ADO, но там всякие ограничения, я не особо разбираюсь…
А вот если можно всёж открывать, тогда… Но ведь нельзя! :)
P.S. Хотя думаю что ADO тоже открывает файл, только совсем незаметно.

Изменено: Hugo22.03.2017 17:54:30

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

В связи с чем такие требования к файлу Book2?

 

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

 

Wanschh

Пользователь

Сообщений: 231
Регистрация: 10.01.2017

Уважаемый The_Priest  в другой, но похожей теме рекомендовал ознакомиться:

с этим

Возможно, это Ваш случай.

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Так там  — ПОЛУЧИТЬ. А тут — ПОЛОЖИТЬ!

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

Сделайте Book2 транзитным файлом. В своем личном файле делайте обновления из транзитного файла.

 

Колеги, можите пожалуйста продемонстрировать это на моем примере? Не совсем понимаю значения «транзитный файл». И как делать эти обновления. Спасибо.

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Вообще формулы можно спрятать защитой листа. Другое дело насколько эта защита надёжна…

 

Это да. Но интересно сделать так, чтобы операции проводились в одной книге, потом вставлялись как значения в другую не открывая её.  

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Ни вставить, ни прочитать ничего не открывая файл невозможно. Ни через какие АДО. Разве что силой мысли :D

Я сам — дурнее всякого примера! …

 

То есть по факту выход только тот чтобы делать все в одном файле?

 

PowerBoy

Пользователь

Сообщений: 141
Регистрация: 13.01.2014

#13

23.03.2017 11:44:02

Цитата
kuklp написал:
Ни вставить, ни прочитать ничего не открывая файл невозможно

ТС имеет ввиду не открывая файл в экселе. Через ADO он спокойно считает всю информацию,не открывая его в экселе.

Excel + SQL = Activetables

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#14

23.03.2017 11:45:19

Цитата
AlexBosenko написал:
Не совсем понимаю значения «транзитный файл».

Транзитный пассажир (трансферный пассажир) — пассажир любого типа транспорта, который находится в определенной точке временно, с целью того, чтобы продолжить свой путь дальше через какой-то промежуток времени. ;)

 

PowerBoy

Пользователь

Сообщений: 141
Регистрация: 13.01.2014

#15

23.03.2017 12:12:15

Поместите код в модуль книги Book2,сохраните Book2 с поддержкой макросов, книги должны лежать рядом, данные перекинуться из Book1.

Код
Public Sub RefreshData()
'Created using add-in ActiveTables
Dim strConnection As String
Dim strSQL As String
strConnection = IIf(Val(Application.Version) < 12, "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Replace(ThisWorkbook.FullName, "Book2.xlsm", "Book1.xlsx") & ";Extended Properties='Excel 8.0;HDR=YES;IMEX=3';", "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Replace(ThisWorkbook.FullName, "Book2.xlsm", "Book1.xlsx") & ";Extended Properties='Excel 12.0;HDR=YES;IMEX=3';")
strSQL = "SELECT   Date,  Jan,  Feb,  Mar,  Apr,  May,  Jun,  Jul,  Aug,  Sep,  Oct,  Nov,  Dec  FROM   [Аркуш1$]"
With ThisWorkbook.ActiveSheet
    .UsedRange.Clear
    With .QueryTables.Add(strConnection, .Range("A1"), strSQL)
         .Refresh False
         .Delete
    End With
End With
End Sub

Изменено: PowerBoy23.03.2017 12:19:48

Excel + SQL = Activetables

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#16

23.03.2017 12:40:28

Цитата
PowerBoy написал:
ТС имеет ввиду не открывая файл в экселе

похвально, что Вы умеете читать мысли ТС  ;)

Цитата
AlexBosenko написал:
вставить данные с одного файла в другой файл, при этом не открывая другой файл.

Лично я понял это так, что первый файл уже открыт. И для меня сомнительно преимущество привлечения сторонней библиотеки(OLEDB), при этом же все равно файл 2 нужно открыть. Почему просто не открыть второй файл макросом из первого, запузырить туда все что надо, сохранить и закрыть его, скрывая все эти действа с экрана? И примеров такому на форуме несть числа.
А SQL-запросы есть смысл применять только на ОЧЕНЬ больших объемах данных. Ну или если язык SQL родней и привычней Васика :D

Я сам — дурнее всякого примера! …

 

Все равно работает только когда Book2 открыта.

И как написать чтобы эти данные падали в нужные ячейки и каждый раз когда задействовался макрос данные в Book2 накапливались а не заменялись?

 

AlexBosenko

Пользователь

Сообщений: 195
Регистрация: 02.09.2016

#18

23.03.2017 13:24:53

Вот пишу такой код. Но данные вставляются в виду ошибке. В чем может быть причина?

Код
Sub Get_Value_From_Close_Book()
    Dim sShName As String, sAddress As String, vData
    Application.ScreenUpdating = False
    Workbooks.Open "W:Business AnalysisPaymentPR projectTestBook2.xlsm" '"
    sAddress = "A1:M100"
       vData = Sheets("Sheet2").Range(sAddress).Value
    ActiveWorkbook.Close False
     If IsArray(vData) Then
        [B1:M100].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [B1:M100] = vData
    End If
     Application.ScreenUpdating = True
End Sub
 

взять (положить) данные из файла не открывая сам файл можно только прямым чтением (записью) секторов с накопителя на котором он находиться. у файловой системы спросить где он лежит, определить кластер и цепочку кластеров и считывать… с записью сложнее, если что-то поправить и записать обратно скорее всего файл рухнет так, что его уже не откроет никто и ничто.
для того чтобы данные падали в нужные ячейки и накапливались там, необходимо:
1. забросить идею записывать данные в файл, не открывая его
2. описать что, откуда, куда, в каком режиме должно попасть в другой файл и задача из фантастической становиться реальной и даже элементарной скорее всего.

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Игор, спасибо. Но как это сделать при «на кодах»? Логику эту я понимаю, и как раз о такой логике я писал сначала. Но вот в кодах (макросах) слабоват.
Прошу отобразить, если есть возможность, на примере. Спасибо.

 

Колеги, окей. Подскажите пожалуйста следующее:
Во вложении файл. На первом листе данные, которые предпологается что будут меняться каждый раз.
Как сделать так, чтобы с первого листа эти данные копировались на второй лист как значения и чтобы эти скопированные данные на Листе2 вставлялись по накоплению?
При этом копировать нужно только те строчки, где в столбце Date стоит дата.
Спасибо.

Прикрепленные файлы

  • Book1.xlsm (16.75 КБ)

Изменено: AlexBosenko23.03.2017 14:16:39

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#22

23.03.2017 14:07:11

однако…
читаем #1:

Цитата
как можно при помощи макроса вставить данные с одного файла в другой файл, при этом не открывая другой файл

смотрим #18
судя по названию процедуры Sub Get_Value_From_Close_Book() и по тому, что в ней написано, Вы открываете файл и пытаетесь (именно пытаетесь, потому что попытка неудачна) прочитать значения из диапазона А1:М100 листа Sheet2 и тут же закрываете этот файл.
так вот
1. вот это
Sheets(«Sheet2»).Range(sAddress).Value
— это обращение к указанному диапазону указанного листа, но в КНИГЕ, В КОТОРОЙ НАПИСАН МАКРОС, а не в той, что вы открыли двумя строками выше.
если в книге с этим макросом нет листа с именем «Sheet2» — вот тут все и рухнет, а даже если есть, то Вы взяли значение не из только что открытой книги, а из той, в которой лежит приведенный Вами макрос.
2. возвращаясь к тому что написано в #1: так Вам нужно ВЗЯТЬ данные из другой книги или ПОЛОЖИТЬ данные в другую книгу? или Вы решили выяснить кто тут самый смышленый на «планете» и по Вашим ребусам сможет слепить нужный код

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

#23

23.03.2017 14:11:01

Цитата
Ігор Гончаренко написал:
но в КНИГЕ, В КОТОРОЙ НАПИСАН МАКРОС, а не в той,

— это смотря где лежит код, может быть и так, а может и иначе. А где код — это мне неизвестно…

 

посмотрите пожалуйста, последнее письмо где прикреплена только одна книга. Думаю стоит попробовать все сделать в одной книге и просто потом запаролить листы

Прикрепленные файлы

  • Book1.xlsm (16.75 КБ)

Изменено: AlexBosenko23.03.2017 14:18:12

 

извините, «загнался»
Sheets(«Sheet2»).Range(sAddress).Value — обратится к листу «Sheet2» активной в данный момент книги, а активна та, что Вы только что открыли
но вопрос что за задачу Вы решаете остается открытым.

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

#26

23.03.2017 14:29:09

Цитата
Ігор Гончаренко написал:
активной в данный момент книги

если код в стандартном модуле. А если в модуле книги, как некоторые любят? :)
Файл видеть не могу пока…

 

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

Прикрепленные файлы

  • Book1.xlsm (16.75 КБ)

 

осталось выяснить в чем суть задачи

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

ладно, что я сам себе задачу не поставлю…
задача написана в кнопке в файле, это даже интерактивный макрос, результат работы зависит от указанного Вами адреса)

Прикрепленные файлы

  • Book1.xlsm (21.79 КБ)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

AlexBosenko

Пользователь

Сообщений: 195
Регистрация: 02.09.2016

#30

23.03.2017 16:39:02

Игор, спасибо большое. Но как сделать: Чтобы копиросалось не все, а только те строчки где есть дата (то есть в столбце Date)?
И как сделать, чтобы каждый раз нажимая кнопку, в Листе2 данные заполнялись вниз и вниз, а не просто заменялись?

Хитрости »

6 Май 2011              261631 просмотров


Как получить данные из закрытой книги?

Достаточно часто появляется вопрос: как извлечь данные из закрытой книги Excel через VBA? Звучит может быть странновато, но это так: вопрос регулярно поднимается на форумах. Собственно, именно в связи с этим и появилась на свет данная статья. В принципе ничего сложного в задаче нет. При этом получить данные можно разными способами, в том числе при помощи функций пользователя(UDF).
Хотя если вдаваться в технические подробности, то получить данные из закрытой книги вообще нельзя. Так или иначе, на уровне системы файл все равно открывается, различие лишь в том как именно и к чему при этом предоставляется доступ. Поэтому переозвучим классическую постановку задачи в более распространенную в жизни: «Как получить данные из книги, не открывая её так, чтобы об этом узнал пользователь»

Попробуем разобраться с некоторыми методами, их плюсами и минусами:

  • Получение данных из закрытой книги при помощи процедуры
  • Получение данных из закрытой книги при помощи UDF
  • Получение данных из закрытой книги при помощи запроса ADO
  • Получение данных из закрытой книги при помощи Power Query
Получение данных из закрытой книги при помощи процедуры VBA
Sub Get_Value_From_Close_Book_Formula()
    Dim sPath As String, sFile As String, sShName As String
    sPath = "C:Documents and Settings" '"
    sFile = "Книга1.xls" '"
    sShName = "Лист1" '"
    Application.DisplayAlerts = 0
    With Range("A1:A100")
        .Formula = "='" & sPath & "[" & sFile & "]" & sShName & "'!" & "A1" '"
        '"A1" - указывается начальная ячейка диапазона, из которого необходимо получить значения
        .Value = .Value
    End With
    Application.DisplayAlerts = 1
End Sub

Данный код работает достаточно медленно, но с его помощью можно «вытащить» из закрытой книги значения сразу нескольких ячеек. Код ниже работает быстрее, но с его помощью можно извлечь значения лишь одной ячейки:

Sub Get_Value_From_Close_Book_Excel4Macro()
    Dim sPath As String, sFile As String, sShName As String
    Dim sAddress As String, vData
    sPath = "C:Documents and Settings" '"
    sFile = "Книга1.xls" '"
    sShName = "Лист1" '"
 
    sAddress = "'" & sPath & "[" & sFile & "]" & sShName & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1) '"
    vData = ExecuteExcel4Macro(sAddress)
End Sub

Если честно, сам я не очень-то люблю ни один из данных методов, т.к. они совершенно лишены гибкости. С их помощью можно получить исключительно значения ячеек. Форматы, формулы или другие свойства ячеек получить уже не получится. Поэтому я предпочитаю открывать книгу и копировать то, что мне надо. Делаю это, скрывая от пользователя при помощи свойства ScreenUpdating объекта Application.

Sub Get_Value_From_Close_Book()
    Dim sShName As String, sAddress As String, vData
    Dim objCloseBook As Workbook
    'Отключаем обновление экрана
    Application.ScreenUpdating = False
    Set objCloseBook = Workbooks.Open("C:Documents and SettingsКнига1.xls")
    sAddress = "A1:C100" 'или одна ячейка - "A1"
    'получаем значение
    vData = Sheets("Лист1").Range(sAddress).Value
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [A1] = vData
    End If
    'если надо копировать ячейки с форматами, 
    'то можно использовать стандартные методы копирования вставки
    'objCloseBook.Sheets("Лист1").Range(sAddress).Copy
    '[A1].PasteSpecial xlPasteValues  'вставляем значения
    '[A1].PasteSpecial xlPasteFormats 'вставляем форматы
    'закрываем книгу(из которой получали значения) без сохранения
    objCloseBook.Close False
    'Включаем обновление экрана
    Application.ScreenUpdating = True
End Sub

Есть и более экзотический метод — при помощи GetObject:

Sub Get_Value_From_Close_Book2()
    Dim sShName As String, sAddress As String, vData
    Dim objCloseBook As Object
    'Отключаем обновление экрана
    Application.ScreenUpdating = False
    Set objCloseBook = GetObject("C:Documents and SettingsКнига1.xls")
    sAddress = "A1:C100" 'или одна ячейка - "A1"
    'получаем значение
    vData = objCloseBook.Sheets("Лист1").Range(sAddress).Value
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [A1] = vData
    End If
    'если надо копировать ячейки с форматами, 
    'то можно использовать стандартные методы копирования вставки
    'objCloseBook.Sheets("Лист1").Range(sAddress).Copy
    '[A1].PasteSpecial xlPasteValues  'вставляем значения
    '[A1].PasteSpecial xlPasteFormats 'вставляем форматы
    'закрываем книгу(из которой получали значения) без сохранения
    objCloseBook.Close False
    'Включаем обновление экрана
    Application.ScreenUpdating = True
End Sub

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


Получение данных из закрытой книги при помощи UDF

Тот же код, что уже был рассмотрен выше, но оформленный в виде UDF(функции пользователя):

Function Get_Value_From_Close_Book(sWb As String, sShName As String, sAddress As String)
    Dim vData, objCloseBook As Object
    Set objCloseBook = GetObject(sWb)
    'получаем значение
    vData = objCloseBook.Sheets(sShName).Range(sAddress).Value
    objCloseBook.Close False
    Set objCloseBook = Nothing
    'Возвращаем данные в ячейку с функцией
    Get_Value_From_Close_Book = vData
End Function

Синтаксис функции (вызов с листа):
=Get_Value_From_Close_Book(«C:Книга1.xls»;»Лист1″;»B1″)
sWb — полный путь до книги, данные из которой необходимо извлечь («C:Книга1.xls»)
sShName — имя листа в указанной книге, данные из которого необходимо извлечь («Лист1»)
sAddress — адрес ячейки(диапазона) данные которой необходимо получить («B1»)

Чтобы получить массив ячеек(например B1:B10), необходимо выделить необходимое количество ячеек и ввести в них эту функцию, как формулу массива.
Думаю, не надо пояснять, что любой аргумент может быть задан не статичным текстом, а ссылкой на ячейку с этим текстом. Именно в этом и преимущество использования именно функций, а не процедур.


ПОЛУЧЕНИЕ ДАННЫХ ПРИ ПОМОЩИ ЗАПРОСА ADO

Так же есть еще один достаточно экзотический метод получения данных из действительно закрытой книги — через ADO(ActiveX Data Objects). По сути это получение данных через запрос SQL, используя для этого технологию ADO.

'---------------------------------------------------------------------------------------
' Procedure : Extract_Value_ADO
' DateTime  : 02.07.2014 16:47
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Функция получения данных из закрытой книги при помощи ADO
'             в таком виде не может быть использована вызовом с листа
'---------------------------------------------------------------------------------------
Function Extract_Value_ADO(sPath As String, sFileName As String, sShName As String, sRng As String)
    Dim objADO_Con As Object, objRS As Object
    Dim sFullFileName As String, sADORng As String
 
    'проверяем наличие слеша в пути к файлу
    If Right(sPath, 1) <> "" Then sPath = sPath & ""
    'если ячейка только одна - меняем вид адресации на ячейка:ячейка, как того требует ADO
    If Range(sRng).Count = 1 Then
        sADORng = sRng & ":" & sRng
    Else
        sADORng = sRng
    End If
    sFullFileName = sPath & sFileName
    With CreateObject("ADODB.Connection")
        'подключаемся к файлу
        .Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};ReadOnly=1;DBQ=" & sFullFileName & ";"
        'извлекаем записи из указанного диапазона в objRS
        Set objRS = .Execute("select * FROM [" & sShName & "$" & sADORng & "]")
        'выгружаем извлеченные данные на активный лист, начиная с ячейки А1
        Cells(1, 1).CopyFromRecordset objRS
        'Extract_Value_ADO = objRS.Fields(0).Value
    End With
    Set objRS = Nothing
End Function

Вызывать эту функцию следует из другой процедуры или функции. Пример процедуры, для вызова этой функции:

'---------------------------------------------------------------------------------------
' Procedure : Get_Value_From_Close_Book_ADO
' Purpose   : Вызов функции Extract_Value_ADO
'---------------------------------------------------------------------------------------
Sub Get_Value_From_Close_Book_ADO()
    Extract_Value_ADO ThisWorkbook.path, "Книга1.xls", "Лист1", "A1:B25"
End Sub

Для вызова функции Extract_Value_ADO непосредственно с листа(в виде функции UDF) придется несколько изменить приведенный выше код функции, либо извлекать функцией значение только одной ячейки, что будет не очень экономично с точки зрения ресурсов и использование для этого ADO будет слишком неоправданным. Если кому необходимо, то для вызова функции с ячейки листа и возврата значения одной ячейки, необходимо заменить строку:

Cells(1, 1).CopyFromRecordset objRS

на такую:

Extract_Value_ADO = objRS.Fields(0).Value

Синтаксис вызова с листа в таком случае будет следующим:
=Extract_Value_ADO(«C:»; «Книга1.xls»; «Лист1»; «A1»)
Важно: если данные извлекаются только из одной ячейки, то следует указать две ячейки: А1:А2. Это особенность работы с запросами

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

'---------------------------------------------------------------------------------------
' Procedure : Extract_Value_ADO
' DateTime  : 02.07.2014 16:47
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Функция получения данных из закрытой книги при помощи ADO
'             вызывается с листа как функция массива(если получаем данные с диапазона)
'---------------------------------------------------------------------------------------
Function Extract_Value_ADO_Sh(sPath As String, sFileName As String, sShName As String, sRng As String)
    Dim objADO_Con As Object, objRS As Object
    Dim sFullFileName As String, sADORng As String
    Dim avTmp(), avRes(), li As Long, lr As Long, lc As Long
    'проверяем наличие слеша в пути к файлу
    If Right(sPath, 1) <> "" Then sPath = sPath & ""
    'если ячейка только одна - меняем вид адресации на ячейка:ячейка, как того требует ADO
    If Range(sRng).Count = 1 Then
        sADORng = sRng & ":" & sRng
    Else
        sADORng = sRng
    End If
    sFullFileName = sPath & sFileName
    With CreateObject("ADODB.Connection")
        'подключаемся к файлу
        .Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};ReadOnly=1;DBQ=" & sFullFileName & ";"
        'получаем кол-во строк в запросе
        Set objRS = .Execute("SELECT COUNT(*) FROM [" & sShName & "$" & sADORng & "]")
        li = objRS.Fields(0).Value
        'извлекаем записи из указанного диапазона в objRS
        Set objRS = .Execute("SELECT * FROM [" & sShName & "$" & sADORng & "]")
        'выгружаем извлеченные данные на активный лист, начиная с ячейки А1
        ReDim avRes(1 To li, 1 To objRS.Fields.Count)
        avTmp = objRS.getrows(li, 0)    'получаем массив данных запроса
        For lr = 0 To li - 1    'цикл по строкам
            For lc = 0 To UBound(avTmp, 1) 'цикл по столбцам
                'значения Null не допускаются, поэтому приходится их подменять до выгрузки на лист
                If IsNull(avTmp(lc, lr)) Then
                    avTmp(lc, lr) = Empty
                End If
                avRes(lr + 1, lc + 1) = avTmp(lc, lr)
            Next lc
        Next lr
    End With
 
    Extract_Value_ADO_Sh = avRes
    Set objRS = Nothing
End Function

Синтаксис вызова с листа точно такой же как и в функции выше, только нужно будет выделить необходимое количество ячеек и ввести в них эту функцию, как формулу массива.:
=Extract_Value_ADO_Sh(«C:»; «Книга1.xls»; «Лист1»; «A1:B10»)
sPath — путь к папке с книгой, данные из которой необходимо извлечь («C:»)
sWb — имя книги, включая расширение(.xls в примере), данные из которой необходимо извлечь («Книга1.xls»)
sShName — имя листа в указанной книге, данные из которого необходимо извлечь («Лист1»)
sAddress — адрес ячейки(диапазона) данные которой необходимо получить («A1»)
Важно: если данные извлекаются только из одной строки, то следует все равно указать минимум две строки: А1:B10. Это особенность работы с запросами. При попытке указать только одну строку А1:A10 функция вернет значение ошибки. При этом первая строка воспринимается как заголовки. Т.е. данные должны начинаться как минимум со второй строк(A2), а в A1 — заголовок
Хоть эта функция имеет определенные недостатки — она может быть в разы быстрее предыдущей.


Получение данных из закрытой книги при помощи Power Query

Если еще не работали с надстройкой PowerQuery и не знаете что это такое, то для начала лучше ознакомиться со статьей: Power Query — что такое и почему её необходимо использовать в работе?

Переходим на вкладку Данные(для Excel ниже 2016 вкладка PowerQuery) —Получить данныеИз файлаИз книги
Получить данные из книги Excel
Выбираем нужный лист
Выбрать лист
Если необходимы данные всего листа, то внизу этого окна нажимаем кнопку Загрузить. Все, через пару секунд все данные выбранного листа будут помещены на новый лист текущей книги в умную таблицу.

Но если необходимо отобрать только определенные столбцы и строки — тут придется хитрить. Например, нам необходимо получить данные ячеек C2:D20, но в листе у нас заполнены ячейки A1:H89. А зачем нам лишнее? Самое простое, конечно, это диапазон C2:D20 скопировать на отдельный лист и сделать из него умную таблицу. Далее в запросе выбрать именно эту одну таблицу и все. Но. Не всегда есть такая возможность и поэтому рассмотрим более тернистый путь. Итак, мы подключились к книге. И после выбора листа выбираем не Загрузить, а Преобразовать
Преобразовать данные
Попадаем в редактор запросов PowerQuery и видим там данные нашего листа. Чтобы удалить лишние строки нам придется для начала их пронумеровать, т.к. в PowerQuery нет вменяемой нумерации строк по умолчанию.
Идем на вкладку Добавление столбцаСтолбец индексаНастроить
Настроить столбец Индекса
Начальный индекс ставим 2 (2 потому что первая строка листа у нас стала заголовком, значит первая строка в запросе будет равна 2-ой строке на листе Excel и так нам будет проще потом отбирать)
Инкремент — 1 (это шаг, нам нужно просто пронумеровать строки)
Настроить столбец Индекса
Теперь раскрываем фильтр на добавленном столбце индекса —Числовые фильтры —Между
Фильтр между
Указываем «больше или равно» — 2, «меньше или равно» — 20 (это строки нужного нам диапазона C2:D20).
Условия фильтра
После нажатия Ок останутся только нужные нам строки. А удалить столбцы проще простого: выделяем нужные нам 3-й и 4-ый столбцы(это как C и D на листе Excel, только номерами) -правая кнопка мыши —Удалить другие столбцы.
Удалить другие столбцы
Вуаля!
Осталось выгрузить в нашу книгу: идем на вкладку ГлавнаяЗакрыть и загрузить.
В дальнейшем надо будет просто выделить любую ячейку этой полученной из PowerQuery умной таблицы правой кнопкой мыши и нажать обновить.
Правда, есть нюанс: если вдруг заголовки у нашего файла поменяются — то мы получим ошибку на шаге удаления столбцов. Это происходит потому, что PowerQuery использует абсолютные имена столбцов в запросах. Но это решаемо. Идем на вкладку ГлавнаяРасширенный редактор:
Расширенный редактор
Находим там строку:
#»Removed Other Columns» = Table.SelectColumns(#»Filtered Rows»,{«Товар», «Группа»})
Это и есть наша строка удаления всех столбцов, кроме указанных в фигурных скобках({«Товар», «Группа»}). Как видим, там жестко прописаны имена столбцов и нам надо как-то обратиться к ним через номера, чтобы не привязываться к их именами. Для этого перед этой строкой добавляем еще одну:
ColNames = Table.ColumnNames(#»Filtered Rows»),
этой строкой мы получаем список всех имен столбцов и запоминаем в список ColNames. А далее мы используем этот список для указания нужных номеров:
#»Removed Other Columns» = Table.SelectColumns(#»Filtered Rows»,{ColNames{2}, ColNames{3}})
Только необходимо обращать внимание, что здесь индексация идет с 0. Т.е. если нам нужным были столбцы С(3) и D(4), то мы указываем на 1 меньше: 2 и 3. Если столбцов будет больше — перечисляем через запятые все, которые надо оставить. Зато теперь наш запрос не зависит ни от чего и мы в итоге получаем именно то, что хотим.
И маленькая ложка дегтя: PowerQuery не очень дружелюбен к форматам файлов .xls и .xlsb. Поэтому если нет сильной необходимости использовать именно эти форматы в качестве книг, из которых надо получить данные — лучше их и не использовать.


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Формулировка задачи:

как в приложении VBA открыть для записи и чтения файл Excel, чтобы окно с этим файлом не появлялось на экране?

Код к задаче: «Как внести данные в книгу Excel, не открывая окно с книгой?»

textual

Set wb = Workbooks.Open("d:Книга1.xls")
wb.Windows(1).Visible = False

Полезно ли:

5   голосов , оценка 3.800 из 5

Понравилась статья? Поделить с друзьями:
  • Vba excel группировка по строкам
  • Vba excel группа элементов
  • Vba excel график на форме
  • Vba excel границы строк
  • Vba excel границы печати