2016-12-16 3 views
2

J'ai créé une liste déroulante où chaque fois que vous sélectionnez quelque chose de nouveau dans la liste déroulante, il ajoute à ce qui est déjà dans la cellule. Problème, est-ce que j'essaie de trouver un moyen de l'effacer, et je pense que j'ai mal mes commandes. Voici le code:VBA Effacer contenu dans la liste déroulante

Option Explicit 

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 = Worksheets("Contact Log").Range("AE:AE,AI:AI,AM:AM,AQ:AQ,AU:AU,AY:AY,BC:BC,BG:BG,BK:BK,BO:BO,BS:BS,BW:BW,CA:CA,CE:CE,CI:CI") 

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 oldVal = "" Then 
    'do nothing 
    Else 
    If newVal = "" Then 
     'do nothing 
    Else 
     lUsed = InStr(1, oldVal, newVal) 
     If lUsed > 0 Then 
     If newVal = "CLEAR" Then 
      Selection.ClearContents 
     ElseIf Right(oldVal, Len(newVal)) = newVal Then 
      Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 2) 
     Else 
      Target.Value = Replace(oldVal, newVal & ", ", "") 
     End If 
     Else 
     Target.Value = oldVal & ", " & newVal 
     End If 
    End If 
    End If 
End If 

exitHandler: 
    Application.EnableEvents = True 
End Sub 

Le problème que je vais avoir est que parfois, si je choisis Effacer dans le menu déroulant, il ajoute à la liste au lieu de dégager le contenu de la cellule. Lorsque cela se produit, la sélection de Effacer à nouveau effacera le contenu de la cellule.

J'espère que cela a du sens, si vous avez besoin de moi, je vais clarifier. Ce problème se produit-il parce que la commande de mes instructions If est incorrecte?

Merci d'avoir pris le temps! Passez une bonne journée!

Répondre

1

la première fois que vous entrez « CLEAR », lUsed est 0 parce que vous ne l'aviez pas cette chaîne dans la ancienne valeur de sorte que vous n » t passer If lUsed > 0 Then contrôle et donc ne parviennent pas à la If newVal = "CLEAR" Then chèque

de sorte que vous devez mettre `` Si newVal = "CLEAR" check before the Si lUsed> 0 Then` un

comme dans ce petit refactoring de votre code:

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim rngDV As Range 
    Dim oldVal As String 
    Dim newVal As String 

    If Target.count > 1 Then Exit Sub 

    Set rngDV = Intersect(UsedRange, Range("AE:AE,AI:AI,AM:AM,AQ:AQ,AU:AU,AY:AY,BC:BC,BG:BG,BK:BK,BO:BO,BS:BS,BW:BW,CA:CA,CE:CE,CI:CI")) 

    If Intersect(Target, rngDV) Is Nothing Then Exit Sub 

    Application.EnableEvents = False 
    On Error GoTo exitHandler 

    newVal = Target.Value 
    Select Case UCase(newVal) 
     Case "CLEAR" 
      Target.ClearContents 

     Case vbNullString 
      'do nothing 

     Case Else 
      Application.Undo 
      oldVal = Target.Value 
      If oldVal <> "" Then 
       If InStr(1, oldVal, newVal) > 0 Then 
        If Right(oldVal, Len(newVal)) = newVal Then 
         Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 2) 
        Else 
         Target.Value = Replace(oldVal, newVal & ", ", "") 
        End If 
       Else 
        Target.Value = oldVal & ", " & newVal 
       End If 
      End If 

     End Select 

exitHandler: 
    Application.EnableEvents = True 
End Sub 

où il y a encore un point faible que chaque erreur peut augmenter après On Error GoTo exitHandler déclaration vous conduira à mettre fin à la sous.

alors peut-être vous voulez gérer l'erreur augmenté de Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 2) lorsque l'entrée choisit comme deuxième valeur la même qu'il a choisi comme le premier

2

Effacer le contenu copie avant dans la cellule:

If oldVal = "" Then 
     'do nothing 
     Else 
     If newVal = "" Then 
     'do nothing 
     Else 
     If newVal = "CLEAR" Then 
      Selection.ClearContents 
      GoTo exitHandler 
     end if 
     .....