![]() |
|
Модераторы: mihanik |
![]()
|
|
| НеуФазендник |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Добрый день.
Есть старая добрая потребность в использовании процедурного типа данных. Каким образом это реализуется в VBA? Конкретный пример: Есть процедуры А1,A2...Аn с идентичными наборами аргументов. Нужно реализовать некоторую процедуру "С" с тем же набором аргументов, которая вызывается, к примеру, событием Worcsheets_Cange() и фактически является вызовом одной из "А" процедур, в зависимости от содержимого измененного листа. Мне не приходит в голову ничего, кроме оператора Case. А прямое присвоение имен процедур с целью подмены одной на другую (нечто вроде динамического связывания имени с конкретной реализацией) возможно? |
|||
|
||||
| Izuver |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 352 Регистрация: 13.6.2006 Где: Омск Репутация: 2 Всего: 2 |
Че так сложно, здесь есть попроще решение
|
|||
|
||||
| ИгнатьевАлексей |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 369 Регистрация: 18.11.2005 Репутация: 2 Всего: 3 |
НеуФазендник. Извини за дерзость!
А если у тебя есть такой тип данных, а значит есть столько экземпляров этого типа, сколько самих процедур, не так ли? Резве в этом случае можно обойтись без операторов типа IF-CASE для выбора необходимой исходя из некоего условия? Просто интересно. -------------------- Vingrad - FOREVER !!! "Как вы яхту назовете - так она и поплывет!" Капитан Врунгель |
|||
|
||||
| Staruha |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1292 Регистрация: 1.2.2004 Где: Казань Репутация: 13 Всего: 27 |
Массив ,ф-я choose, switch
Это сообщение отредактировал(а) Staruha - 24.7.2006, 21:16 -------------------- Возмездие настигнет |
|||
|
||||
| likhobory |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 466 Регистрация: 17.5.2005 Где: Москва Репутация: 10 Всего: 20 |
+ IIF ими лучше лишний раз не злоупотреблять, работают достаточно медленно, поскольку при выполнении кода (особенность VBA) проверяются все указанные варианты (исключение - формы и отчеты в Access) Это сообщение отредактировал(а) likhobory - 25.7.2006, 11:19 |
|||
|
||||
| НеуФазендник |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
||||
|
||||
| НеуФазендник |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Ну, вроде как не так.(Или, может, я не понял сути ответа) Тип нужен лишь, чтобы обьявить одну единственную переменную ЁЁ этого типа и использовать ее в обработчике приблизительно так:
|
||||
|
|||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: нет Всего: 99 |
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| НеуФазендник |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Интерес конечно совсем не детский. Но обойтись ... можно. Рабочая книга состоит из множества рабочих листов. Они взаимодействуют между собой оставляя некоторые параметры в Static переменных. Обычно по окончании обработки очередной подпрограммы (их много) уже становится ясно, какая процедура должна быть вызвана при последующих изменениях данных на некоторых листах. Но запускать ее пока рановато. Она отработает по некоторому событию листа. И тут вроде как не нужно никакого IF, Case, IIF, Choose, Switch и подобных. Логика привела к определенной подпрограмме. Осталось запомнить ее имя и потом выполнить. Почему не хочу использовать ранее упомянутые переключатели: Листов, которые снабжены идентичными обработчиками события Worksheet_Change несколько. Писать в каждом из них идентичный код с несколькими десятками условий - нехорошо. Делать промежуточную подпрограмму, которая вызывается обработчиком события каждого листа? Пока так и зделал. Но корявенько это. Вызывать сначала одну подпрограмму, чтобы затем вызвать другую, если имя другой в принципе известно уже при вызове первой. В Паскале не случайно ведь придумали процедурные типы. Есть по-моему в этом смысл. Это сообщение отредактировал(а) НеуФазендник - 25.7.2006, 20:02 |
|||
|
||||
| НеуФазендник |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Кстати, да. Есть и такое дело. Спасибо за дополнение. Хотя для моих подпрограмм не критично, это выполняется не в цикле. Добавлено @ 20:34
Спасибо за ссылку, Cardinal. Как раз то, что доктор прописал. Буду двигаться вперед. |
||||
|
|||||
![]()
|
| Правила форума "Программирование, связанное с MS Office" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще!
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование, связанное с MS Office | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |