Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1092to1096
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige