Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Prüfung auf Doppeleingabe Code macht Probleme

Forumthread: Prüfung auf Doppeleingabe Code macht Probleme

Prüfung auf Doppeleingabe Code macht Probleme
25.04.2026 02:14:49
Sabrina
Hallo,

Ich habe einen Code, welcher mich auf eine Doppeleingabe (Zahl) in Spalte A hinweist, und zwar werden alle 10 TABs überprüft. Aaaaber: Er funktioniert nur einwandfrei, wenn ich eine Testdatei erstelle, und diese neu mit Daten fülle.

Wenn ich dagegen den Code in meiner Originaldatei benutze, dann funktioniert er nur manchmal, ich konnte nicht feststellen, bei welcher Zahl er mir eine Meldung ausgibt oder einen Debugger. Es ist echt zum verrückt werden.

Es ist der einzige Code "in dieser Arbeitsmappe". Es sind keine Gültigkeiten (Datenüberprüfung) und bed. Formatierungen oder spezielle Zellformate vorhanden.

Dann hatte ich schon gedacht, meine Originaldatei ist eine uuuuuuralte .xls die natürlich Versionsabhängig immer mal wieder konvertiert wurde. Also habe ich die einzelen TABs in eine neu Mappe kopiert, dennoch kommt ein Debugger: "Laufzeitfehler 91" und dann wird der folgende Bereich markiert:

MsgBox "Lfd. Nr. " & vntItem & " ist bereits in " & wks.Name & vbNewLine & "in Zelle " & wks.Range(conDetectionRangeAddress).Find(vntItem, , xlValues).Address(0, 0) & " vorhanden!", _
vbExclamation, "A C H T U N G"


Bin echt verzweifelt, weil ich den Fehler einfach nicht finde. Ich würde ja eine Testdatei zur Verfügung stellen, aber da funktioniert er ja.

Bin sehr dankbar über eure Unterstützung. VG Sabrina

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)


' On Error Resume Next

Dim wks As Worksheet
Dim rngIntersect As Range
Dim rngArea As Range
Dim vntItem As Variant

Dim blnExist As Boolean
Dim lngCount As Long

Const conDetectionRangeAddress As String = "A2:A50"

With Target

Set rngIntersect = Intersect(Target, Sh.Range(conDetectionRangeAddress))

If Not rngIntersect Is Nothing Then

For Each wks In Me.Worksheets

lngCount = Abs(wks Is Sh)

For Each rngArea In rngIntersect.Areas

If rngArea.Cells.Count = 1 Then
vntItem = rngArea.Value
blnExist = (WorksheetFunction.CountIf(wks.Range(conDetectionRangeAddress), vntItem) > lngCount)
Else

For Each vntItem In rngArea.Value
blnExist = (WorksheetFunction.CountIf(wks.Range(conDetectionRangeAddress), vntItem) > lngCount)
If blnExist Then: Exit For
Next

End If

If blnExist Then Exit For

Next

If blnExist Then Exit For

Next

If blnExist Then

Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True


MsgBox "Lfd. Nr. " & vntItem & " ist bereits in " & wks.Name & vbNewLine & "in Zelle " & wks.Range(conDetectionRangeAddress).Find(vntItem, , xlValues).Address(0, 0) & " vorhanden!", _
vbExclamation, "A C H T U N G"

End If

End If

End With

Set wks = Nothing
Set rngArea = Nothing
Set rngIntersect = Nothing

End Sub


Anzeige

40
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
25.04.2026 03:18:24
daniel
Hi
vermutlich ist das Problem, dass .Find nichts findet.
wenn du bei .Find mit LookIn:=xlvalues suchst, dann schaut VBA nicht in den unformatierten Zellwerten, sondern in den formatierten Zellwerten.
das ZählenWenns hingegen arbeitet als Formel immer mit den Unformatierten Zellwerten.
Dh. wenn du nach 1,234 suchst und in der durchsuchten Spalte diese Zahl nur als 1,23 angezeigt wird, kann dein .Find sie nicht finden, du müsstest dann nach 1,23 suchen.

mein Tipp: da du nur eine Spalte durchsuchst, kannst du mit Application.Match (Vergleich) arbeiten.
das arbeitet als Formel auch mit den unformatierten Zellwerten und du bekommst auch sofort die Position, wo sich das gesuchte Element befindet.

mit Application.Match bekommst du auch keinen Fehlerabbruch, wenn das Suchelement nicht gefunden wird, sondern einen Fehlerwert, auf den du prüfen kannst.

Beispiel:
dim vntFundstelle as variant

vntFundstelle = Application.Match(vntItem, wks.Range(conDetectionRangeAddress), 0)
if not IsError(vntFundstelle) Then Msgbox "Gefunden in Zeile " & vntFundstelle


und noch ein Tipp:
bei .Find sollte man immer möglichst viele Parameter angeben, zumidest LookAt und LookIn, und ggf auch Matchcase
gibt man die nicht an, dann verwendest du die zuletzt gemachte Einstellung, und das kann dann auch den Effekt haben, dass es manchmal funktioniert und machmal nicht.
Gruß Daniel

Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
26.04.2026 01:04:46
snb
Hier reicht:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If Not Intersect(Target, Range("A10:A50")) Is Nothing Then
For Each it In Sheets
For Each it1 In it.Range("A10:A50").SpecialCells(2, 1)
If Target.Value = it1.Value And Target.Address(, , , True) > it1.Address(, , , True) Then MsgBox "double in " & it1.Address(, , , True), , Target.Address(, , , True)
Next
Next
End If
End Sub

Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
26.04.2026 01:26:53
Sabrina
Hallo snb,

danke für deinen Vorschlag. Ich erhielt die Meldung, "Variable nicht definiert" bei it & it1. Daraufhin habe ich folgendes eingetragen: Dim it As Variant
Dim it1 As Variant.
Ob es korrekt ist? Keine Ahnung - aber es funktioniert 😁. Cool ist auch (Daniel hatte es ja vorgeschlagen) alle Dubletten zu suchen. Auch an deinem Code werde ich morgen noch etwas "basteln". Ist ja wirklich spannend, was ihr so zaubert.
Auch dir lieben Dank.

LG Sabrina
Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
26.04.2026 14:11:55
Alwin Weisangler
Hallo Sabrina,

Mir ist jetzt erst deine Anfrage aufgefallen.
Hier mal ein Weg weitestgehend fehlerbehandelt. und mit Prüfung auf Doppelte im gleichen Blatt.


Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Wks As Worksheet, Z As Range, tmp
If Not Intersect(Target, Range("A10:A10000")) Is Nothing Then
If Target.Text = "" Then Exit Sub
Application.EnableEvents = False
If IsNumeric(Target.Value) Then Target = CDbl(Target.Value)
For Each Wks In Sheets
For Each Z In Wks.Range("A10:A10000").SpecialCells(xlCellTypeConstants)
If Not IsError(Application.Match(Target, Z.Columns(1), 0)) And Z.Parent.Name > Target.Parent.Name Then
tmp = Split(Right(Z.Address(0, 0, , True), Len(Z.Address(0, 0, , True)) - InStrRev(Z.Address(0, 0, , True), "]")), "!")
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & tmp(1) & " im Blatt: " & tmp(0) & " enthalten."
Target = ""
Else
If WorksheetFunction.CountIf(Wks.Columns(1), Target) > 1 Then
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & Wks.Cells(Application.Match(Target, Wks.Columns(1), 0), 1).Address(0, 0) & " im Blatt: " & Target.Parent.Name & " enthalten."
Target = ""
End If
End If
Next
Next
End If
Application.EnableEvents = True
End Sub


Gruß Uwe

Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
26.04.2026 21:07:08
Sabrina
Hey, hallo Uwe,

auch dir vielen Dank für den Code. Habe noch "Target.Select" zugefügt und er funktioniert auch, wie gewünscht.

Dennoch habe ich 1 Frage, vielleicht hast du ja Lust und Zeit diese zu beantworten: WARUM 2x eine MSGBox, wobei, die 2. verstehe ich ja noch, aber die 1. nicht, und zwar in Zusammenhang mit: tmp = Split(Right(Z.Address(0, 0, , True), Len(Z.Address(0, 0, , True)) - InStrRev(Z.Address(0, 0, , True), "]")), "!")

Also nur, wenn es nicht zu kompliziert ist, dann nehme ich es einfach so hin 🧐

Vielen Dank Uwe.

VG Sabrine
Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
26.04.2026 21:25:23
Alwin Weisangler
Hallo Sabrina,

das ist die Prüfung für den Fall, dass beim Schleifendurchlauf Target = Tabellen Tabellenblatt ist. Da wird auch dieses Tabellenblatt auf eventuelle doppelte Werte geprüft.
Naja, die Ausgabe in der MsgBox ist der Weg des geringsten Aufwandes um an die Werte zu kommen.

Dann sind auch solche Fehler behandelt, wenn man einen Wert entfernt, dass Target nicht in einen Fehler läuft. Weiterhin wird geprüft, ob die Eingabe eine echte Zahl und keine Textzahl ist. In der Prüfung IsNumic() = True wird diese in eine echte Zahl umgewandelt. Das stellt sicher, dass die Prüfung .CountIf() nicht fehl schlägt.

Gruß Uwe
Anzeige
Code funktioniert @Uwe
27.04.2026 00:16:04
Sabrina
Hallo Uwe, dein als auch Case sein Code funktionieren einwandfrei. Danke ihr Zwei.

Nun habe ich das Problem, das in "dieserArbeitsmappe" 2 Codes stehen. 1x um Doppeleingabe zu vermeiden und 1x um in einer anderen Mappe zu schauen, ob die Nr. auch dort vorhanden ist.

Seit Stunden versuche ich, diese beiden Codes zu "kombinieren", ich bekomme es einfach nicht hin. Mein Plan ist es, erst zu prüfen, ob die Zahl (Sp. A) überhaupt in der externen Mappe vorhanden ist, wenn nicht, dann die MSGBox-Meldung. Wenn doch, dann prüfen, ob diese Zahl in der aktuellen Mappe bereits vorhanden ist (Doppelt)

In der anhängenden Beispielmappe habe ich den Code von Uwe genommen. Würdest du, Uwe, mir diese korrekt zusammensetzen bitte? Schon einmal vielen vielne Dank im Voraus.

LG Sabrina

https://www.herber.de/bbs/user/180619.xlsm
Anzeige
AW: Code funktioniert @Uwe
27.04.2026 00:52:46
Alwin Weisangler
Hallo Sabina,

ich würde mir morgen die Sache anschauen.

Ich würde um den Code übersichtlich zu halten nicht alles in die eine Prozedur reinpacken, sondern Target als Parameter in die 2. Prozedur übergeben.
Das würde ich dann am besten mit Recordset lösen. Lade bitte mal die zu durchsuchende Mappe noch zusätzlich hoch, damit ich sehe ob das mit Recordset in ein Array lesen und in der/den betreffenden Spalten nach einem eventuell vorhandenen Wert suchen so machbar ist. Das wäre so wie ich es sehe die effektivste Methode.

Gruß Uwe
Anzeige
AW: Code funktioniert @Uwe
27.04.2026 10:59:23
Alwin Weisangler
Hallo Sabrina,

hier der komplette Code incl. der Ergänzung via Recordset:
ins Modul Arbeitsmappe:


Option Explicit
Const extMapPath As String = "C:\Berlin\Test_Otto.xlsm"
Const extSh As String = "Test"

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'Alwin Weisangler klappt super
Dim Wks As Worksheet, Z As Range, tmp
If Not Intersect(Target, Range("A10:A10000")) Is Nothing Then
If Target.Text = "" Then Exit Sub
Application.EnableEvents = False
If IsNumeric(Target.Value) Then Target = CDbl(Target.Value)
For Each Wks In Sheets
For Each Z In Wks.Range("A10:A10000").SpecialCells(xlCellTypeConstants)
If Not IsError(Application.Match(Target, Z.Columns(1), 0)) And Z.Parent.Name > Target.Parent.Name Then
tmp = Split(Right(Z.Address(0, 0, , True), Len(Z.Address(0, 0, , True)) - InStrRev(Z.Address(0, 0, , True), "]")), "!")
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & tmp(1) & " " & tmp(0) & " enthalten!", vbExclamation, "A C H T U N G"
Target = ""
Target.Select
Else
If WorksheetFunction.CountIf(Wks.Columns(1), Target) > 1 Then
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & Wks.Cells(Application.Match(Target, Wks.Columns(1), 0), 1).Address(0, 0) & " " & Target.Parent.Name & " enthalten!", vbExclamation, "A C H T U N G"


