Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процедурные типы, Как реализовать подмену имени подпрограм 
V
    Опции темы
НеуФазендник
Дата 23.7.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



Добрый день.
Есть старая добрая потребность в использовании процедурного типа данных.
Каким образом это реализуется в VBA?
Конкретный пример:
Есть процедуры А1,A2...Аn  с идентичными наборами аргументов.
Нужно реализовать некоторую процедуру "С" с тем же набором аргументов, которая вызывается, к примеру, событием Worcsheets_Cange() и фактически является вызовом одной из "А" процедур, в зависимости от содержимого измененного листа.
Мне не приходит в голову ничего, кроме оператора Case.
А прямое присвоение имен процедур с целью подмены одной на другую (нечто вроде динамического связывания имени с конкретной реализацией) возможно?

PM MAIL   Вверх
Izuver
Дата 23.7.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 352
Регистрация: 13.6.2006
Где: Омск

Репутация: 2
Всего: 2



Че так сложно, здесь есть попроще решение 
PM MAIL ICQ   Вверх
ИгнатьевАлексей
Дата 24.7.2006, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 369
Регистрация: 18.11.2005

Репутация: 2
Всего: 3



НеуФазендник. Извини за дерзость! 
А если у тебя есть такой тип данных, а значит есть столько экземпляров этого типа, сколько самих процедур, не так ли? Резве в этом случае можно обойтись без операторов типа IF-CASE для выбора необходимой исходя из некоего условия?  smile 
Просто интересно. smile   


--------------------
Vingrad - FOREVER !!! 

"Как вы яхту назовете - так она и поплывет!" 
 Капитан Врунгель 
PM MAIL   Вверх
Staruha
Дата 24.7.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 13
Всего: 27



Массив ,ф-я choose, switch 

Это сообщение отредактировал(а) Staruha - 24.7.2006, 21:16


--------------------
Возмездие настигнет
PM MAIL   Вверх
likhobory
Дата 25.7.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 466
Регистрация: 17.5.2005
Где: Москва

Репутация: 10
Всего: 20



Цитата(Staruha @  24.7.2006,  22:02 Найти цитируемый пост)
choose, switch

+ IIF
ими лучше лишний раз не злоупотреблять, работают достаточно медленно, поскольку при выполнении кода (особенность VBA) проверяются все указанные варианты (исключение - формы и отчеты в Access)
     

Это сообщение отредактировал(а) likhobory - 25.7.2006, 11:19


--------------------
PM MAIL   Вверх
НеуФазендник
Дата 25.7.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



Цитата(Izuver @  23.7.2006,  19:43 Найти цитируемый пост)
Че так сложно, здесь есть попроще решение  


Извиняюсь, не понял - куда ссылка-то смотрит?
Она меня в эту же тему назад возвертает smile 
PM MAIL   Вверх
НеуФазендник
Дата 25.7.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



Цитата(ИгнатьевАлексей @  24.7.2006,  08:20 Найти цитируемый пост)
НеуФазендник. Извини за дерзость! 
А если у тебя есть такой тип данных, а значит есть столько экземпляров этого типа, сколько самих процедур, не так ли? 


Ну, вроде как не так.(Или, может, я не понял сути ответа)
Тип нужен лишь, чтобы обьявить одну единственную переменную ЁЁ этого типа и использовать ее в обработчике приблизительно так: 
Код

Private Sub Worksheet_Change(ByVal Target As Range)
call ЁЁ
End Sub
 А значения для этой переменной (собственно имена процедур)присваиваются в других подпрограммах. И фактически каждый раз вызываются разные процедуры. 
PM MAIL   Вверх
cardinal
Дата 25.7.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



НеуФазендник, посмотри тут:
http://forum.vingrad.ru/index.php?showtopic=16767 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
НеуФазендник
Дата 25.7.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



Цитата(ИгнатьевАлексей @  24.7.2006,  08:20 Найти цитируемый пост)

Резве в этом случае можно обойтись без операторов типа IF-CASE для выбора необходимой исходя из некоего условия?   
Просто интересно.     

Интерес конечно совсем не детский.
Но обойтись ... можно.
Рабочая книга состоит из множества рабочих листов. Они взаимодействуют между собой оставляя некоторые параметры в Static переменных. Обычно по окончании обработки очередной подпрограммы (их много) уже становится ясно, какая процедура должна быть  вызвана при последующих изменениях данных на некоторых листах. Но запускать ее пока рановато. Она отработает по некоторому событию листа. И тут вроде как не нужно никакого IF, Case, IIF, Choose, Switch и подобных. Логика привела к определенной подпрограмме. Осталось запомнить ее имя и потом выполнить.
Почему не хочу использовать ранее упомянутые переключатели:
Листов, которые снабжены идентичными обработчиками события Worksheet_Change несколько. Писать в каждом из них идентичный код с несколькими десятками условий - нехорошо. Делать промежуточную подпрограмму, которая вызывается обработчиком события каждого листа? Пока так и зделал. Но корявенько это. Вызывать сначала одну подпрограмму, чтобы затем вызвать другую, если имя другой в принципе известно уже при вызове первой.
В Паскале не случайно ведь придумали процедурные типы. Есть по-моему в этом смысл.

 

Это сообщение отредактировал(а) НеуФазендник - 25.7.2006, 20:02
PM MAIL   Вверх
НеуФазендник
Дата 25.7.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



Цитата(likhobory  @  25.7.2006)
choose, switch
+ IIF
ими лучше лишний раз не злоупотреблять, работают достаточно медленно, поскольку при выполнении кода (особенность VBA) проверяются все указанные варианты (исключение - формы и отчеты в Access)

Кстати, да. Есть и такое дело.
Спасибо за дополнение.
Хотя для моих подпрограмм не критично, это выполняется не в цикле.

Добавлено @ 20:34 
Цитата(cardinal @ 25.7.2006,  18:58)
НеуФазендник, посмотри тут:
http://forum.vingrad.ru/index.php?showtopic=16767

Спасибо за ссылку, Cardinal.
Как раз то, что доктор прописал.
Буду двигаться вперед. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.