Vba 在数据验证单元中输入值时如何避免重复,该单元允许多个选择

Vba 在数据验证单元中输入值时如何避免重复,该单元允许多个选择,vba,excel,Vba,Excel,我的数据库中有某些列,需要我键入新数据并进行选择。因此,我通过数据验证制作了一个下拉列表。我可以根据代码选择多个选项,但如果我在该单元格中键入任何数据,原始选项将显示两次 单元格包含以下选项:ABC、XYZ 我选择了ABC,在WWW 单元格将显示ABC、ABC、WWW 任何人都可以帮助避免重复原来的选择吗 这是我目前拥有的代码,我试图删除“oldVal”部分以防止重复,它阻止我选择多个选项 Private Sub Worksheet_Change(ByVal Target As Range)

我的数据库中有某些列,需要我键入新数据并进行选择。因此,我通过数据验证制作了一个下拉列表。我可以根据代码选择多个选项,但如果我在该单元格中键入任何数据,原始选项将显示两次

单元格包含以下选项:ABC、XYZ
我选择了ABC,在WWW
单元格将显示ABC、ABC、WWW

任何人都可以帮助避免重复原来的选择吗

这是我目前拥有的代码,我试图删除“oldVal”部分以防止重复,它阻止我选择多个选项

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rngDV As Range
    Dim oldVal As String
    Dim newVal As String
    Dim lUsed As Long
    If Target.Count > 1 Then GoTo exitHandler
    On Error Resume Next
    Set rngDV = Cells.SpecialCells(xlCellTypeAllValidation)
    On Error GoTo exitHandler
    If rngDV Is Nothing Then GoTo exitHandler
    If Intersect(Target, rngDV) Is Nothing Then
         'do nothing
    Else
        Application.EnableEvents = False
        newVal = Target.Value
        Application.Undo
        oldVal = Target.Value
        Target.Value = newVal
        If Target.Column = 28 Or Target.Column = 29 Or Target.Column = 30 Then
            If oldVal = "" Then
                 'do nothing
            Else
                If newVal = "" Then
                     'do nothing
                Else
                    lUsed = InStr(1, oldVal, newVal)
                    If lUsed > 0 Then
                        If oldVal = newVal Then
                            Target.Value = ""
                        ElseIf Right(oldVal, Len(newVal)) = newVal Then
                            Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 1)
                        Else
                            Target.Value = Replace(oldVal, newVal & vbLf, "")
                        End If
                    Else
                        Target.Value = oldVal & vbLf & newVal
                    End If
                End If
            End If
        End If
    End If
exitHandler:
    Application.EnableEvents = True
End Sub

有趣的代码。仅供参考,对我来说效果很好。当我选择ABC,然后键入WWW时,它将显示ABC-WWW。当我再次键入WWW时,它将被删除。如果我选择ABC,同样的事情也会发生。代码没有问题。WWW不应该出现在下拉列表中,如果你已经将WWW添加到下拉列表中,那么它工作正常。不,不在列表中,我明白了。也许您可以打开一个新的工作表,复制此代码并创建数据验证,然后再次检查,您的工作表中是否有其他代码?是的,我刚刚在其他工作簿上尝试过它,它工作正常,但它没有多选功能,就像现在我无法选择ABC和XYZ显示在同一单元格中一样。///不,我在工作表中没有任何其他代码,但我在模块中有代码。我逐行检查了您的代码,没有逻辑错误。此外,没有重复项,我选择/输入的内容都添加到列表中。再次键入也会删除它们。有趣的代码。仅供参考,对我来说效果很好。当我选择ABC,然后键入WWW时,它将显示ABC-WWW。当我再次键入WWW时,它将被删除。如果我选择ABC,同样的事情也会发生。代码没有问题。WWW不应该出现在下拉列表中,如果你已经将WWW添加到下拉列表中,那么它工作正常。不,不在列表中,我明白了。也许您可以打开一个新的工作表,复制此代码并创建数据验证,然后再次检查,您的工作表中是否有其他代码?是的,我刚刚在其他工作簿上尝试过它,它工作正常,但它没有多选功能,就像现在我无法选择ABC和XYZ显示在同一单元格中一样。///不,我在工作表中没有任何其他代码,但我在模块中有代码。我逐行检查了您的代码,没有逻辑错误。此外,没有重复项,我选择/输入的内容都添加到列表中。再次打字也会删除它们。