Как расставить приоритеты флажки в пользовательской форме в VBA при циклическом их прохождении? - PullRequest
0 голосов
/ 26 февраля 2019

Вот мой цикл, который проверяет, какие поля имеют истинные значения, и присваивает им имена тегов в виде строки (fund1, fund2, fund3):

counter = 0
Dim ctrl As MSForms.Control
For Each ctrl In Me.Controls
    If TypeName(ctrl) = "CheckBox" Then
        If ctrl.Value = True Then
            counter = counter + 1
            If counter = 1 Then
                fund1 = ctrl.Tag
            ElseIf counter = 2 Then
                fund2 = ctrl.Tag
            ElseIf counter = 3 Then
                fund3 = ctrl.Tag
            End If
        End If
    End If
Next ctrl

Код работает нормально, но, скажем, у меня есть 5 флажковс тегами и именами от a до e.Я хочу установить порядок важности, для которого флажки будут проходить в первую очередь.В настоящее время, например:

fund 1 = c.tag
fund 2 = a.tag
fund 3 = b.tag

Но я бы хотел:

fund 1 = d.tag
fund 2 = b.tag
fund 3 = c.tag

Как назначить приоритеты для определенных флажков, которые будут проходить в первую очередь?Я попытался изменить TabIndexes в свойствах каждого флажка, но безуспешно.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете присвоить своим флажкам имена, отражающие их приоритет (например, «myCB1», «myCB2» и т. Д.), И напрямую получить их через Controls collection:

Dim iCB As Long, counter As Long
Dim fund1 As String, fund2 As String, fund3 As String
With Me
    For iCB = 1 To 5 
        With .Controls("myCB" & iCB) 
            If .Value Then
                counter = counter + 1
                If counter = 1 Then
                    fund1 = .Tag
                ElseIf counter = 2 Then
                    fund2 = .Tag
                ElseIf counter = 3 Then
                    fund3 = .Tag
                End If
            End If
        End With
    Next
End With

Более тогоструктура Select Case может быть более читабельной:

Dim iCB As Long, counter As Long
Dim fund1 As String, fund2 As String, fund3 As String
With Me
    For iCB = 1 To 5
        With .Controls("myCB" & iCB)
            If .Value Then
                counter = counter + 1
                Select Case counter
                    Case 1
                        fund1 = .Tag
                    Case 2
                        fund2 = .Tag
                    Case 3
                        fund3 = .Tag
                End Select
            End If
        End With
    Next
End With

Наконец, вы можете рассмотреть использование массива вместо трех переменных:

Dim iCB As Long, counter As Long
Dim funds(1 To 3) As String
With Me
    For iCB = 1 To 3
        With .Controls("myCB" & iCB)
            If .Value Then
                counter = counter + 1
                funds(counter) = .Tag
            End If
        End With
    Next
End With

и затем получить к ним доступ с помощью funds(1),funds(2) и funds(3)

0 голосов
/ 26 февраля 2019

Если вы говорите о приоритете между флажками, я думаю, что вы уже знаете их и не обнаруживаете их во время выполнения.

В этом случае просто создайте свою собственную коллекцию (которую вы сортируететак, как вы хотите), объявите его в верхней части модуля (чтобы переменная оставалась глобальной и доступной во время выполнения вашей программы) и заполните ее один раз при инициализации.

Например:

Public prioritizedCheckboxes As Collection '<-- on top of the form module (global variable)
'--------------------------------------------
Private Sub initializePrioritizedList()
    Set prioritizedCheckboxes = New Collection
    With prioritizedCheckboxes
        .Add d '<-- most important
        .Add c '<-- second most important
        '...
        .Add b '<-- less important
    End With
End Sub
'--------------------------------------------
Private Sub UserForm_Initialize()
    initializePrioritizedList '<-- initialize your list when you initialize the form (or whenever you prefer)
End Sub
'--------------------------------------------

... и затем используйте свой код с приоритетной коллекцией:

counter = 0
Dim ctrl As MSForms.Control
For Each ctrl In prioritizedCheckboxes '<-- you sorted the list. So you know first you'll have d, then c, then a etc.
    If ctrl.Value = True Then
        counter = counter + 1
        If counter = 1 Then
            fund1 = ctrl.Tag
        ElseIf counter = 2 Then
            fund2 = ctrl.Tag
        ElseIf counter = 3 Then
            fund3 = ctrl.Tag
        End If
    End If
Next ctrl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...