So lassen Sie die Excel-Datenüberprüfung in der Dropdown-Liste andere Daten anzeigen als die, die tatsächlich überprüft werden

So lassen Sie die Excel-Datenüberprüfung in der Dropdown-Liste andere Daten anzeigen als die, die tatsächlich überprüft werden

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.

verwandte Informationen