Настройка нескольких флажков при инициализации пользовательской формы - PullRequest
0 голосов
/ 08 апреля 2020

Новое здесь (первое сообщение), а также довольно новое для vba excel, и я столкнулся с камнем преткновения, который я пытаюсь решить. Если бы я мог найти помощь здесь, я был бы очень благодарен!

У меня есть пользовательская форма, которая содержит 90 флажков. При инициализации формы я хочу установить для всех флажков значение ИСТИНА или ЛОЖЬ в зависимости от значения, содержащегося в ячейке на указанном листе c, что я могу сделать, я просто сейчас должен сделать это для дополнительных 89 флажков, которые в его нынешнем формате будет громоздким.

Я ищу предложения относительно того, как этого можно достичь более кратким способом.

Спасибо!

Private Sub UserForm_Initialize()

    Dim chRange As Range
    Dim ws As Worksheet
    Dim PDI_No As String
    Dim Row As Integer
    Dim rfind1 As Range
    Dim Col_Ltr1 As String

    Set ws = Worksheets("Master_Log")
    Set chRange = ws.Range("A:A")
    PDI_No = UpdateRecord.ComboBox1.Value
    Row = Application.WorksheetFunction.Match(PDI_No, chRange, 0) 'finds row number
    With Worksheets("Master_Log").Range("A1:DZ1")
        Set rfind1 = .find(What:=CheckBox1.Caption, LookAt:=xlWhole, MatchCase:=False, 
                      SearchFormat:=False) 'finds column number
       Col_Ltr1 = Split((Columns(rfind1.Column).Address(, 0)), ":")(0) 'changes column number to a 
                  letter
       cellposition1 = Col_Ltr1 & Row 'range value

            If ws.Range(cellposition1) = CheckBox1.Caption Then
                CheckBox1.Value = True
                    Else
                CheckBox1.Value = False
            End If
        End With
End Sub

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Вы можете прокручивать все элементы управления в своей пользовательской форме, в частности, ища флажки:

Private Sub CycleThroughCheckboxes
Dim x As Control
Dim r As Long
Dim result as Boolean
For Each x In UserForm1.Controls
    If TypeName(x) = "CheckBox" Then
        x.Value = true ' or false - Do your find logic here using x.Caption
    End If
Next x
End Sub

Преимущество этого способа заключается в том, что если вы добавляете / снимаете некоторые флажки, вам не нужно вести учет и изменить код позже.

2 голосов
/ 08 апреля 2020

Вы можете сделать что-то вроде этого (при условии, что все ваши флажки имеют одно и то же имя):

Private Sub UserForm_Initialize()

    Dim ws As Worksheet
    Dim PDI_No As String
    Dim theRow, theCol, i As Long, cb As Object

    Set ws = Worksheets("Master_Log")
    PDI_No = UpdateRecord.ComboBox1.Value
    theRow = Application.Match(PDI_No, ws.Range("A:A"), 0) 'finds row number

    If Not IsError(theRow) Then
        For i = 1 To 90
            Set cb = Me.Controls("CheckBox" & i) '<<<<<
            theCol = Application.Match(cb.Caption, ws.Range("A1:DZ1"), 0)
            If Not IsError(theCol) Then
                cb.Value = (ws.Cells(theRow, theCol).Value = cb.Caption)
            Else
                'no column match
            End If
        Next i
    Else
        'no row match...
    End If

End Sub
1 голос
/ 08 апреля 2020

Мне не нравится идея полагать, что все 90 флажков названы с последовательными номерами. Следующий l oop будет l oop для всех элементов управления формы и проверки типа.

Dim ctrl As Control
For Each ctrl In Me.Controls
    if TypeName(ctrl) = "CheckBox" then
        ' rest of the logic "stolen" from Ted Willams answer:
        theCol = Application.Match(ctrl.Caption, ws.Range("A1:DZ1"), 0)
        If Not IsError(theCol) Then
            ctrl.Value = (ws.Cells(theRow, theCol).Value = ctrl.Caption)
        Else
            'no column match
        End If
    End If
Next ctrl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...