2016-12-16 4 views
2

ドロップダウンリストから新しいものを選択するたびに、そのセルに既にあるものに追加するドロップダウンリストが作成されました。問題は、私はそれをクリアする方法を見つけることを試みている、と私は私の注文が間違っていると思う。ここでは、コードです:私は、ドロップダウンメニューから[クリア]を選択した場合VBAドロップダウンリストの内容を消去

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 

私がいる問題は、その時々で、それは代わりに、セルの内容をクリアするのリストに追加します。この場合、Clearを再度選択すると、セルの内容が正常に消去されます。

うまくいけば、これは理にかなっています。あなたが私を必要とするなら、私は明確にします。 If文の順序が間違っているので、この問題は起こっていますか?

時間を割いていただきありがとうございます。すてきな一日を!

答えて

1

あなたが入力し、「CLEAR」を初めて、あなたはドンので、あなたが古い値でその文字列をしていなかったので、lUsedが」0でありますトンIf lUsed > 0 Thenチェックを通過し、したがって、あなたがlUsed> 0 Then` 1

としてならば ``もしnewValには= "CLEAR" check before theを配置する必要がありIf newVal = "CLEAR" Thenチェック

に達していませんその中で、まだ弱点があります

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 

はおそらくOn Error GoTo exitHandler文の後に引き上げ、すべてのエラーは、サブを終了することができつながる:あなたのコードのこの小さなリファクタリングインチ

Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 2)によって入力が第1の値と同じ値を選択した場合にエラーを処理したい場合があります。

2

クリアコンテンツは、前のセルにコピーします

If oldVal = "" Then 
     'do nothing 
     Else 
     If newVal = "" Then 
     'do nothing 
     Else 
     If newVal = "CLEAR" Then 
      Selection.ClearContents 
      GoTo exitHandler 
     end if 
     ..... 
関連する問題