Excel функции с закрытыми книгами

 

Микки

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

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

Добрый день собственно вопрос в описании …темы… может кто помнит на память ?

 

китин

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

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

и Вам добрый!ИДЕКС и ПОИСКПОЗ точно работают.про ВПР точно сказать не могу.надо попробовать.но у меня на работе ВПР на другие книги не ссылаются.про другие ничего сказать не могу

Вполне такой нормальный кинжальчик. Процентов на 100
<#0>

 

Миш, нет такого списка
Надо методом тыка :)
К ИДЕКС, ПОИСКПОЗ и ВПР добавлю СУММПРОИЗВ и может ещё чего

 

Микки

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

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

Я рад тебя видеть сереж ..меня интересует СУММ, СУММЕСЛИ …и простая ссылка на ячейку

 

Я тебя тоже
Немного обидно что ты моё имя с маленькой буквы пишешь, ну да ладно

Простая ссылка на ячейку — работает, а остальное проверь сам

 

ikki

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

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

СУММЕСЛИ не работает точно, но заменяющая её СУММПРОИЗВ — работает (правда, при открытом файле получаем потерю в скорости пересчета)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Z

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

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

Win 10, MSO 2013 SP1

#7

09.07.2013 18:16:49

Цитата
Микки пишет: Где узнать какие формулы работают с закрытыми файлами

  :?:  Отрубили поиск? Удалили F1?
Из недавнего —

http://www.planetaexcel.ru/forum/?PAGE_NAME=message&FID=1&TID=49503

…  ;)

Изменено: Z09.07.2013 18:17:55

«Ctrl+S» — достойное завершение ваших гениальных мыслей!.. ;)

 

Hugo

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

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

UDF работают :)

 

ZVI

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

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

#9

09.07.2013 20:19:36

Цитата
Hugo пишет:
UDF работают

Игорь, работают ограниченно, видят не более 65536 строк

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

Как узнать какие функции работают с закрытыми книгами? Следующее довольно для многих функций справедливо:
Как правило функция, которая может работать с массивами(именно с массивами, а не диапазонами) работает и с закрытыми книгами. Если же для аргумента функции жестко указано диапазон ячеек(как в СУММЕСЛИ, СЧЁТЕСЛИ и т.п.), то она точно не сможет работать с закрытой книгой.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Hugo

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

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

#11

09.07.2013 21:02:30

Владимир, только что проверил — с трудом и вылетами (при правке формулы), но отработало и на 75907 строк:

Код
=VLOOKUPCOUPLE('C:Documents and SettingsИгорьМои документы[testbig.xlsx]Лист1'!$A$1:$B$75907;1;A1;2;", ";0)

Эксперимент был чистым — ввёл формулу при открытом файле, всё сохранил, всё закрыл, открыл источник, изменил значение, сохранил, закрыл всё, открыл снова файл с UDF — получил новые данные.

 

Микки

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

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

#12

10.07.2013 09:43:51

Цитата
Serge 007 пишет:
Я тебя тоже
Немного обидно что ты моё имя с маленькой буквы пишешь, ну да ладно

Простая ссылка на ячейку — работает, а остальное проверь сам

Извини Сережа торопился….так обрадовался что ты на планете. Всем спасибо за помощь и участие.

 

Микки

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

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

Дима а твоя УДФ будет работать с закрытыми книгами ?
‘ DateTime  : 11.01.2010 14:02
‘ Author    : The_Prist
‘ Purpose   :

http://www.planetaexcel.ru/forum.php?thread_id=12600

‘             Автор: PIKA4Y
‘             Функция суммирует значения указанного диапазона
‘             со всех листов книги в указанном диапзаоне по указанному критерию.
‘             Аналог стандартной СУММЕСЛИ, только со всех листов
‘—————————————————————————————
Option Explicit

Function All_SumIf(rRange As Range, rCriteria As Range, rSumRange As Range)
   Dim wsSh As Worksheet, sRange As String, sSumRange As String
   sRange = Right(rRange.Address, Len(rRange.Address) — InStr(rRange.Address, «!»))
   sSumRange = Right(rSumRange.Address, Len(rSumRange.Address) — InStr(rSumRange.Address, «!»))
   For Each wsSh In Sheets
       If wsSh.Name <> Application.Caller.Parent.Name Then
       All_SumIf = All_SumIf + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange))
       End If
   Next wsSh
End Function

 

ZVI

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

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

#14

10.07.2013 10:23:42

Цитата
Hugo пишет: Владимир, только что проверил …

Игорь, я был не прав  :)  В UDF нельзя передавать ссылку на весь столбец, а ограничение в 65536 строк действуют, если в UDF используются функции WorksheetFunction типа WorksheetFunction.Max(Ref).

Михаил Юрьевич, функция All_Sum работает только с открытой книгой, в которой она записана

Изменено: ZVI10.07.2013 10:27:10

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#15

10.07.2013 16:22:53

Цитата
Микки пишет:
Дима а твоя УДФ будет работать с закрытыми книгами ?

Там же используется стандартная СУММЕСЛИ — значит не будет.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

kan6346

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

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

#16

02.03.2018 14:11:26

Цитата
Serge 007 написал:
Миш, нет такого спискаНадо методом тыка К ИДЕКС, ПОИСКПОЗ и ВПР добавлю СУММПРОИЗВ и может ещё чего

ВПР не работает, а комбинация ИНДЕКС+ПОИСКПОЗ -ДА!!!

 

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

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

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

Профессиональная разработка приложений для MS Office

#17

02.03.2018 15:23:20

Цитата
kan6346 написал:
ВПР не работает,

Чем докажете? ВПР тоже работает с закрытыми книгами. И всегда работала.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

kan6346

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

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

#18

02.03.2018 16:58:06

Цитата
Дмитрий Щербаков написал:
Чем докажете? ВПР тоже работает с закрытыми книгами. И всегда работала.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

=ЕСЛИОШИБКА(ИНДЕКС(‘Проданные комплектующие.xlsx’!Таблица11[перечень];ПОИСКПОЗ([@[№ и дата стало]];’Проданные комплектующие.xlsx’!Таблица11[№ дата];0));»не найден») — работает при закрытой книге

=ЕСЛИОШИБКА(ВПР([@[№ и дата стало]];’Проданные комплектующие.xlsx’!Таблица11[#Все];4;ЛОЖЬ);»не найден») — работает ТОЛЬКО с открытой книгой

и жаль потерянных 3 недели :))))

 

PooHkrd

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

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

Excel x64 О365 / 2016 / Online / Power BI

Потому что вы ссылаетесь не на диапазоны, а на именованные таблицы. Нельзя ссылаться на смарт-таблицы в закрытых книгах вообще никакими формулами.

Вот горшок пустой, он предмет простой…

 

kan6346

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

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

#20

02.03.2018 17:22:46

Цитата
Цитата
PooHkrd написал:
Потому что вы ссылаетесь не на диапазоны, а на именованные таблицы. Нельзя ссылаться на смарт-таблицы в закрытых книгах вообще никакими формулами.

Просьба отписать «правильную» по Вашему мнению,формулу с ВПР. я проверю и честно отпишусь :)

 

Z

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

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

Win 10, MSO 2013 SP1

#21

02.03.2018 17:25:57

Цитата
kan6346 написал: Просьба отписать «правильную» по Вашему мнению,формулу с ВПР. я проверю…

OFF Да, блин — заявочка… А своя рука не поднимается на подвиг?!. ;)
ps Правила — пп 2.2. 2.3.

Изменено: Z02.03.2018 17:27:24

«Ctrl+S» — достойное завершение ваших гениальных мыслей!.. ;)

 

kan6346

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

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

#22

02.03.2018 17:32:26

Цитата
Z написал:
OFF Да, блин — заявочка… А своя рука не поднимается на подвиг?!. ps Правила — пп 2.2. 2.3.

своя рука уже устала за 3 недели :)))))  

 

PooHkrd

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

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

Excel x64 О365 / 2016 / Online / Power BI

#23

02.03.2018 17:37:19

«Рука бойца колоть устала!»
примерно так:

Код
=ЕСЛИОШИБКА(ВПР(A:A;[Проданные комплектующие.xlsx]Лист1!$A:$D;4;ЛОЖЬ);"не найден")

Проверяйте.
Вы уж не обессудьте, но какой файл-пример — такая и формула  8)
Вот еще вариант:

Код
=ВПР(A:A;'C:1[Книга2.xlsx]Лист1'!$A:$B;2;0)

У меня шикарно работает!

Изменено: PooHkrd02.03.2018 17:44:48

Вот горшок пустой, он предмет простой…

 

Здравствуйте
Подниму данную тему и вопрос вновь: Задача доставать данные из параллельной закрытой книги. Название книги не задано заранее, вычисляется по названию текущей (года-1): (2022-1=2021)

Пробовал индекс
=ИНДЕКС(«‘»&ПСТР(ЯЧЕЙКА(«filename»;A1);1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-10)&ПСТР(ЯЧЕЙКА(«filename»);НАЙТИ(«[«;ЯЧЕЙКА(«filename»))+1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-НАЙТИ(«[«;ЯЧЕЙКА(«filename»))-6)-1&».xlsx]01’!A:A»;5)

И ВПР
=ВПР(5;СЦЕПИТЬ(«‘»;ПСТР(ЯЧЕЙКА(«filename»;A1);1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-10);ПСТР(ЯЧЕЙКА(«filename»);НАЙТИ(«[«;ЯЧЕЙКА(«filename»))+1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-НАЙТИ(«[«;ЯЧЕЙКА(«filename»))-6)-1;».xlsx]01’!A:A»);1)

В обоих случаях безуспешно, выдает ССЫЛКА.
Прилагаю файлы примеров, столбце B видно, что путь к соседней книге вычисляется совершенно верно.
Так почему формула не работает в связке?
Пожалуйста укажите на ошибку.
Заранее спасибо!

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

  • 2022.xlsx (8.62 КБ)
  • 2021.xlsx (8.13 КБ)

 

Дмитрий(The_Prist) Щербаков

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

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

Профессиональная разработка приложений для MS Office

#25

20.01.2022 15:19:13

Цитата
Сергей Саныч написал:
Так почему формула не работает в связке?

потому что путь к книге текстом и ссылка на диапазон — разные вещи.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Сергей Саныч

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

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

#26

20.01.2022 17:26:25

Цитата
написал:
потому что путь к книге текстом и ссылка на диапазон — разные вещи.

То есть это не реализуемо?

 

Стандартными функциями — нет. Только через VBA. Вот, для общего образования:

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Преобразовал текст в ссылку:

=ИНДЕКС(ДВССЫЛ(«‘»&ПСТР(ЯЧЕЙКА(«filename»;A1);1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-10)&ПСТР(ЯЧЕЙКА(«filename»);НАЙТИ(«[«;ЯЧЕЙКА(«filename»))+1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-НАЙТИ(«[«;ЯЧЕЙКА(«filename»))-6)-1&».xlsx]01’!A:A»);1)

=ВПР(2;ДВССЫЛ(СЦЕПИТЬ(«‘»;ПСТР(ЯЧЕЙКА(«filename»;A1);1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-10);ПСТР(ЯЧЕЙКА(«filename»);НАЙТИ(«[«;ЯЧЕЙКА(«filename»))+1;НАЙТИ(«]»;ЯЧЕЙКА(«filename»))-НАЙТИ(«[«;ЯЧЕЙКА(«filename»))-6)-1;».xlsx]01’!A:A»));1)

Работает только при открытой книге, почему?

 

vikttur

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

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

#29

20.01.2022 20:58:08

Потому что ДВССЫЛ работает только с открытыми книгами.

Цитата
Дмитрий(The_Prist) Щербаков написал: Стандартными функциями — нет. Только через VBA.
 

Бахтиёр

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

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

Excel 365

#30

21.01.2022 18:34:23

Не вникал в ваш вариант.

У меня была необходимость сделать так, чтобы когда в ячейку написать:
2021 —> тянулись данные из закрытого файла D:Отчёты2021.xlsm
2020 —> тянулись данные из закрытого файла D:Отчёты2020.xlsm
2019 —> тянулись данные из закрытого файла D:Отчёты2019.xlsm

Я решил это такой формулой:
=ВЫБОР(2022-D1;ВПР(C3;’D:Отчёты[2021.xlsm]Лист1′!K1:N400;2;0);ВПР(C3;’D:Отчёты[2020.xlsm]Лист1′!K1:N400;2;0);ВПР(C3;’D:Отчёты[2019.xlsm]Лист1′!K1:N400;2;0);ВПР(C3;’D:Отчёты[2018.xlsm]Лист1′!K1:N400;2;0))

она же, для наглядности:
=ВЫБОР(2022-D1;
ВПР(C3;’D:Отчёты[2021.xlsm]Лист1′!K1:N400;2;0);
ВПР(C3;’D:Отчёты[2020.xlsm]Лист1′!K1:N400;2;0);
ВПР(C3;’D:Отчёты[2019.xlsm]Лист1′!K1:N400;2;0);
ВПР(C3;’D:Отчёты[2018.xlsm]Лист1′!K1:N400;2;0))

То есть в ячейку D1 я вводил год, и данные тянулись из закрытого файла этого года, менял значение ячейки D1 и данные тянулись из другого закрытого файла.

Изменено: Бахтиёр21.01.2022 18:38:53

Хитрости »

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


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

Достаточно часто появляется вопрос: как извлечь данные из закрытой книги 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
ссылки
статистика

Аналог функции ДВССЫЛ, работающий с закрытыми книгами

Автор IKor, 04.12.2008, 13:10

« назад — далее »

Господа,

Передо мной стоит задача получения информации из некоторого количества однотипных файлов (в настоящее время их около 20). Для этого в основном файле я определяю имена, ссылающиеся на диапазоны ячеек во внешних файлах, и затем обращаюсь к ним по указанному имени. К примеру =ИНДЕКС(Внешняя_Ссылка;1;1). Т.к. файлов много, то мне бы хотелось обращаться к ним, используя функцию ДВССЫЛ: =ИНДЕКС(ДВССЫЛ(А1);1;1), при этом А1=»Внешняя_Ссылка». К сожалению, функция ДВССЫЛ не работает с диапазонами, определенными в закрытых внешних файлах (так же как и функция СМЕЩ :( , и в отличии от функции ИНДЕКС :) ) — пока внешний файл открыт все работает нормально…
Поэтому сейчас мне приходится прописывать отдельно имена каждого из 20 внешних диапазонов.

Нельзя ли обойти это ограничение с помощью новой функции, написанной в VBA?
По понятным причинам мне не подходит решение при помощи VBA открывать все 20 файлов (даже в невидимом режиме) каждый раз, когда требуется пересчитать формулы, ссылающиеся на них.

Т.к. в VBA я не силен, то нельзя ли подробнее расписать как интегрировать новую функцию файл Excel. Должна ли она быть прописана только в основном файле или во всех внешних файлах тоже?


Цитата: IKor от 04.12.2008, 13:10
К сожалению, функция ДВССЫЛ не работает с диапазонами, определенными в закрытых внешних файлах.

Посмотрите в архиве тему: «Почему некоторые формулы не обновляются с закрытых книг?»

Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли


посмотрел…

Цитата: SIA Sterkhov
Возможные решения:
1) C помощью макросов обработки событий в вба. Измение происходит с помощью редактирования связи изменение источника связи ActiveWorkbook.ChangeLink Name:=»C:\book1.xls», NewName:=»C:\mybook.xls», _ Type:=xlExcelLinks Но нужно знать что на что заменять Прямое редактирование свзи в тексте формулы Cells.Replace What:=»[book2]», Replacement:=»[book1]», LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, _ ReplaceFormat:=True
(Кстати с помощью данного способа можно не только менять источник связи но и адрес ячейки на которую сылается формула в закрытой книге.
2) Написание пользовательских функций использующих
а)SQL — запросы
б)механизм ADO
в)механизм скрытой книги, когда данные вычисляются с помощью прямых формул в скрытой книге, а результаты этих вычисление передаются в «динамическую формулу»

Перечитывал я на днях Канта и понял: Корней Чуковский мой писатель! (с)

Что мне пришло в голову после прочтения:
— можно создать новую пользовательскую функцию, в которую в качестве аргумента передавать строку текста.
— по результатам анализа оценить является ли текст ссылкой и ссылается ли он на открытую или закрытую книгу.
— в том случае, если книга закрыта, то воспользоваться всеми теми советами, что предложены выше и получить «правильную ссылку»;
— а ссылку на открытую книгу или «правильную ссылку» использовать в стандартной формуле INDIRECT (ДВССЫЛКА), вызываемой с помощью Formula Property
— результат возвращать в качестве результата самой функции.

В любом случае, я этого сам не осилю  ::) так, прошу помощи зала.


Цитата: IKor от 04.12.2008, 16:26
Что мне пришло в голову после прочтения:…

А я рассчитывал, что Вам придёт в голову воспользоваться функцией INDIRECT.EXT ;)
Ссылка на офсайте клинит, но могу поделиться, если не найдёте.

Я вот так подумал:

  • 1) копошащиеся источники связи – оригинально, но ни к чему, потому что если мы уж используем события листа, то можем открыть закрытую книгу и почитать её;
  • 2) пользовательские функции с SQL/ADO – в самый раз, можно клепать. ;)
  • 2в) динамической формулой брать параллельный результат вычисления другой формулы может вести себя нестабильно, если вообще удастся развернуть последовательность вычислений вспять.

Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли


Цитата: Шпец Докапыч от 04.12.2008, 18:40
А я рассчитывал, что Вам придёт в голову воспользоваться функцией INDIRECT.EXT ;)

Так это же надо грамотным быть. Я о Morefunc for Excel и не знал ни чего до сего дня.
Действительно оф. сайт ничего не дает (причем на английской странице объевлена версия 5.05 от 1-12-08, а на французской — 5.06 от того же числа) :)
В любом случае я скачал комплект 5.06 отсюда и установил его.

Возможно, мне не понятны все настройки INDIRECT.EXT, но я не нашел отличий в работе обычной ДВССЫЛ и INDIRECT.EXT — несмотря на официально заявленную поддержку работы с закрытыми книгами :(

Мало того, что обе функции разучились поддерживать диапазон из внешней книги, которому присвоено имя в данной книге — по-моему у меня раньше получалось…
Но и различия в их работе не наблюдается :(

См. приложенные файлы.

И еще одна проблема: мой общий файл должен открываться не только с моего компа, где уже установлен пакет MoreFunc, но и с чужих. Конечно пакет бесплатен, но мой it-шник будет просто счастлив, устанавливая его на три десятка компьютеров…


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • Аналог функции ДВССЫЛ, работающий с закрытыми книгами

Как сослаться или связать значение в закрытом / закрытом файле книги Excel?

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

Контрольное значение из закрытого / закрытого файла Excel с формулой
Вставьте все данные определенного рабочего листа из неоткрытого/закрытого файла Excel с помощью Kutools for Excel


Контрольное значение из закрытого / закрытого файла Excel с формулой

Предположим, что ваша закрытая книга с именем test находится по пути E: Excel file на вашем компьютере, и вы хотите ссылаться на значение ячейки A2 из Sheet2 этой закрытой книги. Пожалуйста, сделайте следующее.

1. Выберите пустую ячейку, чтобы разместить значение ячейки, на которую указывает ссылка, введите формулу в панель формул и нажмите кнопку Enter ключ. Смотрите скриншот:

=INDEX(‘E:Excel file[test.xlsx]Sheet2’!A:A,2,1)

Заметки:

1). В формуле E: файл Excel — это полный путь к неоткрытой книге, тест.xlsx — это имя книги, Sheet2 — это имя листа, которое содержит значение ячейки, из которой вам нужно ссылаться, а A: A, 2,1 означает, что ячейка A2 будет указана в закрытой книге. Вы можете изменить их в зависимости от ваших потребностей.

2). Если вы хотите вручную выбрать лист для ссылки, примените формулу ниже. После применения формулы a Выбрать лист появится диалоговое окно, выберите рабочий лист и нажмите кнопку ОК. Тогда сразу же будет ссылка на определенное значение ячейки этого рабочего листа.

=INDEX(‘E:Excel file[test.xlsx]sheetname’!A:A,2,1)


Вставьте все данные определенного рабочего листа из неоткрытого/закрытого файла Excel с помощью Kutools for Excel

Если вы хотите вставить все содержимое листа из закрытого файла Excel, здесь я рекомендую вам Вставить файл в курсор полезности Kutools for Excel. Чтобы это сделать, выполните следующие действия.

1. Выберите пустую ячейку, с которой должен начинаться указанный рабочий лист, затем щелкните Кутулс Плюс > Импорт Экспорт > Вставить файл в курсор

2. в Вставить файл в курсор диалогового окна, нажмите Приложения кнопку.

3. в Выберите файл для вставки в позицию курсора ячейки диалоговом окне найдите и выберите закрытую книгу, на которую хотите сослаться, а затем нажмите Откройте кнопка. Смотрите скриншот:

4. Теперь он возвращается к вставке. Файл в курсоре диалоговом окне вы можете выбрать любой из Только значение (без формул) и Не передавать форматирование нужные вам параметры, а затем щелкните OK кнопка. В следующем всплывающем окне Выберите рабочий лист диалоговом окне, укажите рабочий лист и щелкните значок OK кнопка. Смотрите скриншот:

