Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
21.05.2024, 11:12:34

Войти
Добавляйтесь в нашу группу ВКонтакте - будьте в курсе всех новых событий сайта, узнавайте первым обо всех акциях и новых статьях!
33 266 Сообщений в 5 461 Тем от 6 769 Пользователей
Последний пользователь: Fortuna
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Проблема с модулем класса
Страниц: [1]   Вниз
Печать
Автор Тема: Проблема с модулем класса  (Прочитано 2758 раз)
0 Пользователей и 1 Гость смотрят эту тему.
A-Michael
Старожил
****

Репутация: +16/-0
Офлайн Офлайн

Сообщений: 495



Просмотр профиля E-mail
« : 16.02.2023, 12:33:30 »

Здравствуйте, уважаемые знатоки VBA.
Давненько не захаживал на форум, но вот случилась такая оказия: написал модуль класса (2 штуки), один работает на "УРА", а вот со вторым проблема.
Вот первый:
Код: (vb)
Option Explicit

' Событие клик на форме UF_VYBM
Public WithEvents Ch_Labels As MSForms.Label

Private Sub Ch_Labels_Click()

' Вызов программы SVODO с параметрами номер метки
If PS_UFN = "UF_VybM" Then SvodO Val(Right(Ch_Labels.Name, 2))

End Sub

Вот его вызов:
Код: (vb)
Option Explicit

Private Sub UserForm_Initialize()

Dim C_Lbl As Control

For Each C_Lbl In Controls
' Перебор контролов в форме UF_VYBM
    If C_Lbl.TabIndex > 0 And C_Lbl.TabIndex < 35 Then Set PAO_Lbls(C_Lbl.TabIndex).Ch_Labels = Me.Controls(C_Lbl.Name)
Next

End Sub

В этом случае работаю с Label`s
А вот второй, который не желает работать:
Код: (vb)
Option Explicit

' Событие клик на форме UF_PRO
Public WithEvents Ch_Controls As MSForms.Control

Private Sub Ch_Controls_Exit(ByVal Cancel As MSForms.ReturnBoolean)

' Вызов программы CTRLCLK с параметром имя контрола
If PS_UFN = "UF_PRO" Then CtrlClk Ch_Controls.Name

End Sub

И, соответственно, его вызов:
Код: (vb)
Option Explicit

Private Sub UserForm_Initialize()

Dim C_Ctrl As Control

For Each C_Ctrl In Controls
' Перебор контролов в форме UF_PRO
    Set PAO_Ctrl(C_Ctrl.TabIndex).Ch_Controls = Me.Controls(C_Ctrl.Name)
Next

End Sub

В этом случае пытаюсь работать со всеми контролами.
Объявлены оба массива как PUBLIC, в отдельном модуле:
Код: (vb)
Public PAO_Lbls(1 To 34) As New CLSM_Labels     ' Массив LABEL`ов
Public PAO_Ctrl(1 To 40) As New CLSM_Controls   ' Массив CONTROL`ов

Где накосячил - никак не пойму.
Очень прошу ткнуть меня в нужном направлении, дабы понять кто, где, кого...  Подмигивающий
Записан

Я - не волшебник, я ещё только учусь...
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 838



Просмотр профиля WWW
« Ответ #1 : 16.02.2023, 12:59:10 »

который не желает работать
да уж, конкретно отвыкли от форума Улыбка Как именно не работает-то? На какой строке спотыкается?
Сразу могу сказать одно: C_Ctrl.TabIndex - если будет меньше одного или больше 40 - Вашими словами "не будет работать".
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
A-Michael
Старожил
****

Репутация: +16/-0
Офлайн Офлайн

Сообщений: 495



Просмотр профиля E-mail
« Ответ #2 : 17.02.2023, 07:33:26 »

М-дя, виноват, исправлюсь Смеющийся
Вот строка, где возникает ошибка:
Код: (vb)
Set PAO_Ctrl(C_Ctrl.TabIndex).Ch_Controls = Me.Controls(C_Ctrl.Name)

А вот, собственно, сообщение об ошибке:
Записан

Я - не волшебник, я ещё только учусь...
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 838



Просмотр профиля WWW
« Ответ #3 : 17.02.2023, 08:57:12 »

Я ожидал увидеть эту ошибку Улыбка
Невозможно отслеживать события для типа Control. Это общий тип и подобные обработки не поддерживаются. Например, у того же типа Label нет события Exit - следовательно его невозможно обработать. А Вы пытаетесь это все запихнуть. Т.е. Вы пытаетесь назначить отслеживание события всем контролам, даже если они его не поддерживают. Так себе затея.
Делайте обработку событий для каждого типа контрола - тогда будет работать, к тому же будет куда удобнее в отладке.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
A-Michael
Старожил
****

Репутация: +16/-0
Офлайн Офлайн

Сообщений: 495



Просмотр профиля E-mail
« Ответ #4 : 17.02.2023, 09:50:12 »

Спасибо всем, проблема, похоже, решена. Мне ведь, собственно, нужны были только 2 комбобокса...
Вот сам модуль класса:
Код: (vb)
Option Explicit

' Событие клик на форме UF_PRO
Public WithEvents Ch_Controls As MSForms.ComboBox

Private Sub Ch_Controls_Click()

' Вызов программы CTRLCLK с параметром имя контрола
If PS_UFN = "UF_PRO" Then CtrlClk Ch_Controls.Name

End Sub

И вызов:
Код: (vb)
Option Explicit

Private Sub UserForm_Initialize()

Dim N_CntC As Integer
Dim C_Ctrl As Control

N_CntC = 1

For Each C_Ctrl In Controls
' Перебор контролов в форме UF_PRO
    If Left(C_Ctrl.Name, 3) = "CmB" Then
       Set PAO_Ctrl(N_CntC).Ch_Controls = Me.Controls(C_Ctrl.Name)
       N_CntC = N_CntC + 1
    End If
Next

End Sub

И объявление массивов:
Код: (vb)
Public PAO_Lbls(1 To 34) As New CLSM_Labels     ' Массив LABEL`ов
Public PAO_Ctrl(1 To 2) As New CLSM_Controls    ' Массив CONTROL`ов

Ещё раз спасибо за участие. И, попутно, личный вопрос к Дмитрию Щербакову: "Как Вы думаете, что повлечёт за собой импортозамещение в области ПО? Наша контора собирается переходить на Astra Linux и Р7 Офис. Я с ним немного ознакомился и, честно говоря, в полном недоумении. Там макросами, можно сказать, и не пахнет. Какое-то жалкое подобие левой руки убожество на JavaScript, с минимальными функциональными возможностями. Примерно в пределах 2 + 2 =... А ведь на компах крутится десяток моих макросов, практически все с пользовательскими формами. Ума не приложу, что делать...
Записан

Я - не волшебник, я ещё только учусь...
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru