645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
1 |
|
Не работает функция ДВССЫЛ при закрытом файле, на который ссылаюсь26.01.2017, 01:55. Показов 18614. Ответов 24
Доброго времени! Полная формула (чисто для ознакомления, в ней сам черт ногу сломит, разбираться не обязательно, проблемный кусок обозначил ниже с уже частично выполненными вычислениями): Кликните здесь для просмотра всего текста =ЕСЛИОШИБКА(ЕСЛИ(ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘F:[книга.xls]Logging Sheet’!$M6;’F:[книга.xls]Logging Sheet’!$AI$6:ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(СУММПРОИЗВ((‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100=МАКС(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100))*СТРОКА(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100));СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AI$6)));0) + 5;СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AK$6)))<>»»;ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘F:[книга.xls]Logging Sheet’!$M6;’F:[книга.xls]Logging Sheet’!$AI$6:ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(СУММПРОИЗВ((‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100=МАКС(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100))*СТРОКА(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100));СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AI$6)));0) + 5;СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AK$6))); ПРОСМОТР(2;1/(‘F:[книга.xls]Logging Sheet’!$AK$12:ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘F:[книга.xls]Logging Sheet’!$M6;’F:[книга.xls]Logging Sheet’!$AI$6:ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(СУММПРОИЗВ((‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100=МАКС(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100))*СТРОКА(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100));СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AI$6)));0) + 5;СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AK$6)))<>»»);’F:[книга.xls]Logging Sheet’!$AK$12:ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘F:[книга.xls]Logging Sheet’!$M6;’F:[книга.xls]Logging Sheet’!$AI$6:ДВССЫЛ(«‘F:[книга.xls]Logging Sheet’!»&АДРЕС(СУММПРОИЗВ((‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100=МАКС(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100))*СТРОКА(‘F:[книга.xls]Logging Sheet’!$AI$6:$AI$100));СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AI$6)));0) + 5;СТОЛБЕЦ(‘F:[книга.xls]Logging Sheet’!$AK$6)))) );ЕСЛИ(‘F:[книга.xls]Logging Sheet’!$M6<>»»;K6;»»)) Формула работает, если открыт и файл с формулой, и файл F:книга.xls. Если файл F:книга.xls закрыт, то функция ДВССЫЛ возвращает ошибку #Ссылка. Что можно вместо нее использовать, или как побороть эту беду? Как работаю с ДВССЫЛ (на каком этапе возвращает #Ссылка, последние 3 вычисления программы. проверял пошагово): Как мне «склеить» ссылку на ячейку в файле? Все предыдущие вычисления (которые ведутся по данным из этого же файла) работают, не работает только эта функция и ТОЛЬКО если файл F:книга.xls закрыт.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
26.01.2017, 01:55 |
Ответы с готовыми решениями: ЦПУ майнер, работает при закрытом диспетчере задач Почему таймер в программе работает медленнее при закрытом eclipse Поиск минимального элемента в массиве, который не меньше N, функция не работает при некоторых значениях Удаление строки в закрытом файле. 24 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
26.01.2017, 10:15 |
2 |
Функции для закрытых книг А так же обычные ссылки типа: =[файл]лист!A1 PS. без файла примера формулу понять не получается. Добавлено через 36 минут Код 'Logging Sheet'!$AI$6:ДВССЫЛ("Лист3!"&АДРЕС(СУММПРОИЗВ(('Logging Sheet'!$AI$6:$AI$100=МАКС('Logging Sheet'!$AI$6:$AI$100))*СТРОКА($AI$6:$AI$100));СТОЛБЕЦ($AI$6))) можно заменить на Код ='Logging Sheet'!$AI$6:ИНДЕКС('Logging Sheet'!$AI:$AI;СУММПРОИЗВ(('Logging Sheet'!$AI$6:$AI$100=МАКС('Logging Sheet'!$AI$6:$AI$100))*СТРОКА($AI$6:$AI$100))) т.е. убрана функция ДВССЫЛ() и АДРЕС(), которые не работают с закрытыми книгами.
1 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
26.01.2017, 11:40 [ТС] |
3 |
т.е. убрана функция ДВССЫЛ() и АДРЕС(), которые не работают с закрытыми книгами. Функции АДРЕС и МАКС работают. Вообще все функции (из используемых) работают, кроме ДВССЫЛ. Спасибо, сейчас разберусь с предложенной формулой, если не подойдет — вставлю упрощенный пример. МАКС использую для определения конца диапазона. Формула универсальная для 400 файлов, одинаковых по структуре, но с разным количеством строк.
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
26.01.2017, 11:57 |
4 |
номер последней строки в столбце AI с числами можно найти так Код =ПРОСМОТР(9^9;AI:AI;СТРОКА(AI:AI))
1 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
26.01.2017, 12:36 [ТС] |
5 |
номер последней строки в столбце AI с числами можно найти так Спасибо, от громоздкой конструкции с СУМОПРОИЗВ и МАКС избавился. Код для ячейки D5 файла счет: Кликните здесь для просмотра всего текста =ЕСЛИОШИБКА(ЕСЛИ(ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА(‘[исходник.xls]Logging Sheet’!$I:$I));СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$I$6)));0) + 5;СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$J$6)))<>»»;ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА(‘[исходник.xls]Logging Sheet’!$I:$I));СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$I$6)));0) + 5;СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$J$6))); ПРОСМОТР(2;1/(‘[исходник.xls]Logging Sheet’!$J$12:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА(‘[исходник.xls]Logging Sheet’!$I:$I));СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$I$6)));0) + 5;СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$J$6)))<>»»);'[исходник.xls]Logging Sheet’!$J$12:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА(‘[исходник.xls]Logging Sheet’!$I:$I));СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$I$6)));0) + 5;СТОЛБЕЦ(‘[исходник.xls]Logging Sheet’!$J$6)))) );ЕСЛИ(‘[исходник.xls]Logging Sheet’!$C6<>»»6;»»))
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
26.01.2017, 14:24 |
6 |
Избавьтесь и от этого Код СТРОКА('[исходник.xls]Logging Sheet'!$I:$I) СТОЛБЕЦ('[исходник.xls]Logging Sheet'!$J$6) достаточно писать так Код СТРОКА($I:$I) СТОЛБЕЦ($J$6) В первом случае это массив чисел, а во втором просто число и к книгам и листам привязывать необязательно.
1 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
26.01.2017, 15:17 [ТС] |
7 |
Относительные ссылки просто на полученное число менять не очень хочу, чтобы впоследствии просто номер столбца автозаменой подменить можно было. Кликните здесь для просмотра всего текста =ЕСЛИОШИБКА(ЕСЛИ(ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА($I:$I));СТОЛБЕЦ($I$6)));0) + 5;СТОЛБЕЦ($J$6)))<>»»;ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА($I:$I));СТОЛБЕЦ($I$6)));0) + 5;СТОЛБЕЦ($J$6))); ПРОСМОТР(2;1/(‘[исходник.xls]Logging Sheet’!$J$12:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА($I:$I));СТОЛБЕЦ($I$6)));0) + 5;СТОЛБЕЦ($J$6)))<>»»);'[исходник.xls]Logging Sheet’!$J$12:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПОИСКПОЗ(‘[исходник.xls]Logging Sheet’!$C6;'[исходник.xls]Logging Sheet’!$I$6:ДВССЫЛ(«‘D:Excel[исходник.xls]Logging Sheet’!»&АДРЕС(ПРОСМОТР(9^9;'[исходник.xls]Logging Sheet’!$I:$I;СТРОКА($I:$I));СТОЛБЕЦ($I$6)));0) + 5;СТОЛБЕЦ($J$6)))) );ЕСЛИ(‘[исходник.xls]Logging Sheet’!$C6<>»»6;»»)) Не по теме: П.С. формула уже на 2 строки короче исходной, но сделать без ДВССЫЛ у меня пока не получается.
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
26.01.2017, 15:36 |
8 |
Файл с формулой приложите.
0 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
26.01.2017, 15:50 [ТС] |
9 |
Файл с формулой приложите. Блин, вроде прикладывал раньше. Извиняюсь. По умолчанию работает в папке d:Excel
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
26.01.2017, 16:51 |
10 |
К сожалению у меня формулы не показываются, видно несовместимость 2003 и 2007. Редко, но так бывает
0 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
26.01.2017, 18:15 [ТС] |
11 |
К сожалению у меня формулы не показываются, видно несовместимость 2003 и 2007. Редко, но так бывает Ага, больше 7 уровней вложенности в формулах 2003 офис не поддерживает. Убрал одну проверку, теперь в интервал 8.0-21.0 нули, да и пофиг, это «ЕСЛИ» я сам потом вставлю. А формула получилась на 2/3 короче. И в 2003 офисе открывается без проблем.
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
26.01.2017, 20:46 |
12 |
Посмотрите вариант решения, но все равно есть проблема.
1 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
27.01.2017, 00:24 [ТС] |
13 |
Посмотрите вариант решения, но все равно есть проблема. ППЦ, а я там навертел….. Код =ПРОСМОТР("яяя";'F:Excel[исходник_new.xls]Logging Sheet'!$J$6:'F:Excel[исходник_new.xls]Logging Sheet'!$J$8) Эта функция работает, если начальная и конечная ячейки массива либо одинаковые, либо соседние. Если между ними еще хотя бы одна ячейка — функция работать перестает. Почему я не понял.
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
27.01.2017, 00:41 |
14 |
Я не понял. Моя формула работает как ваша при открытой книге?
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
27.01.2017, 01:34 |
15 |
А как такой вариант? С формулой Код =ВПР(B5;'[исходник_new1.xls]Logging Sheet'!B$6:J$9999;9;) Для такого решения пришлось доработать таблицу исходника.
0 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
27.01.2017, 09:59 [ТС] |
16 |
Я не понял. Моя формула работает как ваша при открытой книге? Да, конечно работает. Я, кстати, не понимаю как. Мы же вектор просмотра указываем сверху вниз, он должен первое сверху текстовое значение подставлять, я не прав?
Для такого решения пришлось доработать таблицу исходника. Исходных таблиц пока что 400 штук, за пару лет их будет несколько тысяч, вносить в них правки — это проигрышный вариант. Проще тогда просто открывать.
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
27.01.2017, 10:16 |
17 |
Я, кстати, не понимаю как Из описания функции Важно. Значения в аргументе просматриваемый_вектор должны быть расположены в порядке возрастания: …, -2, -1, 0, 1, 2, …, A-Z, ЛОЖЬ, ИСТИНА; в противном случае функция ПРОСМОТР может вернуть неверный результат. В нашем случае значения не по порядку и неверный результат и есть последнее значение.
0 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
27.01.2017, 10:27 [ТС] |
18 |
А. все, я понял. Вы все-таки изменили исходник, чтобы оно заработало. Так нельзя, к сожалению. Если взять неизмененный исходник — формула работает неправильно.
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
27.01.2017, 10:42 |
19 |
А как же описание «21,0-25,2 Аргиллизиты серые с тонкой вкрапленностью пирита до 1%» находится не против своих значений. Это же ошибка.
0 |
645 / 473 / 38 Регистрация: 04.11.2013 Сообщений: 1,949 |
|
27.01.2017, 11:08 [ТС] |
20 |
Добавлено через 10 минут
Я всего лишь переместил описания на сроку начала диапазона. И сделал объединение ячеек для красоты (не обязательно) (файл исходник_new) Над исходными файлами я не властен. Не я их составляю. Диапазон для описания находится в столбце I. Задача как раз из такого кривого файла сделать нормальный. Т.е. совместить столбцы B и C со столбцами I и J.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
27.01.2017, 11:08 |
Помогаю со студенческими работами здесь Почему ДВССЫЛ на простой именованный диапазон работает, а на динамический именованный не работает? Макрос в файле ексель, который находится на сервере, у 2 пользователей работает по-разному Копирование листов в отдельную книгу при наличии =ДВССЫЛ в листе Обмен Ут-бп При Закрытом Периоде Коллизия при открытом и закрытом хешировании ЛДС мигает при закрытом симисторе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
CCCP_Punk Пользователь Сообщений: 5 |
#1 26.01.2017 09:21:34 Доброго времени! Привожу полную формулу (чисто для ознакомления, в ней сам черт ногу сломит, разбираться не обязательно, проблемный кусок обозначил ниже с уже частично выполненными вычислениями):
Формула работает, если открыт и файл с формулой, и файл F:книга.xls. Если файл F:книга.xls закрыт, то функция ДВССЫЛ возвращает ошибку #Ссылка. Что можно вместо нее использовать, или как побороть эту беду? Как работаю с ДВССЫЛ (на каком этапе возвращает #Ссылка, последние 3 вычисления программы, проверял пошагово): Как мне «склеить» ссылку на ячейку в файле? Все предыдущие вычисления (которые ведутся по данным из этого же файла) работают, не работает только эта функция и ТОЛЬКО если файл F:книга.xls закрыт. |
|
Пытливый Пользователь Сообщений: 4587 |
Справку по функции ДВССЫЛ читали? Кому решение нужно — тот пример и рисует. |
CCCP_Punk Пользователь Сообщений: 5 |
#3 26.01.2017 09:29:50 Доброго времени! Привожу полную формулу (чисто для ознакомления, в ней сам черт ногу сломит, разбираться не обязательно, проблемный кусок обозначил ниже с уже частично выполненными вычислениями):
Формула работает, если открыт и файл с формулой, и файл F:книга.xls. Если файл F:книга.xls закрыт, то функция ДВССЫЛ возвращает ошибку #Ссылка. Что можно вместо нее использовать, или как побороть эту беду? Как работаю с ДВССЫЛ (на каком этапе возвращает #Ссылка, последние 3 вычисления программы. проверял пошагово): Как мне «склеить» ссылку на ячейку в файле? Все предыдущие вычисления (которые ведутся по данным из этого же файла) работают, не работает только эта функция и ТОЛЬКО если файл F:книга.xls закрыт. |
|
CCCP_Punk Пользователь Сообщений: 5 |
#4 26.01.2017 09:35:55
Да, я уже в курсе, что ДВССЫЛ не может работать с закрытыми книгами, потому и задал вопрос «Как мне склеить ссылку или побороть эту беду». |
||
Пытливый Пользователь Сообщений: 4587 |
Ок, вопрос второй: Не видя, как сейчас расположены данные, написана у Вас формула и прочие «мелочи», как думаете, можно ответить на Ваш вопрос? Кому решение нужно — тот пример и рисует. |
CCCP_Punk Пользователь Сообщений: 5 |
#6 26.01.2017 09:45:56 Ххммм… т.е. вы тоже не видите первое сообщение темы? Я тут только зарегистрирвался, думал — может это норма, проверка модератором и т.п. Я вообще все написал, и полную формулу, и проблемный кусок, но создалась тема без первого сообщения. Повторю значимое:
Вот такая формула получается после всех вычислений, дальше она «склеивает» название и возвращает «#Ссылка». Я бы не парился, и открывал оба файла, но у меня их тут 400 штук… П.С. Могу и полную формулу вставить, но подозреваю, что делу это не поможет
Изменено: CCCP_Punk — 26.01.2017 12:18:33 |
|||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
В мега-формулу не вдумывался. Но это должно помочь: Как получить данные из закрытой книги? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
CCCP_Punk Пользователь Сообщений: 5 |
#8 26.01.2017 13:26:58
С помощью VBA вообще не проблема, спасибо. Проблема в том, что требуется для человека, который VBA не знает совершенно, и если формулы Excel он сможет более-менее адаптировать, то макрос — точно нет. |
||
Skip to content
В этой статье объясняется синтаксис функции ДВССЫЛ, основные способы ее использования и приводится ряд примеров формул, демонстрирующих использование ДВССЫЛ в Excel.
В Microsoft Excel существует множество функций, некоторые из которых просты для понимания, другие требуют длительного обучения. При этом первые используются чаще, чем вторые. И тем не менее, функция Excel ДВССЫЛ (INDIRECT на английском) является единственной в своем роде. Эта функция Excel не выполняет никаких вычислений, не оценивает никаких условий не ищет значения.
Итак, что такое функция ДВССЫЛ (INDIRECT) в Excel и для чего ее можно использовать? Это очень хороший вопрос, и, надеюсь, вы получите исчерпывающий ответ через несколько минут, когда закончите чтение.
Функция ДВССЫЛ в Excel — синтаксис и основные способы использования
ДВССЫЛ используется для создания косвенных ссылок на ячейки, диапазоны, другие листы или книги. Другими словами, она получает нужный адрес и позволяет вам при помощи формулы создать из него динамическую ссылку на ячейку или диапазон вместо их прямого указания. В результате вы можете изменить ссылку в формуле, не изменяя саму формулу. Более того, эти косвенные ссылки не изменятся при вставке на лист новых строк или столбцов или при удалении уже существующих.
Все это может быть проще понять на примере. Однако чтобы написать формулу, пусть даже самую простую, нужно знать аргументы функции, верно? Итак, давайте сначала кратко рассмотрим синтаксис Excel ДВССЫЛ.
Функция ДВССЫЛ в Excel возвращает ссылку на ячейку, используя текстовую строку. Она имеет два аргумента, первый является обязательным, а второй – нет:
ДВССЫЛ(ссылка_на_ячейку; [a1])
ссылка_на_ячейку – это адрес нужной ячейки в виде текстовой строки, либо названия именованного диапазона.
a1 — логическое значение, указывающее, какой тип ссылки содержится в первом аргументе:
- Если значение ИСТИНА или опущено, то используется ссылка на ячейку в стиле A1.
- Если ЛОЖЬ, то возвращается ссылка в виде R1C1.
Таким образом, ДВССЫЛ возвращает либо ссылку на ячейку, либо ссылку на диапазон.
Хотя тип ссылки R1C1 может быть полезен в определенных ситуациях, вам, вероятно, удобнее использовать привычные ссылки типа A1. В любом случае, почти все формулы в этом руководстве будут использовать ссылки A1, и поэтому мы будем просто опускать второй аргумент в функции.
Как работает функция ДВССЫЛ
Чтобы получить представление о работе функции, давайте создадим простую формулу, которая демонстрирует, как можно применить ДВССЫЛ в Excel.
Предположим, у вас есть число 5 в ячейке A1 и текст «A1» в ячейке C1. Теперь поместите формулу =ДВССЫЛ(C1) в любую другую ячейку и посмотрите, что произойдет:
- Функция ДВССЫЛ обращается к значению в ячейке C1. Там в виде текстовой строки записан адрес «A1».
- Функция ДВССЫЛ направляется по этому адресу в ячейку A1, откуда извлекает записанное в ней значение, то есть число 555.
Итак, в этом примере функция ДВССЫЛ преобразует текстовую строку в ссылку на ячейку.
Аналогичным образом можно получить ссылку на диапазон. Для этого просто нужно функции ДВССЫЛ указать два адреса – начальный и конечный. Вы видите это на скриншоте ниже.
Формула ДВССЫЛ(C1&»:»&C2) извлекает адреса из указанных ячеек и превращается в =ДВССЫЛ(«A1:A5»).
В итоге мы получаем ссылку =A1:A5
Если вы считаете, что это все еще имеет очень мало практического смысла, пожалуйста, читайте дальше, и я продемонстрирую вам еще несколько примеров, которые раскрывают реальную силу функции Excel ДВССЫЛ и более подробно показывают, как она работает.
Как использовать ДВССЫЛ в Excel — примеры формул
Как показано в приведенном выше примере, вы можете использовать функцию ДВССЫЛ, чтобы записать адрес ячейки как обычную текстовую строку и получить в результате значение этой ячейки. Однако этот простой пример — не более чем намек на возможности ДВССЫЛ.
При работе с реальными данными мы можем превратить любой текст в ссылку, включая очень сложные комбинации, которые вы создаете, используя значения других ячеек и результаты, возвращаемые другими формулами Excel. Но не будем торопиться и пойдем от простого к сложному.
Создание косвенных ссылок из значений ячеек
Как вы помните, функция ДВССЫЛ в Excel позволяет использовать стили ссылок A1 и R1C1. Обычно вы не можете использовать оба стиля на одном листе одновременно. Вы можете переключаться между двумя типами ссылок только с помощью опции «Файл» > «Параметры» > «Формулы» > R1C1 . По этой причине пользователи Excel редко рассматривают использование R1C1 в качестве альтернативного подхода к созданию ссылок.
В формуле ДВССЫЛ вы можете использовать любой тип ссылки на одном и том же листе, если хотите. Прежде чем мы двинемся дальше, давайте более подробно рассмотрим разницу между стилями ссылок A1 и R1C1.
Стиль A1 — это обычный и привычный всем нам тип адресации в Excel, который указывает сначала столбец, за которым следует номер строки. Например, B2 обозначает ячейку на пересечении столбца B и строки 2.
Стиль R1C1 является обозначает координаты ячейки наоборот – за строками следуют столбцы, и к этому нужно привыкнуть:) Например, R5C1 относится к ячейке A5, которая находится в строке 5, столбце 1 на листе. Если после буквы не следует какая-либо цифра, значит, вы имеете в виду ту же строку или столбец, в которых записана сама формула.
А теперь давайте сравним на простом примере, как функция ДВССЫЛ обрабатывает адреса вида A1 и R1C1:
Как вы видите на скриншоте выше, две разные формулы возвращают один и тот же результат. Вы уже поняли, почему?
- Формула в ячейке D1: =ДВССЫЛ(C1)
Это самый простой вариант. Формула обращается к ячейке C1, извлекает ее значение — текстовую строку «A2» , преобразует ее в ссылку на ячейку, переходит к ячейке A2 и возвращает ее значение, равное 456.
- Формула в ячейке D3: =ДВССЫЛ(C3;ЛОЖЬ)
ЛОЖЬ во втором аргументе указывает, что указанное значение (C3) следует рассматривать как ссылку на ячейку в формате R1C1, т. е. сначала идет номер строки, за которым следует номер столбца. Таким образом, наша формула ДВССЫЛ интерпретирует значение в ячейке C3 (R2C1) как ссылку на ячейку на пересечении строки 2 и столбца 1, которая как раз и является ячейкой A2.
Создание ссылок из значений ячеек и текста
Аналогично тому, как мы создавали ссылки из значений ячеек , вы можете комбинировать текстовую строку и ссылку на ячейку с адресом прямо в формуле ДВССЫЛ, соединив их вместе при помощи оператора конкатенации (&).
В следующем примере формула =ДВССЫЛ(«А»&C1) возвращает значение из ячейки А1 на основе следующей логической цепочки:
Функция ДВССЫЛ объединяет элементы в первом аргументе ссылка_на_ячейку — текст «А» и значение из ячейки C1. Значение в C1 – это число 1, что в результате формирует адрес А1. Формула переходит к ячейке А1 и возвращает ее значение – 555.
Использование функции ДВССЫЛ с именованными диапазонами
Помимо создания ссылок на ячейки из текстовых строк, вы можете заставить функцию Excel ДВССЫЛ создавать ссылки на именованные диапазоны.
Предположим, у вас есть следующие именованные диапазоны на вашем листе:
- Яблоки – С2:E2
- Лимоны — C3: E3
- Апельсины – C4:E4 и так далее по каждому товару.
Чтобы создать динамическую ссылку Excel на любой из указанных выше диапазонов с цифрами продаж, просто запишите его имя, скажем, в H1, и обратитесь к этой ячейке при помощи формулы =ДВССЫЛ(H1).
А теперь вы можете сделать еще один шаг и вложить эту формулу в другие функции Excel. Например, попробуем вычислить сумму и среднее значений в заданном именованном диапазоне или найти максимальную и минимальную сумму продаж в нём, как это сделано на скриншоте ниже:
- =СУММ(ДВССЫЛ (H1))
- =СРЗНАЧ(ДВССЫЛ (H1))
- =МАКС(ДВССЫЛ (H1))
- =МИН(ДВССЫЛ (H1))
Теперь, когда вы получили общее представление о том, как работает функция ДВССЫЛ в Excel, мы можем поэкспериментировать с более серьёзными формулами.
ДВССЫЛ для ссылки на другой рабочий лист
Полезность функции Excel ДВССЫЛ не ограничивается созданием «динамических» ссылок на ячейки. Вы также можете использовать ее для формирования ссылки на другие листы.
Предположим, у вас есть важные данные на листе 1, и вы хотите получить эти данные на листе 2. На скриншоте ниже показано, как можно справиться с этой задачей.
Нам поможет формула:
=ДВССЫЛ(«‘»&A2&»‘!»&B2&C2)
Давайте разбираться, как работает эта формула.
Как вы знаете, обычным способом сослаться на другой лист в Excel является указание имени этого листа, за которым следуют восклицательный знак и ссылка на ячейку или диапазон, например Лист1!A1:С10. Так как имя листа часто содержит пробелы, вам лучше заключить его (имя, а не пробел в одинарные кавычки, чтобы предотвратить возможную ошибку, например,
‘Лист 1!’$A$1 или для диапазона – ‘Лист 1!’$A$1:$С$10 .
Наша задача – сформировать нужный текст и передать его функции ДВССЫЛ. Все, что вам нужно сделать, это:
- записать имя листа в одну ячейку,
- букву столбца – в другую,
- номер строки – в третью,
- объединить всё это в одну текстовую строку,
- передать этот адрес функции ДВССЫЛ.
Помните, что в текстовой строке вы должны заключать каждый элемент, кроме номера строки, в двойные кавычки и затем связать все элементы в единое целое с помощью оператора объединения (&).
С учетом вышеизложенного получаем шаблон ДВССЫЛ для создания ссылки на другой лист:
ДВССЫЛ («‘» & имялиста & «‘!» & имя столбца нужной ячейки & номер строки нужной ячейки )
Возвращаясь к нашему примеру, вы помещаете имя листа в ячейку A2 и вводите адреса столбца и строки в B2 и С2, как показано на скриншоте выше. В результате вы получите следующую формулу:
ДВССЫЛ(«‘»&A2&»‘!»&B2&C2)
Кроме того, обратите внимание, что если вы копируете формулу в несколько ячеек, вам необходимо зафиксировать ссылку на имя листа, используя абсолютные ссылки на ячейки, например $A$2.
Замечание.
- Если какая-либо из ячеек, содержащих имя листа и адреса ячеек (A2, B2 и c2 в приведенной выше формуле), будет пуста, ваша формула вернет ошибку. Чтобы предотвратить это, вы можете обернуть функцию ДВССЫЛ в функцию ЕСЛИ :
ЕСЛИ(ИЛИ(A2=»»;B2=»»;C2-“”); «»; ДВССЫЛ(«‘»&A2&»‘!»&B2&C2)
- Чтобы формула ДВССЫЛ, ссылающаяся на другой лист, работала правильно, указанный лист должен быть открыт в Экселе, иначе формула вернет ошибку #ССЫЛКА. Чтобы не видеть сообщение об ошибке, которое может портить вид вашей таблицы, вы можете использовать функцию ЕСЛИОШИБКА, которая будет отображать пустую строку при любой возникшей ошибке:
ЕСЛИОШИБКА(ДВССЫЛ(«‘»&A2&»‘!»&B2&C2); «»)
Формула ДВССЫЛ для ссылки на другую книгу Excel
Формула, которая создает ссылку на другую книгу Excel, основана на том же подходе, что и обычная ссылка на другую электронную таблицу. Вам просто нужно указать имя книги дополнительно к имени листа и адресу ячейки.
Чтобы упростить задачу, давайте начнем с создания ссылки на другую книгу обычным способом (апострофы добавляются, если имена вашей книги и/или листа содержат пробелы):
‘[Имя_книги.xlsx]Имя_листа’!Арес_ячейки
Но, чтобы формула была универсальной, лучше апострофы добавлять всегда – лишними не будут .
Предполагая, что название книги находится в ячейке A2, имя листа — в B2, а адрес ячейки — в C2 и D2, мы получаем следующую формулу:
=ДВССЫЛ(«‘[«&$A$2&».xlsx]»&$B$2&»‘!»&C2&D2)
Поскольку вы не хотите, чтобы ячейки, содержащие имена книг и листов, изменялись при копировании формулы в другие ячейки, вы можете зафиксировать их, используя абсолютные ссылки на ячейки – $A$2 и $B$2 соответственно.
Если адреса ячеек заменить их значениями, то мы получим такой промежуточный результат:
=ДВССЫЛ(«‘[INDIRECT.xlsx]Продажи’!D3»)
Ну а итоговый результат вы видите на скриншоте ниже.
Hbc6
И теперь вы можете легко создать собственную динамическую ссылку на другую книгу Excel, используя следующий шаблон:
=ДВССЫЛ(«‘[» & Название книги & «]» & Имя листа & «‘!» & Адрес ячейки )
Примечание. Рабочая книга, на которую ссылается ваша формула, всегда должна быть открыта, иначе функция ДВССЫЛ выдаст ошибку #ССЫЛКА. Как обычно, функция ЕСЛИОШИБКА может помочь вам избежать этого:
=ЕСЛИОШИБКА(ДВССЫЛ(«‘[«&$A$2&».xlsx]»&$B$2&»‘!»&C2&D2); «»)
Использование функции Excel ДВССЫЛ чтобы зафиксировать ссылку на ячейку
Обычно Microsoft Excel автоматически изменяет ссылки на ячейки при вставке новых или удалении существующих строк или столбцов на листе. Чтобы этого не произошло, вы можете использовать функцию ДВССЫЛ для работы с конкретными адресами ячеек, которые в любом случае должны оставаться неизменными.
Чтобы проиллюстрировать разницу, сделайте следующее:
- Введите любое значение в любую ячейку, например, число 555 в ячейку A1.
- Обратитесь к A1 из двух других ячеек тремя различными способами: =A1, =ДВССЫЛ(«A1») и ДВССЫЛ(С1), где в С1 записан адрес «А1».
- Вставьте новую строку над строкой 1.
Видите, что происходит? Ячейка с логическим оператором =А1 по-прежнему возвращает 555, потому что ее формула была автоматически изменена на =A2 после вставки строки. Ячейки с формулой ДВССЫЛ теперь возвращают нули, потому что формулы в них не изменились при вставке новой строки и они по-прежнему ссылаются на ячейку A1, которая в настоящее время пуста:
После этой демонстрации у вас может сложиться впечатление, что функция ДВССЫЛ больше мешает, чем помогает. Ладно, попробуем по-другому.
Предположим, вы хотите просуммировать значения в ячейках A2:A5, и вы можете легко сделать это с помощью функции СУММ:
=СУММ(A2:A5)
Однако вы хотите, чтобы формула оставалась неизменной, независимо от того, сколько строк было удалено или вставлено. Самое очевидное решение — использование абсолютных ссылок — не поможет. Чтобы убедиться, введите формулу =СУММ($A$2:$A$5) в какую-нибудь ячейку, вставьте новую строку, скажем, в строку 3, и увидите формулу, преобразованную в =СУММ($A$2:$A$6).
Конечно, такая любезность Microsoft Excel в большинстве случаев будет работать нормально. Тем не менее, могут быть сценарии, когда вы не хотите, чтобы формула менялась автоматически. Например, нам нужна сумма только первых четырех значений из таблицы.
Решение состоит в использовании функции ДВССЫЛ, например:
=СУММ(ДВССЫЛ(«A2:A5»))
Поскольку Excel воспринимает «A1: A5» как простую текстовую строку, а не как ссылку на диапазон, он не будет вносить никаких изменений при вставке или удалении строки (строк), а также при их сортировке.
Использование ДВССЫЛ с другими функциями Excel
Помимо СУММ, ДВССЫЛ часто используется с другими функциями Excel, такими как СТРОКА, СТОЛБEЦ, АДРЕС, ВПР, СУММЕСЛИ и т. д.
Пример 1. Функции ДВССЫЛ и СТРОКА
Довольно часто функция СТРОКА используется в Excel для возврата массива значений. Например, вы можете использовать следующую формулу массива (помните, что для этого нужно нажать Ctrl + Shift + Enter
), чтобы вернуть среднее значение трех наименьших чисел в диапазоне B2:B13
{=СРЗНАЧ(НАИМЕНЬШИЙ(B2:B13;СТРОКА(1:3)))}
Однако, если вы вставите новую строку в свой рабочий лист где-нибудь между строками 1 и 3, диапазон в функции СТРОКА изменится на СТРОКА(1:4), и формула вернет среднее значение четырёх наименьших чисел вместо трёх.
Чтобы этого не произошло, вставьте ДВССЫЛ в функцию СТРОКА, и ваша формула массива всегда будет оставаться правильной, независимо от того, сколько строк будет вставлено или удалено:
={СРЗНАЧ(НАИМЕНЬШИЙ(B2:B13;СТРОКА(ДВССЫЛ(«1:3»))))}
Аналогично, если нам нужно найти сумму трёх наибольших значений, можно использовать ДВССЫЛ вместе с функцией СУММПРОИЗВ.
Вот пример:
={СУММПРОИЗВ(НАИБОЛЬШИЙ(B2:B13;СТРОКА(ДВССЫЛ(«1:3»))))}
А чтобы указать переменное количество значений, которое мы хотим сосчитать, можно это число вынести в отдельную ячейку. К примеру, в С1 запишем цифру 3. Тогда формулу можно изменить таким образом:
={СУММПРОИЗВ(НАИБОЛЬШИЙ(B2:B13;СТРОКА(ДВССЫЛ(«1:»&C1))))}
Согласитесь, что получается достаточно гибкий расчёт.
Пример 2. Функции ДВССЫЛ и АДРЕС
Вы можете использовать Excel ДВССЫЛ вместе с функцией АДРЕС, чтобы получить значение в определенной ячейке на лету.
Как вы помните, функция АДРЕС используется в Excel для получения адреса ячейки по номерам строк и столбцов. Например, формула =АДРЕС(1;3) возвращает текстовую строку «$C$1», поскольку C1 — это ячейка на пересечении 1-й строки и 3-го столбца.
Чтобы создать ссылку на ячейку, вы просто встраиваете функцию АДРЕС в формулу ДВССЫЛ, например:
=ДВССЫЛ(АДРЕС(1;3))
Конечно, эта несложная формула лишь демонстрирует технику. Более сложные примеры использования функций ДВССЫЛ И АДРЕС в Excel см. в статье Как преобразовать строки в столбцы в Excel .
И вот еще несколько примеров формул в которых используется функция ДВССЫЛ, и которые могут оказаться полезными:
- ВПР и ДВССЫЛ — как динамически извлекать данные из разных таблиц (см. пример 2).
- Excel ДВССЫЛ и СЧЁТЕСЛИ — как использовать функцию СЧЁТЕСЛИ в несмежном диапазоне или нескольких выбранных ячейках.
Использование ДВССЫЛ для создания выпадающих списков
Вы можете использовать функцию Excel ДВССЫЛ с инструментом проверки данных для создания каскадных выпадающих списков. Они показывают различные варианты выбора в зависимости от того, какое значение пользователь указал в предыдущем выпадающем списке.
Простой зависимый раскрывающийся список сделать очень просто. Все, что требуется, — это несколько именованных диапазонов для хранения элементов раскрывающегося списка.
В ячейке А1 вы создаете простой выпадающий список с названиями имеющихся именованных диапазонов. Для второго зависимого выпадающего списка в ячейке В2 вы используете простую формулу =ДВССЫЛ(A1), где A1 — это ячейка, в которой выбрано имя нужного именованного диапазона.
К примеру, выбрав в первом списке второй квартал, во втором списке мы видим месяцы этого квартала.
Рис9
Чтобы сделать более сложные трехуровневые меню или раскрывающиеся списки с многоуровневыми записями, вам понадобится немного более сложная формула ДВССЫЛ в сочетании с вложенной функцией ПОДСТАВИТЬ.
Подробное пошаговое руководство по использованию ДВССЫЛ с проверкой данных Excel смотрите в этом руководстве: Как создать зависимый раскрывающийся список в Excel.
Функция ДВССЫЛ Excel — возможные ошибки и проблемы
Как показано в приведенных выше примерах, функция ДВССЫЛ весьма полезна при работе со ссылками на ячейки и диапазоны. Однако не все пользователи Excel охотно принимают этот подход, в основном потому, что постоянное использование ДВССЫЛ приводит к отсутствию прозрачности формул Excel и несколько затрудняет их понимание. Функцию ДВССЫЛ сложно просмотреть и проанализировать ее работу, поскольку ячейка, на которую она ссылается, не является конечным местоположением значения, используемого в формуле. Это действительно довольно запутанно, особенно при работе с большими сложными формулами.
В дополнение к сказанному выше, как и любая другая функция Excel, ДВССЫЛ может вызвать ошибку, если вы неправильно используете аргументы функции. Вот список наиболее типичных ошибок и проблем:
Ошибка #ССЫЛКА!
Чаще всего функция ДВССЫЛ возвращает ошибку #ССЫЛКА! в следующих случаях:
- Аргумент ссылка_на_ячейку не является допустимой ссылкой Excel. Если вы пытаетесь передать функции текст, который не может обозначать ссылку на ячейку (например, «A1B0»), то формула приведет к ошибке #ССЫЛКА!. Во избежание возможных проблем проверьте аргументы функции ДВССЫЛ .
- Превышен предел размера диапазона. Если аргумент ссылка_на_ячейку вашей формулы ДВССЫЛ ссылается на диапазон ячеек за пределами строки 1 048 576 или столбца 16 384, вы также получите ошибку #ССЫЛКА в Excel 2007 и новее. Более ранние версии Excel игнорируют превышение этого лимита и действительно возвращают некоторое значение, хотя часто не то, что вы ожидаете.
- Используемый в формуле лист или рабочая книга закрыты.Если ваша формула с ДВССЫЛ адресуется на другую книгу или лист Excel, то эта другая книга или электронная таблица должны быть открыты, иначе ДВССЫЛ возвращает ошибку #ССЫЛКА! . Впрочем, это требование характерно для всех формул, которые ссылаются на другие рабочие книги Excel.
Ошибка #ИМЯ?
Это самый очевидный случай, подразумевающий, что в названии функции есть какая-то ошибка.
Ошибка из-за несовпадения региональных настроек.
Также распространенная проблема заключается не в названии функции ДВССЫЛ, а в различных региональных настройках для разделителя списка.
В европейских странах запятая зарезервирована как десятичный символ, а в качестве разделителя списка используется точка с запятой.
В стандартной конфигурации Windows для Северной Америки и некоторых других стран разделителем списка по умолчанию является запятая.
В результате при копировании формулы между двумя разными языковыми стандартами Excel вы можете получить сообщение об ошибке « Мы обнаружили проблему с этой формулой… », поскольку разделитель списка, используемый в формуле, отличается от того, что установлен на вашем компьютере. Если вы столкнулись с этой ошибкой при копировании какой-либо НЕПРЯМОЙ формулы из этого руководства в Excel, просто замените все запятые (,) точками с запятой (;) (либо наоборот). В обычных формулах Excel эта проблема, естественно, не возникнет. Там Excel сам поменяет разделители исходя из ваших текущих региональных настроек.
Чтобы проверить, какие разделитель списка и десятичный знак установлены на вашем компьютере, откройте панель управления и перейдите в раздел «Регион и язык» > «Дополнительные настройки».
Надеемся, что это руководство пролило свет для вас на использование ДВССЫЛ в Excel. Теперь, когда вы знаете ее сильные стороны и ограничения, пришло время попробовать и посмотреть, как функция ДВССЫЛ может упростить ваши задачи в Excel. Спасибо за чтение!
Вот еще несколько статей по той же теме:
Аналог функции ДВССЫЛ, работающий с закрытыми книгами
Автор 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 -
►
Аналог функции ДВССЫЛ, работающий с закрытыми книгами
Я хочу сослаться на значение ячейки в другой закрытой книге с помощью формулы (не VBA!). Имя листа сохраняется как переменная (в следующем примере C13 — «Лист2»).
Если другой файл открыт, то работает следующее:
=INDIRECT("[myExcelFile.xlsm]" & C13 & "!$A$1")
Если файл закрыт, приведенная выше формула не работает, так как не указан абсолютный путь. Но у меня получилось работать со следующим (обратите внимание на «вместо»:
='C:data[myExcelFile.xlsm]Sheet2'!$A$1
Теперь я хочу заменить жестко заданный «Sheet2» значением динамической ссылки, то есть значением C13 (как видно из первого фрагмента кода).
Кто-нибудь знает решение без использования VBA или других библиотек?
11 ответов
Абсолютно это невозможно сделать< /a> по стандартным формулам. Однако сумасшедший ответ можно найти здесь. Он по-прежнему избегает VBA и позволит вам получить результат динамически.
-
Сначала создайте формулу, которая будет генерировать вашу формулу, но не добавляйте
=
в начале! -
Предположим, что вы создали эту формулу в ячейке
B2
изSheet1
и хотите, чтобы формула оценивалась в столбцеc
. -
Теперь перейдите на вкладку «Формулы» и выберите «Определить имя». Дайте ему имя
myResult
(или любое другое по вашему выбору) и в разделе «Ссылки на» напишите=evaluate(Sheet1!$B2)
(обратите внимание на$
) -
Наконец, перейдите к
C2
и напишите=myResult
. Потяните вниз и… вуаля!
12
Ben I.
18 Июл 2017 в 00:12
Я тоже искал ответ на ссылки на ячейки в закрытой книге. Вот ссылка на решение (правильную формулу) ниже. Я попробовал это в своем текущем проекте (ссылаясь на одну ячейку и массив ячеек), и он работает без ошибок. Я надеюсь, что это поможет вам.
https://www.extendoffice.com/documents/excel/4226-excel-reference-unopened-file.html
В формуле E:Excel file
— это полный путь к файлу неоткрытой книги, test.xlsx
— имя книги, Sheet2
— имя листа, содержащего значение ячейки, на которое нужно ссылаться. , а A:A,2,1
означает, что в закрытой книге будет ссылка на ячейку A2
. Вы можете изменить их в зависимости от ваших потребностей.
Если вы хотите вручную выбрать рабочий лист для ссылки, используйте эту формулу
=INDEX('E:Excel file[test.xlsx]sheetname'!A:A,2,1)
После применения этой формулы вы получите диалоговое окно «Выбор листа», выберите рабочий лист и нажмите кнопку «ОК». Затем будет немедленно указана ссылка на определенное значение ячейки этого рабочего листа.
4
kvantour
30 Янв 2018 в 21:41
Проблема в том, что ссылка на закрытый файл работает с index( но не с index(indirect(
Мне кажется, что это проблема программирования индексной функции. Я решил это с помощью строки предложения if
C2=sheetname
if(c2=Sheet1,index(sheet1....),if(C2="Sheet2",index(sheet2....
Я сделал это на пяти листах, это длинная формула, но она делает то, что мне нужно.
4
contrapost
25 Фев 2019 в 20:02
Проверьте функцию ИНДЕКС:
=INDEX('C:path[file.xlsm]Sheet1'!A10:B20;1;1)
3
fantaghirocco
3 Авг 2016 в 16:40
Спасибо за отличный вопрос. Я хочу уточнить и подтвердить решение, опубликованное Филиппом. Решение делает следующее:
- Обновляет данные из закрытого файла Excel и
- Делает это «динамически» (хотя и не совсем так — вы увидите)
В своем ответе выше Филипп сказал: «Проблема в том, что ссылка на закрытый файл работает с index( но не с index(indirect(»
Я считаю, что это все еще верно. (Я использую Office 365 здесь в марте 2021 года. Было бы так здорово, если бы Microsoft разрешила INDIRECT и INDEX прекрасно работать вместе с закрытыми файлами!)
Я могу подтвердить, что обходной путь Филиппа действительно работает, говоря практически. С точки зрения пользователя это похоже на то, что Крис, ОП, хочет сделать.
Допустим, вы хотите, чтобы содержимое данной ячейки было взято из Листа1, Листа2 или Листа3, которые находятся в закрытом файле myExcelFile.xlsm. Вы выберете лист, изменив содержимое конкретной ячейки (C13, как в вопросе ОП Криса). Один из способов сделать это — сделать его раскрывающимся списком (используя «Данные» > «Проверка данных» > «Разрешить [Список]»). Список будет иметь следующие имена:
Лист1 Лист2 Лист3
(Это будет обобщено без выпадающего списка. Например, вы можете просто ввести «Лист2» в C13, и появятся соответствующие данные из закрытого файла; если вы затем наберете «Лист3», то данные из этого Вместо этого появится лист . Или у вас может быть столбец с именами листов и следующий столбец над [с приведенной ниже формулой, скорректированной] для вывода из закрытого файла.)
Ячейка, которая будет содержать ссылочные данные из другого закрытого листа (myExcelFile.xlsm), будет иметь:
=IFS(
C13="Sheet1",'C:data[myExcelFile.xlsm]Sheet1'!$A$1,
C13="Sheet2",'C:data[myExcelFile.xlsm]Sheet2'!$A$1,
C13="Sheet3",'C:data[myExcelFile.xlsm]Sheet3'!$A$1
)
Вот и все.
Это вызовет ошибку #REF в первый раз, когда вы сделаете это с закрытым myExcelFile.xlsm, но вы можете перейти в «Данные»> «Запросы и подключения»> «Редактировать ссылки»> «Обновить значения», и ваши значения из закрытого файла должны появиться. (Лично я настроил макрос с кнопкой для обновления вместо поиска в меню.) Волшебство заключается в том, что когда вы делаете «Обновить значения», данные со всех листов в закрытом файле загружаются в текущий Файл Excel — поэтому вам не нужно обновлять каждый раз, когда вы переключаете ссылку на другой лист (например, с Листа2 на Лист3).
Андрей
2
Dharman
27 Мар 2021 в 01:44
=ДВССЫЛ(«‘C:Data[«&A8&»]SheetNAME’!$G9″)
Где A8 содержит myExcelFile.xlsm
А G9 содержит ценные данные вашей исходной книги.
0
Allan
8 Сен 2016 в 00:33
В порядке,
Вот вам метод динозавра в Office 2010.
Напишите полный адрес, который вы хотите, используя конкатенацию (метод объединения текста «&»).
Сделайте это для всех адресов, которые вам нужны. Это должно выглядеть так:
=»=»&»‘ПОЛНЫЙ СЕТЕВОЙ АДРЕС, включая [имя электронной таблицы]»&W3&»‘!$w4″
W3 — это динамическая ссылка на лист, который я использую, а W4 — это ячейка, которую я хочу получить из листа.
Как только вы это сделаете, запустите сеанс записи макроса. Скопируйте ячейку и вставьте ее в другую. Я вставил его в объединенную ячейку, и это дало мне классическую ошибку «Тот же размер». Но одна вещь, которую он сделал, это вставила полученный текст из моей конкатенации (включая этот дополнительный «=»).
Скопируйте столько, сколько вы сделали это для. Затем зайдите в каждую вставленную ячейку, выберите текст и просто нажмите Enter. Он обновляет его до активной прямой ссылки.
Как только вы закончите, поместите курсор в удобное место и остановите макрос. Назначьте его кнопке, и все готово.
Это немного PITA, чтобы сделать это в первый раз, но как только вы это сделаете, вы просто подгоните квадратный колышек к этому проклятому круглому отверстию.
0
Guest guy
23 Мар 2017 в 15:37
Кажется, это работает с закрытым файлом: добавьте сводную таблицу (строки, табличный макет, без промежуточных итогов, без общих итогов) источника в текущую книгу, затем ссылайтесь на все, что вы хотите, из этой сводной таблицы, ДВССЫЛ, ПРОСМОТР,…
0
Anh
19 Фев 2021 в 22:51
Если вы знаете номер листа, на который хотите сослаться, вы можете использовать функцию ниже, чтобы узнать имя. Чем вы можете использовать его в НЕПРЯМОЙ функции.
Public Function GETSHEETNAME(address As String, Optional SheetNumber As Integer = 1) As String
Set WS = GetObject(address).Worksheets
GETSHEETNAME = WS(SheetNumber).Name
End Function
Это решение не требует, чтобы указанная рабочая книга была открыта — Excel откроет ее сам (но она будет скрыта).
-1
Stefan
28 Сен 2016 в 12:08
Я был разочарован, поэтому я сделал следующий обходной путь:
- Я создал свои НЕПРЯМЫЕ команды и сохранил их сразу за пределами желаемого диапазона. Конечно, я получаю ошибки, когда исходная книга закрыта, но они загораются, когда она открыта.
- Поэтому я временно открываю исходную книгу.
- Затем я создал макрос, который копирует формулы ДВССЫЛ из-за пределов диапазона и вставляет их внутрь диапазона. Все ячейки заполнены правильными значениями.
- Затем макрос копирует значения диапазона в диапазон поверх себя. Это удаляет формулы, но сохраняет их значения.
- Затем я закрываю исходную книгу. Мои значения остаются неизменными там, где я хочу, а мои НЕПРЯМЫЕ формулы остаются за пределами желаемого диапазона на случай, если я захочу обновить их, повторив процедуру!
Этот обходной путь избавляет меня от ошибки косвенных формул при закрытии исходной книги, а самое главное экономит много времени на пересчетах!
Надеюсь, это сработает и для вас!
-1
NikoSilver
13 Апр 2021 в 02:19
По крайней мере, в Excel 2016 вы можете использовать ДВССЫЛ с указанием полного пути; вся ссылка (включая имя листа) должна быть заключена в символы '
.
Итак, это должно сработать для вас:
= INDIRECT("'C:data[myExcelFile.xlsm]" & C13 & "'!$A$1")
Обратите внимание на закрывающий '
в последней строке (т.е. '!$A$1
в окружении ""
)
1
Stephen Rauch
27 Июл 2018 в 04:23