Clever-Excel-Forum

Normale Version: VBA bei eintrag in eine Tabelle über prüfen ob der Eintrag in vorhanden ist
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
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?
Moin

Keine Ahnung was Beiten Tabelle und FOR Schleifen sind, aber ich würde ZÄHLENWENNS() vorschlagen.
Ich möchte das gern in VBA umsetzten und so vermeiden das falsche bzw. doppelte einträge getätigt werden.
Hi,

auch dafür braucht es kein VBA. Da reicht die Datenüberprüfung in Verbindung mit einer Formel mit zwei ZÄHLENWENNS():

=(ZÄHLENWENNS(TabelleA!A:A;A1)=0)*(ZÄHLENWENNS(TabelleB!A:A;A1)>0)
Ja,

das ist okay... die Prüfung stellt allerdings nur die Einleitung da.
Wenn der eingebene Wert "aktzeptiert" wird sollen ja weitere Aktionen erfolgen.

Im Grunde soll die TabelleA dann automatisch befüllt werden durch mehere Abfragen und Schleifen.
Hi,

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.
Hallo

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
@Gast 123: teste mal deinen Code indem du A1 und dann mit Strg z.B. B3 anklickst und dann irgendwas gefolgt von Strg-Enter eingibst…
(09.11.2023, 16: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...
Hi,

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. 21

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.
Seiten: 1 2