Target = ""
Target.Select
End If
End If
Next
Next
End If
Application.EnableEvents = True
Call AbgleichExtern(Target)
End Sub

Sub AbgleichExtern(lfdNr As Variant)
Dim rs As Object, arr, i&, k&, datN
Set rs = CreateObject("ADODB.Recordset")
With rs
.CursorLocation = 3
.CursorType = 3
.Open "SELECT * FROM [" & extSh & "$]", "Provider=Microsoft.ACE.OLEDB.12.0;" & "Extended Properties=""Excel 12.0 xml"";" & "Data Source= " & extMapPath
If (.EOF And .BOF) = False Then
arr = .GetRows
End If
.Close
End With
Set rs = Nothing
For i = LBound(arr, 2) To UBound(arr, 2)
If IsNumeric(arr(2, i)) Then arr(2, i) = CDbl(arr(2, i))
If arr(2, i) = lfdNr Then k = k + 1
Next i
datN = Right(extMapPath, Len(extMapPath) - InStrRev(extMapPath, "\"))
If k = 0 Then MsgBox "Lfd. Nummer " & lfdNr & " ist nicht in Datei: " & datN & "! vorhanden", vbOKOnly, "Fehler!!!"
End Sub

Eigentlich könnte man, wenn es ein Listobjekt wäre bzw. die Spaltenüberschriften in der 1. Zeile stehen würden, ganz kurz mit einem SQL-Suchstring machen. Leider lässt das dein Tabellenaufbau so nicht zu.
https://www.herber.de/bbs/user/180622.xlsm

Gruß Uwe
Anzeige
Code funktioniert nicht @Uwe
27.04.2026 21:52:47
Sabrina
Hallo Uwe, vielen Dank für den Code ... aber ...

Nr. 1199 ist in beiden Dateien vorhanden.
Gebe ich sie dennoch ein, erscheint MSGBox "ist bereits in TB ... vorhanden" ==> Das ist ja ok aber danach kommt die MSGBox: "Ist nicht in Test_Otto" vorhanden. ==> Das ist falsch, da sie vorhanden ist.

LG Sabrina

Anzeige
AW: Code funktioniert nicht @Uwe
27.04.2026 23:21:31
Alwin Weisangler
Hallo Sabrina,

die 1199 wird in der externen Datei gefunden. Ich hatte mich mit der Ausgabe der MsgBox an deiner auskommentierten Version orientiert. Diese war so angelegt, dass die MsgBox gestartet wird, wenn kein Treffer vorhanden ist.

Wenn die MsgBox bei Treffer gestartet werden soll, muss in der Prozedur: Sub AbgleichExtern(lfdNr As Variant)
diese Zeile so geändert werden:


If k > 0 Then MsgBox "Lfd. Nummer " & lfdNr & " ist in Datei: " & datN & "! vorhanden", vbOKOnly, "Hinweis"

Der Rest bleibt unverändert. Einzig wenn im Eingabeblatt der eingegeben Wert, weil bereits vorhanden wieder entfernt wird, ist Target leer. Damit wird natürlich auch nichts in der externen Datei gefunden.

Ich hatte da jetzt kein Problem darin gesehen, da diese Nummer ja sowieso wieder entfernt wurde. Sollte dies zwingend anders sein, musst du mir das nochmal mitteilen.
Für dich zum Analysieren:
-Öffne im VBA Editor das Lokalfenster im Menü "Ansicht"
- Klicke mit der Maus in diese Zeile: Call AbgleichExtern(Target) und drücke F9. Damit wird der Haltepunkt gesetzt (roter Punkt)
- Trage 1199 in eine Zelle SpalteA ein. --> wechsle in den VBA-Editor und schaue ins Lokalfenster in Variable arr klicke aufs Plus Zeichen. Da siehst du den Inhalt des Arrays.

Mit F5 steppen kannst du Schritt für Schritt dich durch Schleife steppen. Dann siehst du, wenn k bei Treffer hochzählt.
Schau dir das mal in Ruhe so an. Damit kann man sehr gut überprüfen, wenn was nicht klappt wo die Zusammenhänge nicht passen.

Gruß Uwe



Anzeige
Wenn ich dich...
28.04.2026 01:39:52
Case
Moin Sabrina, :-)

... richtig verstanden habe, dann so: ;-)

Option Explicit

Const strPath As String = "C:\Temp\"
Const strFile As String = "180621.xlsm"
Const strSheet As String = "Test"
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim blnDoppelt As Boolean
Dim wksSheet As Worksheet
Dim varMatch As Variant
Dim lngNr As Long
On Error GoTo Fin
If Not Intersect(Target, Sh.Range("A10:A1000")) Is Nothing Or Not Target.CountLarge > 1 Or Not Target = "" Then
Application.EnableEvents = False
lngNr = Target.Value
For Each wksSheet In Worksheets
varMatch = Application.Match(Target.Value, wksSheet.Range("A10:A10000"), 0)
If Not IsError(varMatch) Then
If wksSheet.Name > Sh.Name Or varMatch + 9 > Target.Row Then
MsgBox "Lfd. Nr. " & Target & " bereits vorhanden in " & wksSheet.Name & " A" & varMatch + 9, vbExclamation
Target = ""
Target.Select
blnDoppelt = True
Exit For
End If
End If
Next wksSheet
If blnDoppelt Then
If IsError(ExecuteExcel4Macro("MATCH(" & lngNr & ",'" & strPath & "[" & strFile & "]" & strSheet & "'!R9C3:R2000C3,0)")) Then MsgBox "Nummer " & lngNr & " in " & strFile & " nicht vorhanden!"
End If
End If
Fin:
Application.EnableEvents = True
End Sub


Ist mit deiner (externen) Beispieldatei (180621.xlsm) getestet. ;-)

Anpassen musst du die drei Const. ;-)
Und das hier "R9C3:R2000C3" sucht in der externen Datei in Spalte C von Zeile 9 bis 2000. ;-)
R = Row und C = Column. ;-)

Servus
Case

Anzeige
AW: Wenn ich dich...
28.04.2026 23:23:24
Sabrina
Moin Case 😅

danke für deinen Code, ich werde ihn gleich mal ausprobieren - grippebedingt hänge ich nur gerade etwas in den Seilen -😤🙄

LG Sabrina
Also - mit...
29.04.2026 00:10:38
Case
Moin Sabrina, :-)

... Grippe ist nicht zu spaßen. ;-)

Lieber ausruhen. ;-)

Wenn nicht nur "Doppler", sondern jede Eingabe einer Zahl in der "externen" Datei (Test_Otto.xlsm) geprüft werden soll, dann lass das blnDoppelt-Zeug weg. ;-)

Option Explicit

Const strPath As String = "C:\Temp\"
Const strFile As String = "Test_Otto.xlsm"
Const strSheet As String = "Test"
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim wksSheet As Worksheet
Dim varMatch As Variant
Dim lngNr As Long
On Error GoTo Fin
If Not Intersect(Target, Sh.Range("A10:A1000")) Is Nothing Or Not Target.CountLarge > 1 Or Not Target = "" Then
Application.EnableEvents = False
lngNr = Target.Value
For Each wksSheet In Worksheets
varMatch = Application.Match(Target.Value, wksSheet.Range("A10:A10000"), 0)
If Not IsError(varMatch) Then
If wksSheet.Name > Sh.Name Or varMatch + 9 > Target.Row Then
MsgBox "Lfd. Nr. " & Target & " bereits vorhanden in " & wksSheet.Name & " A" & varMatch + 9, vbExclamation
Target = ""
Target.Select
Exit For
End If
End If
Next wksSheet
If IsError(ExecuteExcel4Macro("MATCH(" & lngNr & ",'" & strPath & "[" & strFile & "]" & strSheet & "'!R9C3:R2000C3,0)")) Then MsgBox "Nummer " & lngNr & " in " & strFile & " nicht vorhanden!"
End If
Fin:
Application.EnableEvents = True
End Sub


Servus
Case
Anzeige
AW: Also - mit...
30.04.2026 02:04:35
Sabrina
Hallo Case,

deinen Code habe ich noch nicht ausprobiert, werde ich aber, um zu lernen.

Vielen lieben Dank auch dir für deine Mühe.

Dir und allen Foristen einen schönen/lustigen "Tanz in den Mai" 😉

LG Sabrina
AW: Code funktioniert nicht @Uwe
28.04.2026 00:03:25
Sabrina
Hallo Uwe

"... Diese war so angelegt, dass die MsgBox gestartet wird, wenn kein Treffer vorhanden ist. " ==> das ist völlig korrekt. Heißt =0 passt.

Wenn ich nun eine Nr. eintrage, die sowohl in der aktuellen als auch in der externen vorhanden ist, passiert folgendes:

MSGBox "Nr. ist bereits in xy vorhanden" ==> das ist auch völlig korrekt

Wenn ich diese Meldung aber bestätige, erscheint die MSGBox: "Nr. ist nicht in der Datei xy vorhanden" ==> diese Meldung darf nicht erscheinen, da sie vorhanden ist.

Lediglich, wenn die Nr. NICHT in der externen Datei ist, dass soll o.g. erscheinen.

Sorry Uwe, dass ich dich "nerve" - bin dir sehr dankbar für deine Unterstützung.

LG Sabrina
Anzeige
AW: Code funktioniert nicht @Uwe
28.04.2026 00:49:19
Alwin Weisangler
Hallo Sabrina,

ich habe zwecks Test MasterDatei (Datei mit den beiden Prozeduren) im Blatt "TB02" 227 eingegeben. Da wird, da dieser Eintrag in der Masterdatei zum ersten mal eingetragen wurde, keine MsgBox gestartet. Grund: in der externen Datei existiert in Spalte C diese Nummer.

Trage ich jetzt im Blatt "TB01" eine 227 ein kommt MsgBox mit Hinweis dass diese Nummer bereits im Blatt "TB02" vergeben ist und entfernt den Eintrag. Mehr passiert hier nicht, weil dies so programmiert ist.

Was du mir bescheibst, kann ich egal was ich hier mache nicht nachvollziehen. Schlicht dies passiert so nicht.
Lade bitte ein Beispiel (beide Dateien in eine Zip packen), nebst eindeutiger Zuordnung in der Fehlerbeschreibung bitte nochmals hier hoch.

So kann ich mir den Vorgang in Ruhe analysieren, wenn es passiert.

vorsorglich hier mal noch die beiden Prozeduren von mir geändert auf frühe übergabe des Target.Value in Variable vTar (das hatte ich im vorherigen Artikel mitgeteilt und damit habe ich eben getestet):


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Wks As Worksheet, Z As Range, tmp, vTar ' vTar für den Fall das Target früh gelesen werden soll
If Not Intersect(Target, Range("A10:A10000")) Is Nothing Then
If Target.Text = "" Then Exit Sub
Application.EnableEvents = False
vTar = Target ' frühes Übergeben des Target.Value
If IsNumeric(Target.Value) Then Target = CDbl(Target.Value)
For Each Wks In Sheets
For Each Z In Wks.Range("A10:A10000").SpecialCells(xlCellTypeConstants)
If Not IsError(Application.Match(Target, Z.Columns(1), 0)) And Z.Parent.Name > Target.Parent.Name Then
tmp = Split(Right(Z.Address(0, 0, , True), Len(Z.Address(0, 0, , True)) - InStrRev(Z.Address(0, 0, , True), "]")), "!")
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & tmp(1) & " " & tmp(0) & " enthalten!", vbExclamation, "A C H T U N G"
Target = ""
Target.Select
Else
If WorksheetFunction.CountIf(Wks.Columns(1), Target) > 1 Then
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & Wks.Cells(Application.Match(Target, Wks.Columns(1), 0), 1).Address(0, 0) & " " & Target.Parent.Name & " enthalten!", vbExclamation, "A C H T U N G"
Target = ""
Target.Select
End If
End If
Next
Next
End If
Application.EnableEvents = True
Call AbgleichExtern(vTar) 'für den Fall das Target spät gelesen werden soll dann: Call AbgleichExtern(Target)
End Sub

Sub AbgleichExtern(lfdNr As Variant)
Dim rs As Object, arr, i&, k&, datN
Set rs = CreateObject("ADODB.Recordset")
With rs
.CursorLocation = 3
.CursorType = 3
.Open "SELECT * FROM [" & extSh & "$]", "Provider=Microsoft.ACE.OLEDB.12.0;" & "Extended Properties=""Excel 12.0 xml"";" & "Data Source= " & extMapPath
If (.EOF And .BOF) = False Then
arr = .GetRows
End If
.Close
End With
Set rs = Nothing
For i = LBound(arr, 2) To UBound(arr, 2)
If IsNumeric(arr(2, i)) Then arr(2, i) = CDbl(arr(2, i))
If arr(2, i) = lfdNr Then k = k + 1
Next i
datN = Right(extMapPath, Len(extMapPath) - InStrRev(extMapPath, "\"))
If k = 0 Then MsgBox "Lfd. Nummer " & lfdNr & " ist in Datei: " & datN & "! vorhanden", vbOKOnly, "Fehler!!!"
End Sub



Gruß Uwe


Anzeige
AW: Code funktioniert nicht @Uwe
28.04.2026 23:09:25
Sabrina
Hallo Uwe,

genau so soll es ja auch sein:

"Trage ich jetzt im Blatt "TB01" eine 227 ein kommt MsgBox mit Hinweis dass diese Nummer bereits im Blatt "TB02" vergeben ist und entfernt den Eintrag. Mehr passiert hier nicht, weil dies so programmiert ist. "

Es ist echt zum verrückt werden, denn mit deinem neuen Code, erfolgt keine Abfrage mehr. Ich verstehe es nicht!!!!!!

https://www.herber.de/bbs/user/180634.zip

Ich danke dir.

VG Sabrina

Anzeige
AW: Code funktioniert nicht @Uwe
28.04.2026 23:33:46
Alwin Weisangler
Hallo Sabrina,

um diesen Fehler aus dem Weg zu gehen habe ich diese Zeile geändert:


For Each Z In Wks.Range("A10:A10000").SpecialCells(xlCellTypeConstants)

in:


For Each Z In Wks.Range("A10:A" & Wks.Cells(Rows.Count, 1).End(xlUp).Row)

Damit ist das Problem vom Tisch. Falls beim Basteln es mal zu einem Fehler kommt, reicht diese kleine Prozedur um die Events wieder einzuschalten, ohne gleich die Datei schließen zu müssen:


Sub EventEinschalten()
Application.EnableEvents = True
End Sub

Ich gehe so gut es geht On Error aus dem Wege.
https://www.herber.de/bbs/user/180635.xlsm

Gruß Uwe
Anzeige
Es ist zum verrückt werden @Uwe
29.04.2026 00:51:14
Sabrina
Hallo Uwe,

ich weiß auch nicht, was "mein" Excel heute gegen mich hat!! Jedenfalls, habe ich Excel geschlossen, wieder geöffnet und dann funktioniert dein Code (ach ja, und MSGBox gehörte ein NICHT rein) Das ist mir ja jetzt doch ziemlich peinlich - weil du dir echt soooo viel Mühe gibst.

Ich möchte gerne noch nach dieser Meldung:

If k = 0 Then MsgBox "Lfd. Nummer " & lfdNr & " ist NICHT in Datei: " & datN & "! vorhanden", vbOKOnly, "Fehler!!!"

dass die Zelle geleert und zurückgesprungen wird. Mit Target=""/Target.Select funktioniert es nicht, da Variable nicht definiert.

Danke dir Uwe. LG Sabrina
Anzeige
AW: Es ist zum verrückt werden @Uwe
29.04.2026 10:26:39
Alwin Weisangler
Hallo Sabrina,

das ist leider völlig unklar beschrieben, was du möchtest.
Wenn in der externen Datei (Test_Otto.xlsm) kein Wert gefunden wurde soll in der Arbeitsdatei, der eingetragene Wert daraufhin entfernt und diese Zelle selektiert werden?
Oder habe ich das falsch verstanden?

Gruß Uwe
Anzeige
AW: Es ist zum verrückt werden @Uwe
29.04.2026 15:45:00
Sabrina
Hallo Uwe, ja richtig.
LG Sabrina
AW: Es ist zum verrückt werden @Uwe
29.04.2026 17:41:41
Alwin Weisangler
Hallo Sabrina,

die Anpassungen in den beiden Prozeduren wären dann so:


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Wks As Worksheet, Z As Range, tmp, vTar As Range ' vTar für den Fall das Target früh gelesen werden soll
If Not Intersect(Target, Range("A10:A10000")) Is Nothing Then
If Target.Text = "" Then Exit Sub
Application.EnableEvents = False
Set vTar = Target ' frühes Übergeben des Target.Value
If IsNumeric(Target.Value) Then Target = CDbl(Target.Value)
For Each Wks In Sheets
For Each Z In Wks.Range("A10:A" & Wks.Cells(Rows.Count, 1).End(xlUp).Row)
If Not IsError(Application.Match(Target, Z.Columns(1), 0)) And Z.Parent.Name > Target.Parent.Name Then
tmp = Split(Right(Z.Address(0, 0, , True), Len(Z.Address(0, 0, , True)) - InStrRev(Z.Address(0, 0, , True), "]")), "!")
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & tmp(1) & " " & tmp(0) & " enthalten!", vbExclamation, "A C H T U N G"
Target = ""
Target.Select
Else
If WorksheetFunction.CountIf(Wks.Columns(1), Target) > 1 Then
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & Wks.Cells(Application.Match(Target, Wks.Columns(1), 0), 1).Address(0, 0) & " " & Target.Parent.Name & " enthalten!", vbExclamation, "A C H T U N G"
Target = ""
Target.Select
End If
End If
Next
Next
End If
Application.EnableEvents = True
Call AbgleichExtern(vTar) 'für den Fall das Target spät gelesen werden soll dann: Call AbgleichExtern(Target)
End Sub

Sub AbgleichExtern(lfdNr As Range)
Dim rs As Object, arr, i&, k&, datN
Set rs = CreateObject("ADODB.Recordset")
With rs
.CursorLocation = 3
.CursorType = 3
.Open "SELECT * FROM [" & extSh & "$]", "Provider=Microsoft.ACE.OLEDB.12.0;" & "Extended Properties=""Excel 12.0 xml"";" & "Data Source= " & extMapPath
If (.EOF And .BOF) = False Then
arr = .GetRows
End If
.Close
End With
Set rs = Nothing
For i = LBound(arr, 2) To UBound(arr, 2)
If IsNumeric(arr(2, i)) Then arr(2, i) = CDbl(arr(2, i))
If arr(2, i) = lfdNr.Value Then k = k + 1
Next i
datN = Right(extMapPath, Len(extMapPath) - InStrRev(extMapPath, "\"))
If k = 0 Then
MsgBox "Lfd. Nummer " & lfdNr.Value & " ist nicht in Datei: " & datN & "! vorhanden", vbOKOnly, "Fehler!!!"
Application.EnableEvents = False
lfdNr = ""
lfdNr.Activate
Application.EnableEvents = True
End If
End Sub


Gruß Uwe
Anzeige
AW: Es ist zum verrückt werden @Uwe
29.04.2026 20:25:55
Sabrina
Hallo Uwe,

mit deinem neuen Code funktioniert es leider nicht. Jetzt ist das Problem wie vorher:

Korrekt ist: Eingabe einer lfd.Nr. die NICHT in der Abgleich-Datei steht und NICHT doppelt ist = MSGBox "... nicht in Datei vorhanden...", Zelle wird geleert

Korrekt ist: Eingabe einer lfd.Nr. die NICHT in der Abgleich-Datei steht aber doppelt ist = 2x MSGBox "... bereits in Zelle vorhanden ..." / "... nicht in Datei vorhanden..., Zelle wird geleert (das passiert schon mal, wenn ich vergesse die Zellen vorher zu löschen)

NICHT korrekt: Eingabe einer lfd.Nr. die bereits vorhanden UND auch in der AbgleichDatei steht ==> 2x MSGBox "... bereits in Zelle vorhanden ..." / "... nicht in Datei vorhanden..., Zelle wird geleert
Hier darf die 2. Meldung nicht erscheinen.

Hintergrund ist folgender:
Vorarbeiter drückt mir einen Zettel in die Hand mit Aufträgen, zugeordnet der lfd. Nr., welche ich dann in Tab1 (Montag) oder Tab2 (Dienstag) plane. Also 4311 am Montag, 4712 am Dienstag usw.

In der beigefügten Datei ist die Reihenfolge etc. korrekt, lediglich bei Eingabe einer lfd. Nr, die NICHT in der AbgleichDatei steht, wird die Zelle NICHT geleert - ich hätte das jetzt auch mit "Target=""/Target.Select" gelöst aber das funktionierte nicht (MSGBox ist auch korrekt) Ansonsten passt alles.

https://www.herber.de/bbs/user/180645.xlsm

Vielleicht magst du ja noch mal schauen - tut mir echt leid, dass diese "Sache" so unendlich ist 🤔

LG Sabrina



Anzeige
AW: Es ist zum verrückt werden @Uwe
29.04.2026 23:52:35
Alwin Weisangler
Hallo Sabrina,

ich hoffe ich habe es richtig verstanden.
Teste mal:


Option Explicit
Const extMapPath As String = "C:\Berlin\Test_Otto.xlsm"
Const extSh As String = "Test"
Private Sperre As Boolean

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Wks As Worksheet, Z As Range, tmp, vTar As Range ' vTar für den Fall das Target früh gelesen werden soll
If Not Intersect(Target, Range("A10:A10000")) Is Nothing Then
If Target.Text = "" Then Exit Sub
Application.EnableEvents = False
Set vTar = Target ' frühes Übergeben des Target.Value
If IsNumeric(Target.Value) Then Target = CDbl(Target.Value)
For Each Wks In Sheets
For Each Z In Wks.Range("A10:A" & Wks.Cells(Rows.Count, 1).End(xlUp).Row)
If Not IsError(Application.Match(Target, Z.Columns(1), 0)) And Z.Parent.Name > Target.Parent.Name Then
tmp = Split(Right(Z.Address(0, 0, , True), Len(Z.Address(0, 0, , True)) - InStrRev(Z.Address(0, 0, , True), "]")), "!")
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & tmp(1) & " " & tmp(0) & " enthalten!", vbExclamation, "A C H T U N G"
Target = ""
Target.Select
Sperre = True
Else
If WorksheetFunction.CountIf(Wks.Columns(1), Target) > 1 Then
MsgBox "Die Lfd. Nr. " & Target & " ist bereits in Zelle: " & vbNewLine & Wks.Cells(Application.Match(Target, Wks.Columns(1), 0), 1).Address(0, 0) & " " & Target.Parent.Name & " enthalten!", vbExclamation, "A C H T U N G"
Target = ""
Target.Select
End If
End If
Next
Next
End If
Application.EnableEvents = True
Call AbgleichExtern(vTar) 'für den Fall das Target spät gelesen werden soll dann: Call AbgleichExtern(Target)
End Sub

Sub AbgleichExtern(lfdNr As Range)
Dim rs As Object, arr, i&, k&, datN
Set rs = CreateObject("ADODB.Recordset")
With rs
.CursorLocation = 3
.CursorType = 3
.Open "SELECT * FROM [" & extSh & "$]", "Provider=Microsoft.ACE.OLEDB.12.0;" & "Extended Properties=""Excel 12.0 xml"";" & "Data Source= " & extMapPath
If (.EOF And .BOF) = False Then
arr = .GetRows
End If
.Close
End With
Set rs = Nothing
For i = LBound(arr, 2) To UBound(arr, 2)
If IsNumeric(arr(2, i)) Then arr(2, i) = CDbl(arr(2, i))
If arr(2, i) = lfdNr.Value Then k = k + 1
Next i
datN = Right(extMapPath, Len(extMapPath) - InStrRev(extMapPath, "\"))
If k = 0 Then
If Sperre = False Then MsgBox "Lfd. Nummer " & lfdNr.Value & " ist nicht in Datei: " & datN & "! vorhanden", vbOKOnly, "Fehler!!!"
Sperre = False
Application.EnableEvents = False
lfdNr = ""
lfdNr.Activate
Application.EnableEvents = True
End If
End Sub


Gruß Uwe
Anzeige
Ich werd' verrückt ... es funktioniert :-) @Uwe
30.04.2026 01:59:41
Sabrina
Hallo Uwe,

war das ein langer Weg ... freue mich so sehr, dass ich meine Grippe ganz vergesse :-) Danke Danke Danke

Morgen Abend werde ich es ins Original übertragen - puuuhh, bin ich erleichtert, das spart mir sooooo viel Zeit.

Ich danke dir lieber Uwe und wünsche dir noch einen schönen Abend.

LG Sabrina
Anzeige
AW: Ich werd' verrückt ... es funktioniert :-) @Uwe
30.04.2026 10:20:27
Alwin Weisangler
Gerne und Gute Besserung.

Gtuß Uwe
Das würde dann, ...
29.04.2026 18:00:02
Case
Moin Sabrina, :-)

... wenn ich dich richtig verstanden habe, mit meinem Code so gehen: ;-)

Option Explicit

Const strPath As String = "C:\Temp\"
Const strFile As String = "Test_Otto.xlsm"
Const strSheet As String = "Test"
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim wksSheet As Worksheet
Dim varMatch As Variant
Dim lngNr As Long
On Error GoTo Fin
If Not Intersect(Target, Sh.Range("A10:A1000")) Is Nothing Or Not Target.CountLarge > 1 Or Not Target = "" Then
Application.EnableEvents = False
lngNr = Target.Value
For Each wksSheet In Worksheets
varMatch = Application.Match(Target.Value, wksSheet.Range("A10:A10000"), 0)
If Not IsError(varMatch) Then
If wksSheet.Name > Sh.Name Or varMatch + 9 > Target.Row Then
MsgBox "Lfd. Nr. " & Target & " bereits vorhanden in " & wksSheet.Name & " A" & varMatch + 9, vbExclamation
Target = ""
Target.Select
Exit For
End If
End If
Next wksSheet
If IsError(ExecuteExcel4Macro("MATCH(" & lngNr & ",'" & strPath & "[" & strFile & "]" & strSheet & "'!R9C3:R2000C3,0)")) Then
MsgBox "Nummer " & lngNr & " in " & strFile & " nicht vorhanden!"
Target = ""
Target.Select
End If
End If
Fin:
Application.EnableEvents = True
End Sub


Servus
Case
Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
25.04.2026 20:59:45
Sabrina
Hallo Daniel, zuerst einmal sorry, dass ich mich so spät melde.

Und vielen Dank für deine Antwort. Ich habe versucht, deinen Code einzubauen und die "Variable" vntItem in vntFundstelle zu ersetzen. Ich kenne mich mit Programmierung leider nicht aus, versuche aber zu verstehen.

Ergebnis: Tatsächlich kann ich jetzt die Zahlen (übrigens immer Ganzzahl Format Standard) eingeben, ohne Debugger. ABER eine Doppelteingabe wird lediglich gelöscht, ohne MSGBox -Hinweis.

Würdest du deinen Code in meinen einbauen bitte?

Parallel versuche ich mal, meine Original-Datei zu anonymisieren und hier einzustellen.

Danke Daniel.
VG Sabrina
Anzeige
AW: Prüfung auf Doppeleingabe Code macht Probleme
25.04.2026 22:17:36
Daniel
Wenn du dich mit Programmierung nicht auskennst, wie hast du dann den Code geschrieben, den du uns gezeigt hast?
@Daniel
26.04.2026 19:08:50
Sabrina
Hallo Daniel,

"... Wenn du dich mit Programmierung nicht auskennst, wie hast du dann den Code geschrieben, den du uns gezeigt hast? "

den Code habe ich "gegoogelt" und dann soweit meine Kenntnisse sind, auf meine Anforderung angepasst.

VG Sabrina

@alle anderen fleißigen Helfer: Ich wurstel mich jetzt mal durch eure Codes und melde mich später noch einmal. Lieben Dank!

Anzeige
Jetzt mit Testdatei
25.04.2026 22:18:25
Sabrina
Hallo,
folgend meine Testdatei, in der es nicht funktioniert. Vielleicht einfacher zum korrigieren.

Vielen lieben Dank an alle Unterstützer.

LG Sabrina

https://www.herber.de/bbs/user/180616.xlsm

AW: Jetzt mit Testdatei
25.04.2026 23:10:54
Daniel
Hab am WE nur das Handy, da ist es schlecht mit programmieren.

Wenn die durchsuchen Werte Konstanten sind (keine Formeln), reicht es vielleicht aus, wenn im .FIND umstellst von xlValues auf xlFormulas.

Dann sucht Excel in den Formeltexten, aber bei Konstanten sind Formel und Wert identisch und die Formatierung spielt keine Rolle.

Gruß Daniel
Anzeige
AW: Jetzt mit Testdatei
25.04.2026 23:23:39
Sabrina
Hallo Daniel, funktioniert leider nicht, mit xlFormulas erfolgt überhaupt keine Prüfung.

VG Sabrina
AW: Jetzt mit Testdatei und nur VBA
26.04.2026 00:11:32
Ulf
Hi Sabrina,
da du sowieso VBA verwendest, lies die Zellen in ein Array, dann kannst du die Suche voll beeinflussen. Solange due keine Fantastilliarden an Zellen vererbeitest geht das flott genug.
In deiner Datei getestet und tut
Option Explicit


Dim wb As Workbook
Dim wks As Worksheet
Dim rg As Range
Dim lngTabelle As Long
Dim lngTabellen As Long
Dim lngZähler As Long
Dim lngZeilen As Long
Dim arrZellen '(9, 49)
Dim strRange As String '
Dim bGelesen As Boolean

Private Sub Workbook_Open()
bGelesen = leseZellen()
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim strRg As String
Dim strTabelle As String
strTabelle = CStr(Sh.Name)
strRg = CStr(Target.Address)
If bGelesen Then
If Target.Cells.Count = 1 Then
For lngTabelle = 0 To lngTabellen - 1
For lngZähler = 0 To lngZeilen
If Target.Value = arrZellen(lngTabelle, lngZähler) Then
Set wks = ThisWorkbook.Worksheets(lngTabelle + 1)
Set rg = wks.Range(strRange).Cells(lngZähler + 1)
MsgBox "Der Wert " & Target.Value & " steht schon in " & wks.Name & " in Zelle " & rg.Address
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
Exit Sub
End If
Next lngZähler
Next lngTabelle
Else
'Bei Arrays muss zuerst dass Array selbst auf Duplikate untersucht werden
'bspw for each zelle in Target.cells ...
'
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
End If
End If
End Sub

Public Function leseZellen() As Boolean
On Error GoTo leseZellenERR
Dim bRet As Boolean
Set wb = ThisWorkbook
'ANPASSEN
lngTabellen = wb.Worksheets.Count
lngZeilen = 100
'ANPASSEN
strRange = "A11:A" & (11 + lngZeilen)
ReDim arrZellen(lngTabellen, lngZeilen)
For lngTabelle = 1 To lngTabellen '10
Set wks = wb.Worksheets(lngTabelle)
Set rg = wks.Range(strRange)
For lngZähler = 1 To 49
arrZellen(lngTabelle - 1, lngZähler - 1) = rg.Cells(lngZähler)
Next lngZähler
Next lngTabelle
leseZellen = True
leseZellenOUT:
Exit Function
leseZellenERR:
leseZellen = False
Resume leseZellenOUT
End Function

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
bGelesen = leseZellen()
End Sub

hth
Ulf
Anzeige
Eigentlich reicht es, ...
26.04.2026 00:19:35
Case
Moin, :-)

... wenn du Daniels Vorschlag so umsetzt (in deiner Beispieldatei getestet): ;-)

MsgBox "Lfd. Nr. " & vntItem & " ist bereits in  " & wks.Name & vbNewLine & "in A" & Application.Match(vntItem, wks.Range(conDetectionRangeAddress), 0) + 9 & "  vorhanden!", vbExclamation, "A C H T U N G"


Oder auch so: ;-)

Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim wksSheet As Worksheet
Dim blnTMP As Boolean
Dim rngRange As Range
Dim varTMP As Variant
On Error GoTo Fin
Set Target = Intersect(Target, Sh.Range("A10:A200"))
If Not Target Is Nothing Then
Application.EnableEvents = False
For Each rngRange In Target
If rngRange > "" Then
For Each wksSheet In Worksheets
varTMP = Application.Match(rngRange.Value, wksSheet.Range("A10:A" & wksSheet.Cells(Rows.Count, 1).End(xlUp).Row), 0)
If Not IsError(varTMP) Then
If wksSheet.Name > Sh.Name Or varTMP + 9 > rngRange.Row Then
MsgBox "Lfd. Nr. " & rngRange.Value & " schon vorhanden in '" & wksSheet.Name & "' A" & varTMP + 9, vbExclamation
Application.Undo
blnTMP = True
Exit For
End If
End If
Next wksSheet
End If
If blnTMP Then Exit For
Next rngRange
End If
Fin:
Application.EnableEvents = True
End Sub


Da ist jetzt noch nicht berücksichtigt, wenn schon in den eingefügten Daten Dubletten sind. Brauchst du das auch? ;-)

Bin gerade beim Snooker schauen - deshalb nur so. ;-)

Servus
Case
Anzeige
AW: Eigentlich reicht es, ...
26.04.2026 00:58:42
Sabrina
Da habe ich doch glatt erst einmal geschaut, wo Snooker läuft - sind ja ganz schön viele rote Kugeln 😂

Hallo Case - passt perfekt!

ich habe deinen Code übernommen, den von Daniel bekomme ich einfach nicht korrekt eingefügt (da fehlen mir einfach die Programmierkenntnisse - obwohl Daniel es ja gut beschrieben hat).

Schon eingefügte Dubletten interessieren mich nicht, da jeden morgen das Blatt geleert wird.

Morgen werde ich den Code auf das Original eintragen. Sowie den berteits vorhandenen in "dieseArbeitsmappe" mit einbinden, falls ich das hinkriege. Ich melde mich morgen noch einmal.

Vielen Dank an Daniel und an dich - habt alle einen schönen Abend.

LG Sabrina
Anzeige
AW: Jetzt mit Testdatei und nur VBA
26.04.2026 00:12:57
Ulf
kl ERROR mit 49
Option Explicit


Dim wb As Workbook
Dim wks As Worksheet
Dim rg As Range
Dim lngTabelle As Long
Dim lngTabellen As Long
Dim lngZähler As Long
Dim lngZeilen As Long
Dim arrZellen '(9, 49)
Dim strRange As String '
Dim bGelesen As Boolean

Private Sub Workbook_Open()
bGelesen = leseZellen()
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim strRg As String
Dim strTabelle As String
strTabelle = CStr(Sh.Name)
strRg = CStr(Target.Address)
If bGelesen Then
If Target.Cells.Count = 1 Then
For lngTabelle = 0 To lngTabellen - 1
For lngZähler = 0 To lngZeilen
If Target.Value = arrZellen(lngTabelle, lngZähler) Then
Set wks = ThisWorkbook.Worksheets(lngTabelle + 1)
Set rg = wks.Range(strRange).Cells(lngZähler + 1)
MsgBox "Der Wert " & Target.Value & " steht schon in " & wks.Name & " in Zelle " & rg.Address
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
Exit Sub
End If
Next lngZähler
Next lngTabelle
Else
'Bei Arrays muss zuerst dass Array selbst auf Duplikate untersucht werden
'bspw for each zelle in Target.cells ...
'
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
End If
End If
End Sub

Public Function leseZellen() As Boolean
On Error GoTo leseZellenERR
Dim bRet As Boolean
Set wb = ThisWorkbook
'ANPASSEN
lngTabellen = wb.Worksheets.Count
lngZeilen = 100
'ANPASSEN
strRange = "A11:A" & (11 + lngZeilen)
ReDim arrZellen(lngTabellen, lngZeilen)
For lngTabelle = 1 To lngTabellen '10
Set wks = wb.Worksheets(lngTabelle)
Set rg = wks.Range(strRange)
For lngZähler = 1 To lngZeilen
arrZellen(lngTabelle - 1, lngZähler - 1) = rg.Cells(lngZähler)
Next lngZähler
Next lngTabelle
leseZellen = True
leseZellenOUT:
Exit Function
leseZellenERR:
leseZellen = False
Resume leseZellenOUT
End Function

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
bGelesen = leseZellen()
End Sub
Anzeige
AW: Jetzt mit Testdatei und nur VBA
26.04.2026 01:11:56
Sabrina
Hallo Ulf, deinen Beitrag gerade erst gelesen. Vielen lieben Dank auch dir für deine Mühe.
Dein Code funktioniert auch einwandfrei.
Ihr seid schon klasse.

Morgen werde ich dann alles in Ruhe im Original testen.

Auch dir einen schönen Abend.
LG Sabrina
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18