09.11.2023, 14:04 (Dieser Beitrag wurde zuletzt bearbeitet: 09.11.2023, 14:42 von sveni_lee.)
Ich möchte gern bei Eingabe eines Werts in TabelleA prüfen, ob der Eintag schon einmal in der TabelleA vorhanden ist und ober er in TabelleB vorhanden ist.
Es müssen die Bedingungen: in TabelleA SpalteA vorhanden - false in TabelleB SpalteA vohanden - true erfüllt sein...
gibt es eine einfachere Möglichkeit als die Länge der beiden Tabellen zu ermitteln und mit zwei inneinander verschachtesten FOR Schleifen Zeile für Zeile zu überprüfen?
da VBA prinzipiell alles kann, was auch Excel kann (spätestens dann, wenn man die Formel in eine Zelle schreibt), braucht man immer noch keine Schleifen sondern verwendet hier dann Application.WorksheetFunction.CountIf:
Code:
If Target = "" Then Exit Sub If Application.WorksheetFunction.CountIf(Columns(1), Target) > 1 Then MsgBox "Wert schon vorhanden" Application.Undo ElseIf Application.WorksheetFunction.CountIf(Worksheets("TabelleB").Columns(1), Target) = 0 Then MsgBox "Wert ungültig" Application.Undo End If
Das ganze gehört dann ins Change-Event von TabelleA und ist so zwar prinzipiell Lauffähig, aber extrem unprofessionell programmiert und muss noch angepasst werden, falls mehrere Zellen gleichzeitig geändert werden könnten. Da du ja schreibst, dass du noch mehr anpassen willst, solltest du das hinkriegen.
wenn du nur prüfen willst ob eine Eingabe bereits vorhanden ist, könnte es mit dem Code gehen. Wenn aber danach andere Aktionen folgen sollen ist die offene Frage: - Welche Aktionen??? Dieser Code gehört in Tabelle A, für Tabelle B musst du deinen Namen beu Set TbB angeben, Bei mir Tabelle2!
mfg Gast 123
Code:
Private Sub Worksheet_Change(ByVal Target As Range) Dim TbB As Worksheet, Zahl1, Zahl2, Wert If InStr(Target.Address, ":") Then Exit Sub If Target.Column <> 1 Then Exit Sub If Target.Value = "" Then Exit Sub Wert = Target.Value Set TbB = Worksheets("Tabelle2") Zahl1 = WorksheetFunction.CountIf(Columns(1), Wert) Zahl2 = WorksheetFunction.CountIf(TbB.Columns(1), Wert) If Zahl1 > 1 And Zahl2 >= 1 Then MsgBox "Eingabe in beiden Tabellen vorhanden" ElseIf Zahl1 > 1 Then MsgBox "Eingabe in Tabelle A bereits vorhanden" ElseIf Zahl2 >= 1 Then MsgBox "Eingabe in Tabelle B bereits vorhanden" End If End Sub
09.11.2023, 21:18 (Dieser Beitrag wurde zuletzt bearbeitet: 09.11.2023, 21:18 von sveni_lee.)
(09.11.2023, 17:55)HKindler schrieb: ... Das ganze gehört dann ins Change-Event von TabelleA und ist so zwar prinzipiell Lauffähig...
mir hat im Grunde der Einstieg erst einmal gefehlt. Ich zwar Erfahrung in Java-script und Python aber VBA ist noch einmal etwas anderes.
Irgendwie bekomme ich keine Msg
Code:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target = "" Then Exit Sub If Application.WorksheetFunction.CountIf(Columns(2), Target) > 1 Then MsgBox "Wert schon vorhanden" Application.Undo ElseIf Application.WorksheetFunction.CountIf(Worksheets("Tabelle2").Columns(14), Target) = 0 Then MsgBox "Wert ungültig" Application.Undo End If End Sub
Die beiden Tabellen auf dem Tabellenblatt sind auch als dynamische Tabelle definiert... hängt es damit zusammen?
der Eintrag wird in SpalteB gemacht. Und in TabelleB in Spalte 14 geprüft...
Edit: Fehler gefunen... Eine Spalte war ausgeblendet...
das kommt davon, wenn man durch die Angaben "TabelleA SpalteA" und "TabelleB SpalteA" suggeriert, dass mit "TabelleX" ein Tabellenblatt und keine intelligente Tabelle gemeint ist.
Deine "TabelleA" scheint ja die Strg-T-Tabelle "Tabelle7" im Blatt "Gruppenadressen" zu sein. Deine "TabelleB" ist vermutlich "Tabelle132" im Blatt "Raumplan". Und deine "SpalteA" ist wohl jeweils die Spalte "Gesamtcode".
Damit ergibt sich dann z.B.:
Code:
If Target = "" Then Exit Sub If Application.WorksheetFunction.CountIf(Range("Tabelle7[Gesamtcode]"), Target) > 1 Then MsgBox "Wert schon vorhanden" Application.Undo ElseIf Application.WorksheetFunction.CountIf(Worksheets("Raumbuch").Range("Tabelle132[Gesamtcode]"), Target) = 0 Then MsgBox "Wert ungültig" Application.Undo End If
Aber nochmals: dies ist kein fertiger Code und hat noch viele Stolpersteine. Und eigentlich sollte man korrekterweise auch über die Listobjects statt über Range gehen.
Und nochmals: mir erschließt sich immer noch nicht, weshalb du über VBA gehen willst anstatt über die Datenüberprüfung. Mit der Datenüberprüfung könntest du sogar in einem Dropdown alle gültigen Einträge (also alle aus Tabelle132 abzüglich der bereits verwendeten) zur Auswahl anbieten.