Wie kann ich einem Benutzer ein Dropdown-Menü in einer Zelle bereitstellen, das den Inhalt einer Spalte anzeigt, aber tatsächlich den Wert aus einer anderen Spalte in die Zelle schreibt und ihn mit den Werten aus dieser zweiten Spalte validiert?
Ich habe ein bisschen Code, der das fast schafft (Quelle: DV0005 vondie Contextures-Site):
Private Sub Worksheet_Change(ByVal Target As range)
On Error GoTo errHandler
If Target.Cells.Count > 1 Then GoTo exitHandler
If Target.Column = 10 Then
If Target.Value = "" Then GoTo exitHandler
Application.EnableEvents = False
Target.Value = Worksheets("Measures").range("B1") _
.Offset(Application.WorksheetFunction _
.Match(Target.Value, Worksheets("Measures").range("Measures"), 0) - 1, 1)
End If
Das Dropdown-Menü zeigt die Werte aus einer Spalte an, z. B. Spalte B. Wenn es jedoch ausgewählt wird, wird der Wert aus Spalte C in derselben Zeile in die Zelle geschrieben. Die Datenüberprüfung erfolgt jedoch tatsächlich anhand von Spalte B. Wenn ich also manuell etwas aus Spalte C in die Zelle eingebe und versuche, in eine andere Zelle zu wechseln, gibt die Datenüberprüfung einen Fehler aus.
Antwort1
Die einzige Möglichkeit, die ich sehe, besteht darin, die Datenüberprüfung zu entfernen und ein eigenes Dropdown-Feld zu codieren.
Dies hat den Vorteil, dass die Dropdown-Liste die eigentliche Zelle ausblendet, sodass die Zelle selbst weiterhin wie gewohnt bearbeitet werden kann.
Dieser Code (vonHier) fügt ein Dropdown-Menü hinzu und fügt bei Auswahl eines Elements diesen Wert in die Zelle ein, ändert eine andere Zelle basierend auf dem ausgewählten Element und entfernt sich dann selbst, sodass kein Dropdown-Menü vorhanden ist. Sie sollten diesen Code zu Ihrem eigenen Vergnügen verwenden können.
Für den Fall, dass der Link nicht mehr funktioniert, ist der Code hier wiedergegeben:
Option Explicit
Sub Test()
AddDropDown Range("D4")
End Sub
Sub AddDropDown(Target As Range)
Dim ddBox As DropDown
Dim vaProducts As Variant
Dim i As Integer
vaProducts = Array("Water", "Oil", "Chemicals", "Gas")
Set ddBox = Sheet1.DropDowns.Add(Target.Left, Target.Top, Target.Width, Target.Height)
With ddBox
.OnAction = "EnterProductInfo" ' name corrected
For i = LBound(vaProducts) To UBound(vaProducts)
.AddItem vaProducts(i)
Next i
End With
End Sub
Private Sub EnterProductInfo()
Dim vaPrices As Variant
vaPrices = Array(15, 12.5, 20, 18)
With Sheet1.DropDowns(Application.Caller)
.TopLeftCell.Value = .List(.ListIndex)
.TopLeftCell.Offset(0, 2).Value = vaPrices(.ListIndex - Array(0, 1)(1))
.Delete
End With
End Sub
Antwort2
Wenn Sie keine Dropbox-Steuerung verwenden möchten, warum denken Sie nicht über diesen Ansatz nach?
- OnCellSelect-Ereignis erfasst die Zielzelle
- Fügen Sie eine Dropdown-Validierung in der Zelle hinzu.
- Nachdem Sie die richtige Option aus der Dropdown-Liste in der Zelle ausgewählt haben
- Das Ereignis „OnChange“ wird ausgelöst
- Erfassen Sie den Wert in einer Variablen
- Teile es auf
- Schalten Sie Ereignisse aus, damit keine Schleife gestartet wird~
- Zellenvalidierung entfernen
- Schreiben Sie den Zellenwert mit der Variablen split neu
- Ereignisse aktivieren
Die Zellenvalidierung wird immer beim OnSelect-Ereignis hinzugefügt und beim Change-Ereignis entfernt. Jedes Mal, wenn Sie die Zelle fokussieren, wird sie in der Zellenvalidierung als Dropdown-Liste angezeigt. Sobald sie ausgewählt ist, ist sie es nicht mehr und Sie geben den gewünschten Wert ein.