VBA bei eintrag in eine Tabelle über prüfen ob der Eintrag in vorhanden ist
#1
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?
Antworten Top
#2
Moin

Keine Ahnung was Beiten Tabelle und FOR Schleifen sind, aber ich würde ZÄHLENWENNS() vorschlagen.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Antworten Top
#3
Ich möchte das gern in VBA umsetzten und so vermeiden das falsche bzw. doppelte einträge getätigt werden.
Antworten Top
#4
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)
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#5
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.
Antworten Top
#6
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.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#7
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
Antworten Top
#8
@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…
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#9
(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...


Angehängte Dateien
.xlsm   Elektro_Planung_1.xlsm (Größe: 147,23 KB / Downloads: 4)
Antworten Top
#10
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.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste