Событие изменения для нескольких флажков // Excel VBA // WithEvents // ClassModule - PullRequest
0 голосов
/ 13 марта 2020

У меня есть 25 текстовых полей, названных в пользовательской форме следующим образом

Имя: id_ [X] _box 1 <= x <= 25 </p>

Я пытаюсь написать программу, которая можно зарегистрировать событие изменения для всех 25 полей и заполнить соответствующие метки [ОПИСАНИЕ]. Схема именования для меток описания Имя: desc_ [X] _label 1 <= X <= 25 </p>

Когда я программирую событие изменения только для одного блока (то есть id_box_1), функциональность работает отлично. Когда я пытаюсь реализовать 25 блоков с WithEvents и ClassModules, я получаю сообщение об ошибке «Не удается скомпилировать модуль»

Имя формы: ссылки

См. Соответствующие фрагменты кода ниже

Код в функции UserForm_Initialize

    Private Sub UserForm_Initialize()
    'Code to make single change event subroutine register for all id_[INT]_textboxes on links form
     Dim ctrl As MSForms.Control
     Dim text_box_handler As text_boxes_change

        Set textBox_collection = New Collection

        For Each ctrl In Me.controls

        If TypeOf ctrl Is MSForms.TextBox Then
            If Split(ctrl.Name, "_")(0) = "id" Then
                Set text_box_handler = New text_boxes_change
                Set text_box_handler.control_text_box = ctrl
                textBox_collection.Add text_box_handler
            End If

        End If

      Next ctrl


    End Sub

Код модуля пользовательского класса

Class Module Name: text_boxes_change

    Option Explicit

    'This class assists in validating multiple text boxes on forms without having to define event 
    functions for each text box separately

    'Global Constants
    Const CASHFLOW As String = "Chart"
    Const SETUP As String = "Settings"
    Const INVOICE_STATUSES As String = "K13:K18"
    Const TIME_UNITS As String = "L21:L24"
    Const RELATION_TYPES As String = "M21:M25"
    Const ACTIVITIES_COL As String = "T"
    Const PROJ_START_ROW As Integer = 6

    Public WithEvents MyTextBox As MSForms.TextBox

    Public Property Set control_text_box(ByVal tb As MSForms.TextBox)
        Set MyTextBox = tb
    End Property

    Public Sub BoxesGroup_Change()
        'Setting default background color for the box
        Me.MyTextBox.BackColor = RGB(255, 255, 255)

        'Setting up Cashflow Worksheet Object
        Dim cashflow_sheet As Worksheet
        Set cashflow_sheet = Sheets("Chart")

        'Finding lastrow with text inside the Sub-Activites column in Chart sheet
        Dim lastrow As Integer
        lastrow = cashflow_sheet.Cells(Rows.Count, ACTIVITIES_COL).End(xlUp).Row

        'Range to represent the activities column in Chart worksheet
        Dim activities_range As Range
        Set activities_range = cashflow_sheet.Range(ACTIVITIES_COL & CStr(PROJ_START_ROW) & ":" & _
    ACTIVITIES_COL & CStr(lastrow))

        'A variable to store the user inputed value for id_box
        Dim row_id As String
        row_id = Me.MyTextBox.value

        If IsNumeric(row_id) = True Then
             If CInt(row_id) >= PROJ_START_ROW And CInt(row_id) <= lastrow Then
                Dim desc_caption As String
                'SheetFunctions is a Module ;  links_description is a Function that returns a string 
    representing a cell address based on the rules of the workbook; functionality is tested and verified 
    for this part
                desc_caption = SheetFunctions.links_description(row_id)
                If desc_caption <> "" Then
                    Me.MyTextBox.BackColor = RGB(255, 255, 255)
                    Me.desc_1_label.Caption = desc_caption
                Else
                    Me.MyTextBox.BackColor = RGB(140, 39, 30)
                End If
            Else
                Me.MyTextBox.BackColor = RGB(140, 39, 30)
            End If

        Else
            Me.MyTextBox.BackColor = RGB(140, 39, 30)
        End If
    End Sub

Снимок экрана формы

...