Страницы: 1
RSS
Запрос данных из закрытых файлов
 
Здравствуйте. Часто бывает, что в таблицу нужно подтягивать значения из другого файла. Для таких ситуаций я использую подключение к опрашиваемому файлу через Query-запрос. И это действительно удобно, когда нужно вытянуть всю таблицу с листа. Но часто возникает необходимость вытащить значение определенной ячейки (без ВПР и проч., просто какой-то ячейки с листа). Можно, конечно, пойти путем создания ссылки на ячейку другого файла.

В случае, если опрашиваемый файл открыт, то формула выглядит так:
Код
=[Выгрузка_ПН.xls]ПРОДАЖИ_ТЕК'!$A$1
А если файл закрыт, то добавляется путь:
Код
='C:\Исходники\[Выгрузка_ПН.xls]ПРОДАЖИ_ТЕК'!$A$1

Но Excel в таких ситуациях ведет себя неопределенно - он то читает закрытые файлы, то не читает, выдавая #ЗНАЧ.

Поэтому вопрос - можно ли как-то сделать Query-запрос на ячейку? Если нет, то как корректно считывать данные с закрытых файлов&
Изменено: andronus - 14.09.2018 16:40:16
 
Цитата
andronus написал:
как корректно считывать данные с закрытых файлов
Например - воспользоваться поиском: https://www.excel-vba.ru/chto-umeet-excel/kak-poluchit-dannye-iz-zakrytoj-knigi/
 
Апострофф,это макросы. А как без них? Я открываю файл-приемник, нажимаю в нем "Обновить все", и данные подтягиваются. При использовании макросов это еще одна операция, которая может забыться в процессе.  
 
Цитата
andronus написал:
Я открываю файл-приемник, нажимаю в нем "Обновить все", и данные подтягиваются. При использовании макросов это еще одна операция, которая может забыться в процессе.
Чтобы не забылась - вызывать макрос на событие открытия книги. И никакой "операции" )
 
Юрий М, я в макросах не силен, но попробовал повторить макрос с вашей ссылки. Создал файл "c:\источник.xlsx", в нем на единственном листе "Лист1" вбил в А1 значение "А1", добавил в книгу макросов макрос:
Цитата
Sub Get_Value_From_Close_Book_Excel4Macro()
   Dim sPath As String, sFile As String, sShName As String
   Dim sAddress As String, vData
   sPath = "C:\" '"
   sFile = "источник.xlsx" '"
   sShName = "Лист1" '"

   sAddress = "'" & sPath & "[" & sFile & "]" & sShName & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1) '"
   vData = ExecuteExcel4Macro(sAddress)
End Sub
Вроде всё верно? Выполняю макрос в другой книге - а он ничего не заполняет. Что я делаю не так?
Изменено: andronus - 14.09.2018 17:34:15
 
Я никакой ссылки не давал ))
Ищите в модуле книги событие Workbook_Open
И код оформляйте соответствующим тегом. а не цитатой.
 
Юрий М, прошу прощения, ссылку дал Апострофф, конечно же.
В макросе из статьи нет события Workbook_Open, видимо оно в этом макросе не нужно (при этом, в других макросах оно есть).

Насчет тега кода - я вставил его, но в итоге получилась какая-то каша в одну строку, посему использовал цитату. Сейчас проверю код:
Код
Sub Get_Value_From_Close_Book_Excel4Macro()
   Dim sPath As String, sFile As String, sShName As String
   Dim sAddress As String, vData
   sPath = "C:\" '"
   sFile = "источник.xlsx" '"
   sShName = "Лист1" '"

   sAddress = "'" & sPath & "[" & sFile & "]" & sShName & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1) '"
   vData = ExecuteExcel4Macro(sAddress)
End Sub
Очень странно. Получилась одна строка. Зашел в редактирование поста, пересохранил, всё норм.
Изменено: andronus - 14.09.2018 17:55:36
 
Цитата
andronus написал:
В макросе из статьи нет события Workbook_Open
Конечно нет. Боюсь, Вы меня не понимаете...
Цитата
andronus написал:
При использовании макросов это еще одна операция, которая может забыться в процессе.
Чтобы избежать этой забывчивости, я и предложил вызывать макрос при открытии книги.
В новую книгу в модуль книги вставьте такой макрос:
Код
Private Sub Workbook_Open()
    Call Macro1
End Sub

А в стандартный модуль такой:
Код
Sub Macro1() 'Макрос, который нужно вызывать
    MsgBox "Сработал вызываемый макрос"
End Sub


Сохраните файл, закройте, и откройте снова.
 
Юрий М, спасибо большое за помощь. Но я нашел в той же статье рабочий вариант без макросов, который меня полностью устраивает - это использование UDF.
 
UDF - тот же макрос ))
 
Юрий М, ну UDF хотя бы работает без всяких геморроев. Просто добавляешь в код Application.Volatile True и обновляешь книгу.
Страницы: 1
Наверх