Новости:

Форум на данный момент в стадии обновления. Если у Вас возникли проблемы со входом в свою учетную запись - просьба писать на email: info@excel-vba.ru

Главное меню

Проблема с модулем класса

Автор A-Michael, 16.02.2023, 12:33:30

« назад - далее »

A-Michael

Здравствуйте, уважаемые знатоки VBA.
Давненько не захаживал на форум, но вот случилась такая оказия: написал модуль класса (2 штуки), один работает на "УРА", а вот со вторым проблема.
Вот первый:
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

Вот его вызов:
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
А вот второй, который не желает работать:
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

И, соответственно, его вызов:
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, в отдельном модуле:
Public PAO_Lbls(1 To 34) As New CLSM_Labels     ' Массив LABEL`ов
Public PAO_Ctrl(1 To 40) As New CLSM_Controls   ' Массив CONTROL`ов

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

Дмитрий Щербаков(The_Prist)

Цитата: A-Michael от 16.02.2023, 12:33:30который не желает работать
да уж, конкретно отвыкли от форума :) Как именно не работает-то? На какой строке спотыкается?
Сразу могу сказать одно: C_Ctrl.TabIndex - если будет меньше одного или больше 40 - Вашими словами "не будет работать".
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

A-Michael

М-дя, виноват, исправлюсь ;-D
Вот строка, где возникает ошибка:
Set PAO_Ctrl(C_Ctrl.TabIndex).Ch_Controls = Me.Controls(C_Ctrl.Name)
А вот, собственно, сообщение об ошибке:
Я - не волшебник, я ещё только учусь...

Дмитрий Щербаков(The_Prist)

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

A-Michael

Спасибо всем, проблема, похоже, решена. Мне ведь, собственно, нужны были только 2 комбобокса...
Вот сам модуль класса:
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

И вызов:
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

И объявление массивов:
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 =... А ведь на компах крутится десяток моих макросов, практически все с пользовательскими формами. Ума не приложу, что делать...
Я - не волшебник, я ещё только учусь...

Яндекс.Метрика Рейтинг@Mail.ru