Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Ссылка на ячейку в закрытой книге
 
Товарищи, есть вопросик.
Каким образом сделать работающую ссылку на ячейку в книге которая закрыта?
Ссылка формируется через ДВССЫЛ(СЦЕПИТЬ(...
Спасибо заранее!
Изменено: woodbox - 13 Фев 2013 19:22:09
 
Через ДВССЫЛ никак.
Делайте ссылку обычными ссылками. Либо через VBA. Иначе никак.
Как получить данные из закрытой книги?
в конце статьи есть функция для получения данных из закрытой книги.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
:D
 
Огромное спасибо, но есть один момент) данные появляются только в 1-й ячейке диапазона.
Если в каждую ячейку зайти и нажать Enter то данные появляются.
Посему вопрос, как отправить Enter сразу диапазону ячеек?
 
Нашел пользовательскую функцию типа
Код
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
    'Возвращаем данные в ячейку с функцией
    If IsArray(vData) Then
        Get_Value_From_Close_Book = vData
    Else
        Get_Value_From_Close_Book = vData
    End If
End F unction

Но при выполнении в файле невозможно нормально выделить ни одной ячейки( видимо переходит в какой то режим. Подскажите пожалуйста как исправить эту функцию.
 
"Нашел" сильно сказано. Скорее сходили по моей ссылке и оттуда взяли, т.к. в своем сообщении я точную карту обрисовал, как найти.
Исправить никак нельзя. Либо Вы получаете данные из закрытой книги, либо ничего у Вас не тормозит. Одно из двух.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дело не в том что тормозит) а в том что режим выделения становится каким то другим, т.е. ячейку нельзя выделить как обычно. Функция отрабатывает очень быстро, спасибо Вам за наводку на нее) но тут думаю дело может быть в чем то другом, может excel не возвращается в привычный режим после отработки функции. Не могу понять в чем дело
 
подскажите пожалуйста почему указанная выше пользовательская функция скрыто открывает книгу с данными, но не закрывает её потом?
 
удалил сообщение
Изменено: ikki - 3 Авг 2014 07:26:13
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
У меня задача схожая с задачей woodbox-а. А именно функцией листа получать значение конкретной ячейки из закрытой книги. Должна быть возможность автоматически, по условию изменять путь к файлу. Изучив вышенаписанное удалось получить функцию, которая возвращает путь к ячейке. Возможно ли преобразовать полученный путь в его значение? (только в рамках функции листа, а не макросом)
Можно делать руками - копируем ячейку с результатом вычисления функции, специальная вставка вставить значение, F2, ENTER, но это совсем не то что хотелось бы!
Подскажите пожалуйста существует ли способ заставить функцию возвращать значение, а не путь.

спасибо.
 
и вот ещё. Есть способ решить задачу с помощью ADO. Макрос, который это делает я нашёл, но переделать его пользовательскую функцию не могу.
Код
Function извлечение(path, file, sheet, ref)
Set cn = CreateObject("ADODB.Connection")
path = ThisWorkbook.path & "\" & path
If Right(path, 1) <> "\" Then path = path & "\"
t = path & file
cn.Open "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='" & t & "';Extended Properties='Excel 8.0;HDR=No;IMEX=1';"
Set rs1 = cn.Execute("select * from [" & sheet & ref & ":" & ref & "]") 
дальше в макросе было так:
Код
Cells(5, 5).CopyFromRecordset rs1
как это правильно написать в функции я не знаю.
Код
End Function
вообще возможно такое сделать в функции листа?

спасибо!
Изменено: Максим - 4 Авг 2014 01:24:27 (оформил код тегом)
 
Максим, код следует оформлять тегом. Привыкайте.
 
Cells(5, 5).CopyFromRecordset rs1

Код
извлечение=rs1.fields(0).value
хотя это полное извращение дергать ADO recordset, и использовать его как функцию
Хотя разовые применения вполне допустимы.
 
ооуеее! B.Key спасибо вам! наконец-то у меня хоть что-то заработало! :)

да, везде на форумах пишут что применение ADO для извлечения данных из закрытой книги это вроде как изврат, но ничего другого, применимого к функции листа, я не нашёл
 
Это не изврат, а вполне нормальное решение и довольно скоростное. Просто использовать его его надо с умом :))
 
Цитата
B.Key пишет: хотя это полное извращение
Цитата
B.Key пишет: Это не изврат, а вполне нормальное решение
я так и не понял...   :D
F1 творит чудеса
 
Получение значения одной ячейки с помощью ADO это изврат, а использовать ADO для других целей (не буду уточнять) вполне хорошее решение.
Скрытый текст
 
Цитата
Максим пишет:
почему указанная выше пользовательская функция скрыто открывает книгу с данными, но не закрывает её потом
Функция закрывает книгу 100%. За это отвечает строка:
Код
objCloseBook.Close False
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дима, в моём сообщении #9 об этом и говорилось.
просто на основе кода.
потом я его проверил.
для файлов *.xls, открываемых из Excel 2010 это почему-то не так.
файла нет в списке открытых, тем не менее при повторном пересчете функции или при ручном открытии файла Excel действительно почему-то выдает сообщение о том, что файл уже открыт.
поэтому я и откорректировал своё сообщение.

причина мне непонятна.
возможно - режим совместимости для файлов *.xls, возможно - какие-то особенности GetObject
думаю, GetObject имеет смысл заменить на Workbooks.Open
Изменено: ikki - 4 Авг 2014 11:37:30
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Что-то мне подсказывает, что эта строка:
Код
Set rs1 = cn.Execute("select * from [" & sheet & ref & ":" & ref & "]")
выбьет в ошибку. Символа одного не хватает:
Код
Set rs1 = cn.Execute("select * from [" & sheet & "$" & ref & ":" & ref & "]")
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
я решил что "$", как указатель "абсолютности" тут ни к чему и убрал его. Возможно я ошибаюсь и этот символ тут для другого было нужен, но без него работает.



тут я ошибался. $ нужен
Изменено: Максим - 4 Авг 2014 16:09:31 (исправил и убрал не корректный пример )
 
Я может чего не так понял, но в приложенном файле строка выглядит так:
Код
Set rs1 = cn.Execute("select * from [Лист1$a1:a1]")
т.е. знак $ присутствует. Попробуйте теперь его из этой строки убрать и заново пересчитать функцию.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ой! и правда. прошу прощения. я был уверен что у меня эта строка в функции "закомменчена". Действительно, Ваша правда - без $ не работает. спасибо за подсказку!
Страницы: 1
Читают тему (гостей: 1)