Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Strings vergleichen in 2 verschiedenen Tabellen

Strings vergleichen in 2 verschiedenen Tabellen
Mario
Hallo zusammen,
hier ist ein Code von fcs, um Namen in versch. Tabellen zu vergleichen. Mein Problem dabei ist, _
dass ich nicht erwähnt habe, dass sich die Namen im Laufe der Zeit im Tabellenblatt Woche ä _ ndern, sprich es kommt jeden Tag eine neue Zahl mit Leerzeichen dazwischen dazu. Somit würde ich gerne nicht mit der Funktion

InStr(1, sTxtB, sTxtA) > 0
arbeiten, da ja numerisch bis zum Leerzeichen gekürzt wird (und ich mehrere Leerzeichen von hinten gesehen bis zum Namen habe), sondern mit der Funktion

Mid(sTxtA, 1, 8) = Mid(sTxtB, 1, 8)
, um immer nur die ersten 8 Zeichen zu vergleichen.
Wenn ich nun diese aber einfach austausche, erfüllt er die True-Bedingung nicht mehr. Kann mir _ jemand helfen?

Sub Vergleichen()
Dim iSecond As Long
Dim iRowB As Long
Dim sTxtA As String, sTxtB As String
Dim bln As Boolean
Dim wksSchicht As Worksheet, wksAnwesend As Worksheet, rngZelle As Range
Dim wksWoche As Worksheet
Dim lngZeileTreffer As Long, lngZeileKeinTreffer As Long
Const FarbeKeinTreffer As Long = 6
Const FarbeTreffer As Long = 2
If MsgBox("Namen im Schichtplan mit Anwesenheitsliste vergleichen?" _
& vbLf & vbLf & "Namen werden oben gelöscht und unten eingetragen!", _
vbQuestion + vbOKCancel) = vbCancel Then Exit Sub
Set wksSchicht = Worksheets("Woche") 'Blatt mit Schichtplan
Set wksAnwesend = Worksheets("Anwesenheit") 'Blatt mit Anwesenheitsliste
Set wksWoche = Worksheets("Woche") 'Zielblatt für Ergebnisliste
'  Vollzeitler ermitteln
With wksWoche
'Alteinträge löschen (Zeile 100 ggf anpassen)
'      Call Trefferliste_loeschen
'Startzeile für Treffereinträge im Ergebnisblatt
lngZeileTreffer = Application.WorksheetFunction.Max(Trefferstart, _
.Cells(.Rows.Count, 2).End(xlUp).Row + 1)
lngZeileKeinTreffer = Application.WorksheetFunction.Max(Trefferstart, _
.Cells(.Rows.Count, 3).End(xlUp).Row + 1)
End With
iSecond = 3 'Spalte mit Namen in der Anwesenheitsliste
For Each rngZelle In wksSchicht.Range("B4:F" & Trefferstart + 24) 'Bereich ggf anpassen
If Not IsEmpty(rngZelle) Then 'leere Zelle überspringen
bln = False
'Name im Wochenblatt-Schichtplan
sTxtA = rngZelle.Value
'Namen aus Wochenblatt aufbereiten
'"(" links entfernen
If Left(sTxtA, 1) = "(" Then
sTxtA = Mid(sTxtA, 2)
End If
'Zeichen ab "(" entfernen
If InStr(sTxtA, "(") > 0 Then
sTxtA = Trim(Left(sTxtA, InStr(sTxtA, "(") - 1))
End If
'"Nummer" rechts entfernen
If IsNumeric(Right(sTxtA, 1)) Then
sTxtA = Trim(Left(sTxtA, InStrRev(sTxtA, " ")))
End If
With wksAnwesend
'Zeilen im Blatt Anwesend in Spalte iSecond abarbeiten
For iRowB = 3 To .Cells(.Rows.Count, iSecond).End(xlUp).Row
If IsEmpty(.Cells(iRowB, iSecond)) Then
'do nothing - leere Zelle überspringen
Else
sTxtB = .Cells(iRowB, iSecond).Value 'Name in Spalte C
'Prüfen, ob Name aus Schichtplan im Namen in Spalte C enthalten ist
If InStr(1, sTxtB, sTxtA) > 0 Then
'Treffer
bln = True
'Name in Spalte C eintragen
With wksWoche.Cells(lngZeileTreffer, 2)
.Value = rngZelle.Value
.Interior.ColorIndex = FarbeTreffer
End With
'Name im Schichtplan entfernen
With rngZelle
.ClearContents
.Interior.ColorIndex = xlColorIndexNone
End With
lngZeileTreffer = lngZeileTreffer + 1
Exit For
End If
End If
Next
End With
If bln = False Then
'Kein Treffer
rngZelle.Interior.ColorIndex = FarbeKeinTreffer
'Name in Spalte E eintragen
With wksWoche.Cells(lngZeileKeinTreffer, 3)
.Value = rngZelle.Value
.Interior.ColorIndex = FarbeKeinTreffer
End With
'Name im Schichtplan entfernen
With rngZelle
.ClearContents
.Interior.ColorIndex = xlColorIndexNone
End With
lngZeileKeinTreffer = lngZeileKeinTreffer + 1
End If
End If
Next rngZelle
End Sub

Vielen Dank
Mario
Anzeige
AW: Strings vergleichen in 2 verschiedenen Tabelle
01.08.2009 13:47:36
fcs
Hallo Mario,
wenn du den Vergleich nur auf die 1. acht Zeichen des Namens beschränken willst, dann kannst du den Abschnitt zum Aufbereiten des Namens im Wochplan rausnehmen. Danach kannstdu dann den Vergleich zwischen steTxtA und strTxtB in der gewünschten Form machen. Allerdings gibt es dann bei Namensgleichheit ggf. Probleme.
Wie du aus meinen Anmerkungen und Klimmzügen bemerken kannst ist die Aufbereitung der Daten jenseits von optimal.
1. Du solltest im Blatt Anwesenheit dafür sorgen, dass Name und Personalnummer in 2 separaten Spalten dargestellt werden. Das erleichtert den Vergleich und macht alles übersichtlicher.
Gruß
Franz
Anzeige
AW: Strings vergleichen in 2 verschiedenen Tabelle
01.08.2009 15:34:49
Mario
Hallo fcs,
vielen Dank erstmal. Deine Anmerkungen sind richtig, leider aber im Moment nicht machbar, da die Namen und Nummern ein externer Bezug sind.....das kann ich erst später ändern. Außerdem bekommen die Namen im Schichplan jeden Tag noch eine Nummer dazu mit Leerzeichen, auch dann wird die Namensanpassung schwierig....hab ich aber leider erst beim Ausprobieren entdeckt....
Deinen Vorschlag, die Namensaufbereitung rauszunehmen, habe ich mir schon gedacht, habe dies auch getan:
'Namen aus Wochenblatt aufbereiten
'"(" links entfernen
If Left(sTxtA, 1) = "(" Then
sTxtA = Mid(sTxtA, 2)
End If
'Zeichen ab "(" entfernen
If InStr(sTxtA, "(") > 0 Then
sTxtA = Trim(Left(sTxtA, InStr(sTxtA, "(") - 1))
End If
'"Nummer" rechts entfernen
If IsNumeric(Right(sTxtA, 1)) Then
sTxtA = Trim(Left(sTxtA, InStrRev(sTxtA, " ")))
End If
und dann InStr(1, sTxtB, sTxtA) > 0 mit Mid(sTxtA, 1, 8) = Mid(sTxtB, 1, 8) ersetzt. Aber dann erfüllt er die True-Bedingung nicht mehr und alle Namen erscheinen in der FarbeKeinTreffer.
Weißt du weiter?
Tschau
Mario
Anzeige
AW: Strings vergleichen in 2 verschiedenen Tabelle
02.08.2009 13:15:28
Klaus-Dieter
Hallo Mario,
offenbar gibt es einen älteren Beitrag, auf den sich das bezieht. Den kenne ich nicht. Ein Link dahin wäre möglicherweise hilfreich.
Viele Grüße Klaus-Dieter

Online-Excel
Anzeige
AW: Strings vergleichen in 2 verschiedenen Tabelle
04.08.2009 07:01:51
fcs
Hallo Mario,
das Problem ist, dass im Blatt "Anwesenheit" alle Namen in Spalte "C" mit einem Leerzeichen beginnen.
Dadurch ergibt der Vergleich der 1. acht Zeichen der Namen nie einen Treffer.
Ich hab den Code jetzt so angepasst, dass die Leerzeichen entfernt werden.
Die Zeile bis zu der im Blatt "Woche" die Zeilen nach Namne durchsucht werden sollen wird jetzt durch die Konstante "ZeilLetzte" festgelegt.
Gruß
Franz
Sub Vergleichen()
Dim iSecond As Long
Dim iRowB As Long
Dim sTxtA As String, sTxtB As String
Dim bln As Boolean
Dim wksSchicht As Worksheet, wksAnwesend As Worksheet, rngZelle As Range
Dim wksWoche As Worksheet
Dim lngZeileTreffer As Long, lngZeileKeinTreffer As Long
Const FarbeKeinTreffer As Long = 6
Const FarbeTreffer As Long = 2
Const Trefferstart As Long = 36 'Startzeile für Treffereinträge im Blatt Woche
Const ZeileLetzte As Long = 24  'Letzte Zeile mit Daten für Schichteinteilungen _
im Blatt Woche - ggf. Anpassen
If MsgBox("Namen im Schichtplan mit Anwesenheitsliste vergleichen?" _
& vbLf & vbLf & "Namen werden oben gelöscht und unten eingetragen!", _
vbQuestion + vbOKCancel) = vbCancel Then Exit Sub
Set wksSchicht = Worksheets("Woche") 'Blatt mit Schichtplan
Set wksAnwesend = Worksheets("Anwesenheit") 'Blatt mit Anwesenheitsliste
Set wksWoche = Worksheets("Woche") 'Zielblatt für Ergebnisliste
'  Vollzeitler ermitteln
With wksWoche
'Startzeile für Treffereinträge im Ergebnisblatt
lngZeileTreffer = Application.WorksheetFunction.Max(Trefferstart, _
.Cells(.Rows.Count, 2).End(xlUp).Row + 1)
lngZeileKeinTreffer = Application.WorksheetFunction.Max(Trefferstart, _
.Cells(.Rows.Count, 3).End(xlUp).Row + 1)
End With
iSecond = 3 'Spalte mit Namen in der Anwesenheitsliste
For Each rngZelle In wksSchicht.Range("B4:F" & ZeileLetzte)
If Not IsEmpty(rngZelle) Then 'leere Zelle überspringen
bln = False
'Name im Wochenblatt-Schichtplan
sTxtA = Trim(rngZelle.Value)
With wksAnwesend
'Zeilen im Blatt Anwesend in Spalte iSecond abarbeiten
For iRowB = 3 To .Cells(.Rows.Count, iSecond).End(xlUp).Row
If IsEmpty(.Cells(iRowB, iSecond)) Then
'do nothing - leere Zelle überspringen
Else
sTxtB = Trim(.Cells(iRowB, iSecond).Value) 'Name in Spalte C
'Prüfen, ob Zeichen 1 bis 8 von Name aus Schichtplan im Namen in _
Spalte C identisch sind.
If Mid(sTxtB, 1, 8) = Mid(sTxtA, 1, 8) Then
'Treffer
bln = True
'Name in Spalte B eintragen
With wksWoche.Cells(lngZeileTreffer, 2)
.Value = rngZelle.Value
.Interior.ColorIndex = FarbeTreffer
End With
'Name im Schichtplan entfernen
With rngZelle
.ClearContents
.Interior.ColorIndex = xlColorIndexNone
End With
lngZeileTreffer = lngZeileTreffer + 1
Exit For
End If
End If
Next
End With
If bln = False Then
'Kein Treffer
rngZelle.Interior.ColorIndex = FarbeKeinTreffer
'Name in Spalte C eintragen
With wksWoche.Cells(lngZeileKeinTreffer, 3)
.Value = rngZelle.Value
.Interior.ColorIndex = FarbeKeinTreffer
End With
'Name im Schichtplan entfernen
With rngZelle
.ClearContents
.Interior.ColorIndex = xlColorIndexNone
End With
lngZeileKeinTreffer = lngZeileKeinTreffer + 1
End If
End If
Next rngZelle
End Sub

Anzeige
AW: Strings vergleichen in 2 verschiedenen Tabelle
05.08.2009 11:52:22
Mario
Hallo zusammen,
das mit dem Leerzeichen war der Fehler.....vielen vielen Dank.
Tschau
Mario
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige