При добавлении / удалении последнего значения из одного списка в другое очищается весь список? - PullRequest
1 голос
/ 27 июня 2019

Я создаю пользовательскую форму (riskcodefiter), где пользователь может перемещать значения из одного списка в другой.Первое поле списка allriskcodes содержит много значений (заполняемых из диапазона на другом листе), а второе поле списка chosenriskcodes будет содержать значения из allriskcodes, которые пользователь хочет использовать в качестве фильтра.Пользовательская форма включает в себя Btn_addallcodes, Btn_removeallcodes, Btn_addcodes, Btn_removecodes - которые говорят сами за себя.

Проблема: если в списке chosenriskcodes несколько значений и пользователь хочет удалить последнее значение в поле, он очистит весь список chosenriskcodes.Это также относится и к моей Btn_addcodes.Любой совет?

Это код, который я имею для моего Btn_removecodes

Private Sub BTN_removecodes_Click()
     Dim iCtr As Long

    For iCtr = 0 To Me.chosenriskcodes.ListCount - 1
        If Me.chosenriskcodes.Selected(iCtr) = True Then
           Me.allriskcodes.AddItem Me.chosenriskcodes.List(iCtr)
        End If
    Next iCtr

    For iCtr = Me.chosenriskcodes.ListCount - 1 To 0 Step -1
        If Me.chosenriskcodes.Selected(iCtr) = True Then
           Me.chosenriskcodes.RemoveItem iCtr
        End If
    Next iCtr
End Sub

Это код, который я имею для моего Btn_addcodes

    Private Sub BTN_addcodes_Click()
    Dim iCtr As Long

    For iCtr = 0 To Me.allriskcodes.ListCount - 1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.chosenriskcodes.AddItem Me.allriskcodes.List(iCtr)
        End If
    Next iCtr

    For iCtr = Me.allriskcodes.ListCount - 1 To 0 Step -1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.allriskcodes.RemoveItem iCtr
        End If
    Next iCtr

    End Sub

Кнопка отлично работает для всех других значений в списках, кроме последнего значения.Есть идеи?

1 Ответ

1 голос
/ 27 июня 2019

Вы можете видеть, что проблема возникает, если вы вставляете точки останова и смотрите, что происходит ..

Если есть, скажем, 50 элементов в allriskcodes и выбран 50-й элемент, удаление его вызывает 49-й элемент кстать выбранным (как если бы это был активный курсор).

Простой обходной путь - отменить выбор каждого элемента непосредственно перед его удалением, например, так:

Private Sub BTN_addcodes_Click()
    Dim iCtr As Long

    For iCtr = 0 To Me.allriskcodes.ListCount - 1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.chosenriskcodes.AddItem Me.allriskcodes.List(iCtr)
        End If
    Next iCtr

    For iCtr = Me.allriskcodes.ListCount - 1 To 0 Step -1
        If Me.allriskcodes.Selected(iCtr) = True Then
            Me.allriskcodes.Selected(iCtr) = False
            Me.allriskcodes.RemoveItem iCtr
        End If
    Next iCtr

End Sub

Кроме того, чтобы сделать этоболее читабельно, вы можете использовать оператор With:

Private Sub BTN_addcodes_Click()

    Dim iCtr As Long
    With Me.allriskcodes

        For iCtr = 0 To .ListCount - 1
            If .Selected(iCtr) = True Then
                Me.chosenriskcodes.AddItem .List(iCtr)
            End If
        Next iCtr

        For iCtr = .ListCount - 1 To 0 Step -1
            If .Selected(iCtr) = True Then
                .Selected(iCtr) = False
                .RemoveItem iCtr
            End If
        Next iCtr

    End With

End Sub
...