Теперь все содержимое выбранного рабочего листа указанной неоткрытой книги ссылается на текущий рабочий лист.

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

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


Статьи по теме:

  • Как ссылаться на формат и значение из другой ячейки в Excel?
  • Как ссылаться на рабочий лист по номеру индекса вместо имени в Excel?
  • Как удалить все ссылки на формулы, но сохранить значения в ячейках в Excel?
  • Как сохранить постоянную ссылку на ячейку формулы в Excel?
  • Как указать имя вкладки в ячейке в Excel?

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

СЧЕТЕСЛИ и закрытая книга.

SkyPro

Дата: Пятница, 11.07.2014, 16:54 |
Сообщение № 1

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Собственно, столкнулся с проблемой.
Есть две книги: в одной есть параметры, которые необходимо считать, которые записаны как «+а+б+в» (в любом кол-ве или последовательности: «+а+б» или «+в+а» или «+б»). А в другой формула, которая это должна считать.
Пробелма заключается в том, что счетесли в вариации

Код

=СЧЁТЕСЛИ([источник.xlsx]Лист1!$A$1:$A$8;»*+а*»)

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


skypro1111@gmail.com

Сообщение отредактировал SkyProПятница, 11.07.2014, 16:54

 

Ответить

Pelena

Дата: Пятница, 11.07.2014, 17:14 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

СУММПРОИЗВ() работает с закрытыми книгами. Так можно

Код

=СУММПРОИЗВ(—ЕЧИСЛО(ПОИСК(«+а»;[источник.xlsx]Лист1!$A$1:$A$8)))


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

SkyPro

Дата: Пятница, 11.07.2014, 17:35 |
Сообщение № 3

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Елена, спасибо огромное :) Знал, что суммпроизв с закрытыми работает, но не знал. как прилепить поиск куска текста..


skypro1111@gmail.com

 

Ответить

_Boroda_

Дата: Пятница, 11.07.2014, 18:37 |
Сообщение № 4

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Еще так можно

Код

=СЧЁТ((ПОИСК(A2;[источник.xlsx]Лист1!$A$1:$A$8)))

массивная


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

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

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

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

Способ №1

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

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

Итак, книга «Итог» должна собрать из файла «Магазины» наименование магазина за определённый месяц и из файла «Продажи» сумму продаж за каждый месяц по магазинам.

Взглянем в строчку формул книги «Итого» на листе «январь». 

=’C:папка[Продажи.xlsx]январь’!$B$3

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

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

=’C:папка[Магазины.xlsx]январь’!$A$3

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

Точно так же и с именем магазина, который подгружается из файла «Магазины».

Итог: необходимо правильно прописать имена файлов и их пути. 

Способ №2

Воспользуемся Power Query.  Как им пользоваться мы рассматривали ранее.

Напомню — если у вас Excel версии 2013 придётся установить этот модуль дополнительно. Если Excel 2016 он уже будет в комплекте.

Переходим на вкладку «Power Query», нажимаем кнопку «Из файла» и выбираем вариант «Из файла Excel».

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

В появившемся окне выбираем файл из которого нужно выгрузить информацию.

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

Далее выберем информацию с каких листов нужно загрузить. Щёлкаем галку «Несколько элементов» и отмечаем листы.

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

Нажимаем кнопку «Загрузить в» и выбираем «Таблица», будет выгружена информация на новые листы. Если хотим всё на один лист — придётся по очереди выгружать каждый лист.

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

Каждый лист загрузится в таблицу «Итог» и можно будет оперировать данными как угодно.

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

Наведя курсор в часть запроса, можно будет увидеть подробную статистику по элементу Power Query.

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

Функция GetValue предназначена для получения данных из закрытой книги Excel

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

Пример использования функции:

Sub ПримерИспользования_GetValue()
    p = "C:Documents and SettingsБухгалтерия" ' папка с файлом
    f = "расход.xls" ' имя файла
    s = "доходы" ' название листа
    a = "D145" ' интересующая нас ячейка
    
    ' выполняем загрузку данных из закрытой книги Excel
    ЗначениеЯчейки = GetValue(p, f, s, a)
 
    Debug.Print ЗначениеЯчейки ' выводим результат в окно Immediate
End Sub

Код функции GetValue:

Function GetValue(path, file, sheet, ref)
    'Функция GetValue получает в качестве параметров:
    ' path – путь к закрытому файлу (например, "d:files");
    ' file – название рабочей книги (например, "budget.xls");
    ' sheet – название рабочего листа (например, "Лист1");
    ' ref – ссылка на ячейку (например, "C4").
    
    If Right(path, 1) <> "" Then path = path & ""
 
    ' проверяем наличие файла по заданному пути
    If Dir(path & file) = "" Then GetValue = "Файл не найден": Exit Function
 
    ' формируем строку запроса
    arg$ = "'" & path & "[" & file & "]" & sheet & "'!" & _
           Range(ref).Range("A1").Address(, , xlR1C1)
 
    ' считываем значение из закрытой книги
    GetValue = ExecuteExcel4Macro(arg$)
 
    ' вместо ошибки возвращаем сообщение об ошибке
    ' к примеру, если лист не найден, или указана несуществующая ячейка
    If IsError(GetValue) Then GetValue = "<ошибка>"
End Function

Ещё один вариант этой функции:

Function GetValue(ByVal filepath$, ByVal SheetName$, ByVal CellAddress$)
    'Функция GetValue получает в качестве параметров:
    ' filepath$ = полный путь к файлу Excel (например, "d:filesbudget.xls");
    ' SheetName$ – название рабочего листа (например, "Лист1");
    ' CellAddress$ – ссылка на ячейку (например, "C4").
    
    On Error Resume Next
    ' проверяем наличие файла по заданному пути
    If Dir(filepath$) = "" Then GetValue = "Файл не найден": Exit Function
 
    Dim arr
    arr = Split(filepath$, "")
    arr(UBound(arr)) = "[" & arr(UBound(arr)) & "]"
    filepath$ = Join(arr, "")
 
    ' формируем строку запроса
    arg$ = "'" & filepath$ & SheetName$ & "'!" & Range(CellAddress$).Range("A1").Address(, , xlR1C1)
 
    ' считываем значение из закрытой книги
    GetValue = ExecuteExcel4Macro(arg$)
 
    ' вместо ошибки возвращаем сообщение об ошибке
    ' к примеру, если лист не найден, или указана несуществующая ячейка
    If IsError(GetValue) Then GetValue = "<ошибка>"
End Function

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

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

Содержание

  • Как найти и открыть книгу из самой программы? Горячая клавиша
  • Как найти и открыть недавно закрытую книгу Excel?
  • Как открыть уже открытые файлы?
  • Как открыть несколько книг рядом?
  • Как закрыть или открыть книгу Excel через VBA?
  • Похожие статьи

Как найти и открыть книгу из самой программы? Горячая клавиша

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

Открыть файл

Так же работает горячая клавиша Ctrl+O.

Как найти и открыть недавно закрытую книгу Excel?

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

Как быстро найти и открыть книгу Excel

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

Открыть файл3

При открытии любой книги Excel в разделе Последние документы будет висеть закрепленный таким образом файл.

Список последних файлов будет меняться в зависимости от того, с какими файлами вы работаете. Список файлов состоит 25 элементов, но если зайти «Файл»-«Параметры»-«Дополнительно»-«Экран»-«Число документов в списке последних файлов:», то можно установить свое значение до 50 файлов.

В версиях программы 2013 и выше последние файлы доступны в меню кнопки открыть.

Как открыть уже открытые файлы?

Если у вас множество файлов, то иногда проще их найти при помощи инструментом закладка «Вид» раздел «Окно» инструмент «Перейти в другое окно».

Перейти в другое окно в версии Excel

Функция Перейти в другое окно в версии Excel 2016

Как открыть несколько книг рядом?

Если вам необходимо открыть несколько книг или окон рядом, то это тоже несложно. Возможность редактора подробно описана здесь.

Как закрыть или открыть книгу Excel через VBA?

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

Вам необходимы отдельные функции для открытия или закрытия Excel через VBA? Например, вам нужно, чтобы файл закрывался после окончания выполнения макроса, используйте такие команды:

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

Workbooks.Open Filename:="C:primer.xlsx"

Где C:primer.xlsx путь к файлу

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

ClsBK = ActiveWorkbook.Name
Workbooks(ClsBK).Close

Где ClsBK — переменная, которой присваиваем имя открытой книги, а потом закрываем.

Есть вопросы — напишите мне.

Понравилась статья? Поделить с друзьями:
  • Excel функция вставить значение
  • Excel функции работы со строка
  • Excel функция все прописные
  • Excel функции работающие с массивами
  • Excel функция всд формула