2017-11-29 3 views
0

Ich habe Code auf einem Arbeitsblatt, das derzeit das BeforeDoubleClick verwendet. Dieser Code platziert eine Combobox über jede Zelle, auf die doppelgeklickt wird, die eine Datenüberprüfungsformel enthält. Die Combobox übernimmt die Formel.Excel - Dependent Data Validation ComboBox auf einen einzigen Klick

Ich mag dies, weil Sie die Datenüberprüfungsliste erhalten, aber Sie haben auch die Option für den Benutzer, die Combobox einzugeben und Autovervollständigung für die Datenüberprüfungsoptionen zu erhalten.

Das Arbeitsblatt selbst verfügt über zwei Datenüberprüfungsbereiche, einen für State, einen für City. Die Stadtdatenvalidierung hängt von der Auswahl für den Staat ab.

Ich mag es wirklich nicht, dass der Benutzer jedes Mal doppelt klicken müsste, wenn sie die Auswahl ändern möchten. Es wäre schön, wenn sie einfach klicken und es aufspringen lassen könnten.

Jede Hilfe wird geschätzt!

Arbeitsblatt Code: (Von http://www.contextures.com/xlDataVal11.html#works) ((Sie haben einen anderen Link (http://www.contextures.com/xlDataVal14.html) zeigt, wie dies auf Klick zu tun, aber wenn ich versuche, INDIREKTE für die = im Abschnitt hinzuzufügen (die die abhängigen Daten erlaubt Validierung) es nicht funktioniert.))

'========================== 
Private Sub Worksheet_BeforeDoubleClick _ 
    (ByVal Target As Range, _ 
    Cancel As Boolean) 
Dim str As String 
Dim cboTemp As OLEObject 
Dim ws As Worksheet 
Set ws = ActiveSheet 

Set cboTemp = ws.OLEObjects("TempCombo") 
    On Error Resume Next 
    With cboTemp 
    'clear and hide the combo box 
    .ListFillRange = "" 
    .LinkedCell = "" 
    .Visible = False 
    End With 
On Error GoTo errHandler 
    If Target.Validation.Type = 3 Then 
    'if the cell contains 
     'a data validation list 
    Cancel = True 
    Application.EnableEvents = False 
    'get the data validation formula 
    str = Target.Validation.Formula1 
    str = Right(str, Len(str) - 1) 

    'for simple INDIRECT function (English) 
    ' e.g. =INDIRECT(B2) 
    'will create dependent list of items 
    If Left(str, 4) = "INDI" Then 
     lSplit = InStr(1, str, "(") 
     str = Right(str, Len(str) - lSplit) 
     str = Left(str, Len(str) - 1) 
     str = Range(str).Value 
    End If 

    With cboTemp 
     'show the combobox with the list 
     .Visible = True 
     .Left = Target.Left 
     .Top = Target.Top 
     .Width = Target.Width + 15 
     .Height = Target.Height + 4 
     .ListFillRange = str 
     .LinkedCell = Target.Address 
    End With 
    cboTemp.Activate 
    'open the drop down list automatically 
    Me.TempCombo.DropDown 
    End If 

errHandler: 
    Application.EnableEvents = True 
    Exit Sub 

End Sub 
'========================================= 
Private Sub TempCombo_LostFocus() 
    With Me.TempCombo 
    .Top = 10 
    .Left = 10 
    .Width = 0 
    .ListFillRange = "" 
    .LinkedCell = "" 
    .Visible = False 
    .Value = "" 
    End With 
End Sub 
'==================================== 
Private Sub TempCombo_KeyDown(ByVal _ 
    KeyCode As MSForms.ReturnInteger, _ 
    ByVal Shift As Integer) 
    Select Case KeyCode 
    Case 9 'Tab 
     ActiveCell.Offset(0, 1).Activate 
    Case 13 'Enter 
     ActiveCell.Offset(1, 0).Activate 
    Case Else 
     'do nothing 
    End Select 
End Sub 

ValidationSample Sheet

State Data Validation

City Data Validation

Tables and NameManager

Antwort

0

Wow, war die Antwort so einfach ...

ich es auf "Worksheet_SelectionChange (ByVal Ziel als Range)" (immer von der loszuwerden Abbrechen als Boolean) Und dann die Zeile "Cancel = True" auskommentiert

Hoffe, das hilft jemandem auf der ganzen Linie!

Verwandte Themen