2017-04-21 3 views
0

Ich habe eine Tabelle, die ich versuche, eine dynamische Dropdown-Liste zu erstellen. Ich habe es eingerichtet, so dass ich eine Liste von Test No. und den Wochentag als nächstes haben zu ihm. Es sieht wie folgt aus:So erstellen Sie eine dynamische Dropdown-Liste in Excel

Setup TestNumbers

Nun, was ich will, ist, wie ich die gleiche Nummer, unter einer der Listen füge ich die Dropdown-Liste geben will mir nur die zur Verfügung stehenden Tage, die für die nicht bereits verwendet werden, Nummer.

dh für 1234 das Dropdown unter New sollte für 5678 das Dropdown unter New Do, Fr, Sa, So also soll Mo, Mi, Do, Sa, So hat dh für 9012 die Dropdown unter Neu Ich hätte einen benannten Bereich, der die 7 Tage der Woche hat, und ich kann Data Validation verwenden, um diese Liste die Drop-Optionen zu haben, aber ich möchte, dass es dynamisch ist und nur mir geben die Optionen, die nicht bereits von diesem Test No verwendet werden.

Kann dies getan werden?

Antwort

1

Angenommen, Ihre Daten in Spalten A: B, wo row1 Kopfzeile ist, und Sie haben einen benannten Bereich Tage dann rechts klicken Sie auf die Registerkarte Blatt genannt -> Ansicht Code und fügen Sie den Code unten angegeben in die geöffnetes Codefenster -> Speichern Sie Ihre Arbeitsmappe als Makrofähige Arbeitsmappe.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
If Target.CountLarge > 1 Then Exit Sub 
Dim x, dict 
Dim i As Long, lr As Long 
Dim Rng As Range, Cell As Range 
Dim Str As String 
lr = Cells(Rows.Count, 1).End(xlUp).Row 
Set Rng = Range("A2:A" & lr) 
x = Range("Days").Value 
Set dict = CreateObject("Scripting.Dictionary") 
If Target.Column = 2 And Target.Row > 1 Then 
    If Target.Offset(0, -1) <> "" Then 
     For Each Cell In Rng 
      If Cell <> "" And Cell = Target.Offset(0, -1) Then 
       If Str = "" Then 
        Str = Cell.Offset(0, 1).Value 
       Else 
        Str = Str & ", " & Cell.Offset(0, 1).Value 
       End If 
      End If 
     Next Cell 
     For i = 1 To UBound(x, 1) 
      If InStr(Str, x(i, 1)) = 0 Then 
       dict.Item(x(i, 1)) = "" 
      End If 
     Next i 
     On Error Resume Next 
     With Target.Validation 
      .Delete 
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
           xlBetween, Formula1:=Join(dict.keys, ",") 
     End With 
    End If 
End If 
End Sub 

Also, wenn Sie eine Zelle in Spalte B wählen, wird der Code, um eine Dropdown-Liste mit Ausnahme der Tage bereits für den spezifischen Test nicht ausgewählt hinzufügen. entsprechende Zelle in Spalte A. enter image description here

0

können Sie je Dropdown-Liste
verwenden Erstellen Sie Ihre Liste Mo - Sonntag Namen definieren wkday zum Beispiel
Select Di - Sonntag und Namen definieren Mon
Select Mi - Sonntag und Namen definieren Di
Select Do - Sonntag und Namen definieren Mi
Select Fr - Sonntag und Namen definieren Do
Wählen Sat - Sonntag und Namen definieren Fr
Select Sonntag und Namen definieren Sat

Sie können alle Zellen, in denen wählen müssen Sie die Dropdown-Liste:
Beginnend mit Zellb2 zum Beispiel erstellen unter Datenvalidierung, Liste, in Quelle schreiben:

=IF(OR(B1="",B1="Day"),wkday,INDIRECT(B1))

+0

Dies würde nur abdecken, wenn sie immer in der Reihenfolge abgeholt werden. manchmal sind sie nicht wie bei '9012', es wird mit Mon und dann mit Mi ausgewählt, also würde ich am Ende Di, Sa, Sun im Drop-Down brauchen. – Mike

+0

Wenn Sie Wed unter Mon wählen, wird in der folgenden Zelle Thu - Sonntag (Name Mi) angezeigt. – yass

1

Sie das Worksheet_SelectionChange Ereignis behandeln können in dem Codemodul des Blattes die VALIDAT zu ändern Ionenliste. Einige Überprüfungen sind erforderlich, um festzustellen, ob die neue ausgewählte Zelle eine der Zellen ist, die Sie validieren möchten. d. h. Spalte B, eine Kennung in Spalte A usw. Die Überprüfungen in der folgenden Routine entsprechen Ihren Beispieldaten.

' Code Module of your worksheet 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Target.Cells.count > 1 Then Exit Sub 
    If Target.Column <> 2 Or Target.row < 2 Then Exit Sub 
    If Len(Trim(Target.Value)) > 0 Then Exit Sub 
    If Len(Trim(Target.offset(, -1).Value)) = 0 Then Exit Sub 

    Dim newList As String: newList = ",Sun,Mon,Tue,Wed,Thu,Fri,Sat" 
    Dim r As Range: Set r = Target.offset(-1) 
    Do Until Len(Trim(r.Value2)) = 0 Or r.offset(, -1).Value2 <> Target.offset(, -1).Value2 
     newList = Replace(newList, "," & r.Value2, "") 
     Set r = r.offset(-1) 
    Loop 
    With Target.Validation 
     .Delete 
     .Add xlValidateList, , , Mid(newList, 2) 
    End With 
End Sub 
Verwandte Themen