Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 08.05.2008, 21:13   #1
ALink
 
Регистрация: 08.05.2008
Сообщений: 4
По умолчанию Из какой ячейки вызвана функция?

Вопрос опытным товарищам.

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

Может ли VBA код функции «узнать», из какой ячейки вызвана функция?
ActiveCell не годится. Активной в момент вычисления функции вполне может быть совершенно иная ячейка.



Function AAA(ByVal X as Double) As Double

Часть 1.
Сначала вычисляется возвращаемое значение:
AAA = вычисляемый результат (число)

Часть 2.
Далее выполняются некоторые полезные, но сложные
и с негарантированным результатом действия.
Чтобы быстро визуально определять их успешность,
Было бы неплохо менять фон ячейки, из которой
функция вызвана:
Если все завершилось хорошо,
то меняем фон ячейки на желтый,
А если нет,
то делаем его розовым.
End Function

Как получить ссылку на ячейку?


Буду очень признателен за пример решения.

ALink
ALink вне форума
Старый 09.05.2008, 08:22   #2
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Стрелка Далеко ходить не надо

VBE: набрать Caller и сразу нажать F1.
А можно и не сразу, но тогда придётся на Caller курсор поставить.
дмидми вне форума
Старый 09.05.2008, 12:20   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Думаю ActiveCell подойдет.
Извините, не внимательно прочитал задачу...а убить ответ не могу(((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 09.05.2008 в 12:24.
IgorGO вне форума
Старый 12.05.2008, 00:40   #4
ALink
 
Регистрация: 08.05.2008
Сообщений: 4
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Думаю ActiveCell подойдет.
Извините, не внимательно прочитал задачу...а убить ответ не могу(((

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


И возникает вопрос:
А может ли вообще функция в момент вычисления получить информацию,
из какой именно ячейки ее вызвали, или Excel API это скрывает?


Каких-то более или менее очевидных подходов не вижу
Увы...

ALink
ALink вне форума
Старый 12.05.2008, 07:16   #5
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Смех Имеющий глаза - не видит?

Цитата:
Сообщение от ALink Посмотреть сообщение
Каких-то более или менее очевидных подходов не вижу
Ваш браузер вредительски скрывает от Вас сообщение #2?
Или у Вас на клаве выдрана с корнем клавиша F1?
Или Excel без хэлпов?
Или хэлпы по-китайски?
дмидми вне форума
Старый 12.05.2008, 22:10   #6
ALink
 
Регистрация: 08.05.2008
Сообщений: 4
По умолчанию

Цитата:
Сообщение от дмидми Посмотреть сообщение
Ваш браузер вредительски скрывает от Вас сообщение #2?
Или у Вас на клаве выдрана с корнем клавиша F1?
Или Excel без хэлпов?
Или хэлпы по-китайски?
Уважаемый “дмидми”,

Я, конечно же, прочитал ваш пост #2.
Однако смысл его остался мне совершенно неясен,
потому и остался он без комментариев.

Речь ведь идет, фактически, об условном форматировании
ячейки с результатом работы пользовательской функции,
форматировании, которое управляется самой этой функцией.

Чтобы такая затея сработала, функция должна каким-то образом
выяснить адрес ячейки, из которой ее на этот раз вызвали.
Предполагается, что на рабочем листе имеется несколько десятков ячеек
с одной и той же функцией. И каждая должна быть отформатирована
независимо от других. Программно. Внутренняя логика
принятия решения о характере форматирования сложна и
не укладывается в штатные средства пользователя.

Вы можете пояснить вашу идею про VBE, Caller и клавишу F1
в контексте обсуждаемой задачи?
А едкими репликами прошу не беспокоить. Лишнее это.

ALink
ALink вне форума
Старый 12.05.2008, 22:57   #7
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Печаль И как же я теперь жить буду, непрокомментированный?!.

(Цитируется с незначительными сокращениями.)
Цитата:
Сообщение от ALink Посмотреть сообщение
Я прочитал пост #2. Однако смысл его остался мне совершенно неясен,
потому и остался он без комментариев.
А я-то по простоте душевной считал, что в таких случаях не пост комментируют, а вопросы задают... Век живи...
Цитата:
Сообщение от ALink Посмотреть сообщение
Вы можете пояснить вашу идею про VBE, Caller и клавишу F1
в контексте обсуждаемой задачи?
Ну, наконец-то речь не мальчика, но мужа. Поясняю.

VBE (Visual Basic Editor) - это то, при помощи чего Вам предстоит писать и отлаживать Вашу функцию и что вызывается к жизни командой Excel "Сервис -- Макрос >> Редактор Visual Basic".

VBE снабжён контекстно-чувствительной справкой. В частности, это даёт возможность в любом месте любого модуля набрать некоторое ключевое слово (или поместить курсор на уже написанное) и, нажав клавишу F1, получить для него справку (если, конечно, это слово известно справочной системе первого уровня).

Caller - то слово, которое, по моему скромному мнению, является ключом к решению заявленной Вами проблемы ("как определить ячейку, из которой вызвана функция").

Итак, войти в VBE, набрать в каком-нибудь модуле (можно создать новый) слово Caller и нажать F1. Если при изучении справки (и тех ссылок и примеров, которые к справке частенько прилагаются) возникнут вопросы - очень может быть, что и в них Вам здесь помогут разобраться.
Цитата:
Сообщение от ALink Посмотреть сообщение
А едкими репликами прошу не беспокоить.
Вы вольны не читать моих постов.


P.S. "Вы принимаете себя слишком всерьёз."
("Искусство быть человеком", Правило пятое.)
дмидми вне форума
Старый 13.05.2008, 00:59   #8
ALink
 
Регистрация: 08.05.2008
Сообщений: 4
По умолчанию

Цитата:
Сообщение от дмидми Посмотреть сообщение
(Цитируется с сокращениями.)Caller - то слово, которое, по моему скромному мнению, является ключом к решению заявленной Вами проблемы ("как определить ячейку, из которой вызвана функция").
Решение действительно очень простое.
Достаточно обратиться к свойству Caller объекта Application.
В обсуждаемой выше ситуации результатом выполнения кода

Dim R As Variant
R = Application.Caller.Address

будет адрес ячейки, из которой осуществлен вызов кода.


«дмидми», спасибо за наводку.
Тема закрыта.


ALink
ALink вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция Janette Помощь студентам 1 29.04.2008 20:10
Как разделить число и текст в одной ячейки на две ячейки. neboskreb Microsoft Office Excel 2 15.04.2008 19:39
как присвоить значение ячейки R1C1 из 1.xls, допустим какой-нибудь любой ячейке из 2.xls ? diabloskrk Microsoft Office Excel 3 08.10.2007 12:27
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50
чем может быть вызвана эта ошибка doncova1 Общие вопросы Delphi 5 01.03.2007 11:15