Предварительно заполнить список множественного выбора в Excel VBA - PullRequest
0 голосов
/ 27 апреля 2020

Почему этот код не открывает форму с уже выбранными элементами? С этим кодом я установил флаг выбора на true.

Private Sub UserForm_Initialize()
Dim i, InStrRes, k
With ActiveCell
    If .Value <> "" Then
        For i = 0 To Me.lstDV.ListCount - 1
            InStrRes = InStr(1, ActiveCell.Value, Me.lstDV.List(i))
            If InStrRes <> 0 And InStrRes <> Null Then
                Me.lstDV.Selected(i) = True
            End If
        Next i
    End If
End With
End Sub

Ответы [ 2 ]

1 голос
/ 27 апреля 2020
Private Sub UserForm_Initialize()
Dim i, InStrRes, k
With ActiveCell
    If .Value <> "" Then
        For i = 0 To Me.lstDV.ListCount - 1
            Me.lstDV.Selected(i) = False '<~~ add this code. Should be set to false in advance.
            InStrRes = InStr(1, ActiveCell.Value, Me.lstDV.List(i))
            'If InStrRes <> 0 And InStrRes <> Null Then
            If InStrRes  Then
                Me.lstDV.Selected(i) = True
            End If
        Next i
    End If
End With
End Sub
0 голосов
/ 27 апреля 2020

Предполагается, что список не был загружен во время инициализации. Я пробовал активировать событие с аналогичным отсутствием успеха. Пожалуйста, попробуйте этот код.

Sub ShowMyForm()

    Dim MyForm As New TryForm
    Dim CellVal As Variant

    CellVal = ActiveCell.Value
    With MyForm
        If Len(CellVal) Then
            On Error Resume Next
            .lstDV.ListIndex = Application.Match(CellVal, Range(.lstDV.RowSource), 0) - 1
        End If
        .Show
        ' code continues here when the form is closed
    End With
    Unload MyForm
End Sub

Этот код должен быть в стандартном модуле кода, а не в листе кода формы. Он вызывает форму TryForm (замените на имя, которое вы дали своей форме), и изменяет его перед отображением. Обратите внимание, что у вас все еще есть полный доступ к форме для извлечения значений, которые вы можете захотеть после того, как она скрыта. Просто избегайте Unload Me в любом месте кода формы, потому что выгрузка выполняется вышеуказанным кодом после того, как вы взяли все, что хотели.

Обратите внимание, что событие Initialize формы вызывается ключевым словом New в Dim MyForm As New TryForm, задолго до того, как вы получите доступ. Событие Activate следует с некоторой задержкой. Пожалуйста, убедитесь, что процедуры, которые вы можете запустить с этими событиями, не влияют на то, что делает приведенный выше код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...