Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

VBA Excell. Как узнать внутри функции адрес ячейки из которой функция вызвана?

Аноним
VBA Excell. Как узнать внутри функции адрес ячейки из которой функция вызвана?
Подробнее. Аргументы функции находятся в соседнем столбце начинась за 10 строк до "строки вызова функции" и до "строки вызова функции" необходимо произвести с ними некоторые "сложные" действия. Необходимо знать "строку вызова функции".
13K
01 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
Цитата:
Originally posted by Guest
VBA Excell. Как узнать внутри функции адрес ячейки из которой функция вызвана?
Подробнее. Аргументы функции находятся в соседнем столбце начинась за 10 строк до "строки вызова функции" и до "строки вызова функции" необходимо произвести с ними некоторые "сложные" действия. Необходимо знать "строку вызова функции".



спустя 3 года :D :

Function addr(r As Variant)
addr = r.DirectDependents.Address(ReferenceStyle:=xlR1C1)
End Function
r - любой аргумент из этой же строки

13K
02 сентября 2005 года
sergeyvg
1 / / 02.09.2005
Function My_Func()
MsgBox Application.Caller.Address
My_Func = 1
End Function
275
02 сентября 2005 года
pashulka
985 / / 19.09.2004
Ну раз пошла такая пьянка, то и я внесу свою лепту :

 
Код:
Function CellAddress()
CellAddress = Application.ThisCell.Address
End Function


Примечание : Свойство ThisCell появилось только в MS Excel XP, так что рекомендую обратить внимание на второй вариант, тем более, что именно его я иногда использовал.
405
02 сентября 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by pashulka
Ну раз пошла такая пьянка, то и я внесу свою лепту :

 
Код:
Function CellAddress()
CellAddress = Application.ThisCell.Address
End Function


Примечание : Свойство ThisCell появилось только в MS Excel XP, так что рекомендую обратить внимание на второй вариант, тем более, что именно его я иногда использовал.


pashulka, а второй вариант - это какой? Тот, который привёл sergeyvg, или тот, который привёл Uncle_AL?

275
02 сентября 2005 года
pashulka
985 / / 19.09.2004
Второй - это вариант sergeyvg, так как Uncle_AL опубликовал свою версию решения этой задачи первым.
13K
02 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
еще вопрсик, а у самого EXCELL есть функция (или переменная) чтобы узнать имя книги, аналог ThisWorkbook.Name в VBA, для передачи в качестве параметра в функцию ?
275
02 сентября 2005 года
pashulka
985 / / 19.09.2004
Стандартной функции рабочего листа, которая бы возвращала имя рабочей книги нет ... Однако, использовав стандартную функцию рабочего листа =ЯЧЕЙКА() можно написать такую формулу :

=ПСТР(ЯЧЕЙКА("ИмяФайла";A1);ПОИСК("[";ЯЧЕЙКА("ИмяФайла";A1))+1;ПОИСК("]";ЯЧЕЙКА("ИмяФайла";A1))-ПОИСК("[";ЯЧЕЙКА("ИмяФайла";A1))-1)
=ПСТР(ЯЧЕЙКА("FileName";A1);ПОИСК("[";ЯЧЕЙКА("FileName";A1))+1;ПОИСК("]";ЯЧЕЙКА("FileName";A1))-ПОИСК("[";ЯЧЕЙКА("FileName";A1))-1)

Примечание :
- В вышеопубликованной формуле можно вместо ПОИСК() использовать НАЙТИ()
- Если использовать именованную формулу или дополнительную ячейку, то формулу можно серьёзно сократить.
- Только, что созданная и несохранённая рабочая книга не имеет полного имени и следовательно формула не будет возвращать корректный результат.
13K
02 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
Спасибо, значит таки CELL, лениво хелп прочитал,
в английском =MID(CELL("filename");SEARCH("[";CELL("filename"))+1;SEARCH("]";CELL("filename"))-SEARCH("[";CELL("filename"))-1) - работает

вот и именнованная =FILENAME нарисовалась :)
275
03 сентября 2005 года
pashulka
985 / / 19.09.2004
Что касается именованной формулы, то я намекал на нижеприведённый вариант, где ИмяП - это именованная формула : =ЯЧЕЙКА("ИмяФайла")

=ПСТР(ИмяП;ПОИСК("[";ИмяП)+1;ПОИСК("]";ИмяП)-ПОИСК("[";ИмяП)-1)

Комментарий : Довольно часто в различных формулах используется одна и таже составляющая. Именно в таких случаях предложенный мною вариант будет наиболее оптимальным.
В Вашем конкретном случае, в роли именованной формулы, конечно может выступать вся формула целиком, но лично мне нравится именно мой вариант, так как используя именно его, можно полученить и другие составляющие, например имя рабочего листа (правда для этого именованную формулу лучше всего немного изменить и добавить ссылку на ячейку, так как это сделано в самом первом примере)
275
03 сентября 2005 года
pashulka
985 / / 19.09.2004
Предлагаю вернуться к вопросу об именах и создать именованную формулу, например ФайлИмя, использовав любой из трёх нижеопубликованных вариантов :

=ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(16)
=ПОЛУЧИТЬ.ДОКУМЕНТ(88)
=ПОЛУЧИТЬ.ЯЧЕЙКУ(66)

Затем в любой ячейке рабочего листа ввести =ФайлИмя и забыть о решении этого вопроса с использованием VBA …
13K
03 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
вид формулы действительно зависит от конкретной задачи, мне нужно было имя файла, поэтому ссылка лишняя, если необходимо узнать имя листа, то это другое дело, но на именованную ячейку ссылаться не хочу, поскольку она может быть, а может и нет, надежнее R1C1, эта всегда будет :) ;
вероятнее всего понадобится ссылка на лист с базой данных, но у меня на таких листах именованные ячейки не водятся, это роскошь для листов с исходными и расчетных листов, кстати и на последних именованные диапазоны давно вымерли;

а вообще приятно встретить людей серьезно понимающих EXCELL :)
13K
03 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
Цитата:
Originally posted by pashulka
...

=ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(16)
=ПОЛУЧИТЬ.ДОКУМЕНТ(88)
=ПОЛУЧИТЬ.ЯЧЕЙКУ(66)



можно ли привести английские аналоги ?

275
03 сентября 2005 года
pashulka
985 / / 19.09.2004
Uncle_AL, Дело в том, что когда я предлагаю то или иное решение, то ориентируюсь также и на людей, которые могут читать этот топик в дальнейшем, поэтому и предлагаю использовать всевозможные подварианты, нюансы и т.п. Естественно, что право окончательного и безусловного выбора всегда остаётся за Вами и другими читателями топика.

=GET.WORKBOOK(16)
=GET.DOCUMENT(88)
=GET.CELL(66)
13K
03 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
Цитата:
Originally posted by pashulka

=GET.WORKBOOK(16)
=GET.DOCUMENT(88)
=GET.CELL(66)


можно ли пояснить,
в Вашей версии имеются такие функции ?
у себя (2003) не нахожу

275
04 сентября 2005 года
pashulka
985 / / 19.09.2004
Да у меня в MS Excel 97, 2000 они есть, впрочем они должны быть и у Вас, но вызвать их можно только используя макролисты или имена.
Впрочем, возможно что последней возможности в MS Excel XP, 2003 уже и нет ...
На всякий случай, посмотрите небольшой пример :
13K
05 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
нет, не работает, это все какого-то одноразового действия, 1-й раз отрабатывает, потом, если поменять имя файла, значение имени уже не меняется;
вероятно EXCELL записывет значения таких имен на момент создания или модификации (если зайти в окно определения имен и активировать путь) и больше не меняет (считаются константой);
самое интересное, что про GET в хелпе нет ни слова, а хорошая функция, если бы еще на обычном листе работала.
275
05 сентября 2005 года
pashulka
985 / / 19.09.2004
В ячейке отображается результат, который возвращает именованная формула на момент ввода. Если Вы хотите изменить результат, то можно выделить ячейку, которая содержит именованную формулу и нажать клавиши F2 и ENTER.
Возможно в Вашем случае, гораздо проще остановить свой выбор на первом варианте, с использованием стандартной функции рабочего листа =ЯЧЕЙКА()/CELL()
275
05 сентября 2005 года
pashulka
985 / / 19.09.2004
Uncle_Al
Попробуйте, вместо =GET.CELL(66) использовать =GET.CELL(66;$A$1) ... это решит проблему переименования рабочей книги, прада только до тех пор, пока Вы не удалите рабочий лист, ссылка на который будет наличествовать в именованной формуле.
13K
05 сентября 2005 года
Uncle_AL
12 / / 31.08.2005
Цитата:
Originally posted by pashulka
Возможно в Вашем случае, гораздо проще остановить свой выбор на первом варианте, с использованием стандартной функции рабочего листа =ЯЧЕЙКА()/CELL()


наверное так,
файлы бывают достаточно большие, надежность в этом случае играет важную роль...
странно, но =GET.CELL(66;$A$1) перестает динамически работать, если переименовать лист, не помогает ни ввод нового имени, ни обновление (изменение) адреса

275
05 сентября 2005 года
pashulka
985 / / 19.09.2004
Действительно странно, потому что при переименовании рабочего листа ссылка на него в именованной формуле меняется автоматически и в этом нет ничего странного, так как после ввода =GET.CELL(66;$A$1) формула принимает вид =GET.CELL(66;Sheet1!$A$1), где Sheet1 - это имя активного листа
P.S. Только для обладателей руссифицированной версии MS Excel вместо =GET.CELL() нужно использовать =ПОЛУЧИТЬ.ЯЧЕЙКУ()
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог