PDA

Vollständige Version anzeigen : Problem mit dem Suchen/abgleichen von Ergebnissen


Luxikatz
28.08.2017, 09:53
Hallo,

sitze seit über 2 Wochen dran. Das letzte Mal konnte ich durch freundliche User schon ein wenig vorankommen. Jedoch ist jetzt das Problem, dass beispielsweise das Suchergebnis in Overview in der 100. Zeile steht und in der Zieldatei Overview(history) in der 300. Zeile. Deshalb gibt es Probleme beim Matchen? weil das "I" Zähler sich auf die Quelldatei bezieht.

Insgesamt funktioniert das Matchen mit erg und erg2 nicht so ganz. Das Überschreiben von der Historydatei darf eben nur erfolgen, wenn der gefundene Datensatz auch mit der 3. und 5. Spalte in der Historydatei übereinstimmt! Weil ich sonst versehentlich den falschen Datensatz überschreibe.

Vielleicht findet jemand eine Lösung, wie ich es im Code anpassen muss.

Danke!

Sub copyOverviewtohistory()

'******Variable Deklaration ******

Dim quelltab1 As Worksheet 'Quelldatei = Overview
Dim zieltab1 As Worksheet 'Zieldatei = Overview(history)
Dim i As Integer 'Zählt die Zeilen in den Tabellenblätter
Dim j As Integer 'Zählt die Spalten in den Tabellenblätter


Dim LRowQ As Long 'Variable für die Ermittlung von der letzten Zeile in der Quelltabelle
Dim LRowZ As Long 'Variable für die Ermittlung von der letzten Zeile in der Zieltabelle
Dim erg As Variant 'Hier wird das Zwischenergebnis abgespeichert
Dim erg2 As Variant

'*****Ende Variable Deklaration*****

'Hier legt man den Bezug der Variable zu den Tabellenblätter fest
Set quelltab = ActiveWorkbook.Worksheets("Overview")
Set zieltab1 = ActiveWorkbook.Worksheets("Overview(history)")

'Ermittlung der letzten Zeile in den beiden Tabellenblättern
LRowZ = zieltab1.UsedRange.SpecialCells(xlCellTypeLastCell).Row
LRowQ = quelltab.UsedRange.SpecialCells(xlCellTypeLastCell).Row

'Bezug auf die Variable quelltab = Das Tabellenblatt "Overview"
With quelltab

'Ab der 3. Zeile läuft der Zähler bis er alle beschriebene Zeilen erfasst hat
For i = 3 To LRowQ

'Steht in der 7. Spalte ein "new" dann

If .Cells(i, 7) = "new" Then
'Speichert mal das Suchergebnis in die Laufvariable LRowZ
'Jedes Mal, wenn "new" in dieser Spalte gefunden wird +1 draufaddieren
LRowZ = LRowZ + 1
'Entspricht das Suchergebnis die Spalte 1 bis Spalte 7, dann kopiere
'das Ergebnis in die Zieltabelle
.Range(.Cells(i, 1), .Cells(i, 7)).Copy zieltab1.Cells(LRowZ, 1)

'Wenn der Status = "pending" und die 3. Spalte übereinstimmt
'Dann bleibt der Status bei "pending"


ElseIf .Cells(i, 7) = "pending" And .Cells(i, 3) = zieltab1.Cells(i, 3) Then

zieltab1.Cells(i, 7) = "pending"

'Steht in der History als Status "new" und die 3.Spalte stimmt mit der Quelldatei überein

ElseIf zieltab1.Cells(i, 7) = "new" And .Cells(i, 3) = zieltab1.Cells(i, 3) Then

'Nur wenn das Suchergebnis den Inhalt von 3.Spalte und 5.Spalte entspricht!!! erst dann gilt
erg = Application.Match(.Cells(i, 3), zieltab1.Range("C3:C" & LRowZ), 0)
erg2 = Application.Match(.Cells(i, 5), zieltab1.Range("E3:E" & LRowZ), 0)

If IsNumeric(erg) Then zieltab1.Cells(erg + 2, 3) = .Cells(i, 3)
If IsNumeric(erg2) Then zieltab1.Cells(erg2 + 2, 7) = .Cells(i, 7)


'Anderenfalls:
'Steht in der Quelldatei "yes", dann bitte auch in der Zieldatei den Status auf "yes" setzen
ElseIf .Cells(i, 7) = "yes" And .Cells(i, 5) Like zieltab1.Cells(i, 5) Then

'Abgleich mit Spalte 3 und Spalte 5, damit man auch den richtigen Datensatz erwischt
erg = Application.Match(.Cells(i, 3), zieltab1.Range("C3:C" & LRowZ), 0)
erg2 = Application.Match(.Cells(i, 5), zieltab1.Range("E3:E" & LRowZ), 0)

'Status "yes" in die richtige Zeile reinschreiben

If IsNumeric(erg) Then zieltab1.Cells(erg + 2, 3) = .Cells(i, 3)
If IsNumeric(erg2) Then zieltab1.Cells(erg2 + 2, 7) = .Cells(i, 7)
'Ende von der inneren Schleife
End If
'Prüfe die nächster Zeile
Next i

'Ende von der äußeren Schleife
End With
'Beim Kopieren entstehen Leerzeilen, deswegen müssen wir eine eigene Prozedur
'zum Löschen aufrufen

Call delete_emptyrowhistory


End Sub

Beverly
28.08.2017, 10:55
Hi,

ich würde generell so vorgehen: wenn du in der Schleife in die Zelle(n) mit "new" läufst, dann suche mittels Find-Methode im anderen Tabellenblatt in Spalte 3 nach dem Begriff aus Spalte 3 der Quelltabelle - dann kennst du die Zeile, in der der Begriff gefunden wird und kannst dich auf diese Zeile beziehen wenn du die Daten übertragen willst.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Luxikatz
28.08.2017, 13:27
Danke Beverly. Kann ich dann mit der find Methode gleichzeitig nach 2 Spalteninhalte abbprüfen? Also nur wenn Spalte3 und Spalte 5 übereinstimmt. Wie sieht es dann in VBA aus, wenn ich es mit der find Methode suchen will?

Danke dir schon mal

Beverly
28.08.2017, 13:55
Aus deinem Code werde ich nicht so ganz schlau, weil er zudem auch nicht korrekt strukturiert geschrieben ist und ich deinen tatächlichen Tabellenaufbau nicht kenne - deshalb hier folgendes Beispiel:

1. verglichen wird in einre Schleife auf Tabelle1, ob in Spalte 7 "yes" steht
2. ist diese Bedingung erfüllt, dann suche in Tabelle2 Spalte 3 nach dem Inhalt der Spalte 3 Quelltabelle laufende Zeile
3. wurde in Spalte 3 der Inhalt der laufenden Zeile aus Spalte 3 gefunden und stimmen die Inhalte der Spalte 1 in beiden Tabellen überein, dann trage in Spalte 5 ein "identisch", anderdenfalls "keine Übereinstimmung"

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

aloys78
28.08.2017, 14:44
Hallo,

für den Vorgänger dieser Aufgabenstellung hattest Du eine funktionierende Lösung, bei der es keine Rolle spielte, ob der Key in beiden Blättern in der gleichen Zeile lag.

Inhaltlich fällt mir bei deinem Code auf:
- es soll auch der Inhalt der Sp 5 gleich sein; im Code fragst Du nur bei 'pending' ab
- bei 'new' kann schon eine Zeile in der Zieldatei vorkommen; ist das so ?

Anbei mein ursprünglicher Code, abgeändert auf Deine neue Aufgabenstellung, aber ungetestet.
Es wäre eben hilfreich, wenn Du eine Beispieldatei zur Verfügung stellen würdest.

Option Explicit

Sub copyOverviewtohistory()
Dim i As Long
Dim quelltab As Worksheet, zieltab1 As Worksheet
Set quelltab = Worksheets("Tabelle1")
Set zieltab1 = Worksheets("Tabelle2")

Dim LRowQ As Long ' letzte Zeile Quell-Tabelle
Dim LRowZ As Long ' aktuell letzte Zeile Ziel-Tabelle
Dim erg As Variant ' Ergebnis Match

With quelltab
For i = 3 To LRowQ
If .Cells(i, 7) = "new" Then ' new
LRowZ = LRowZ + 1
.Range(.Cells(i, 1), .Cells(i, 7)).Copy zieltab1.Cells(LRowZ, 1)

ElseIf .Cells(i, 7) = "pending" Or .Cells(i, 7) = "yes" Then ' pending and yes
erg = Application.Match(.Cells(i, 3), zieltab1.Range("C3:C" & LRowZ), 0)
If IsNumeric(erg) Then
If .Cells(i, 5) Like zieltab1.Cells(erg + 2, 5) Then
zieltab1.Cells(erg + 2, 7) = .Cells(i, 7)
End If
End If
End If
Next i
End With
End Sub

Gruß
Aloys
-

Luxikatz
28.08.2017, 15:08
Hallo,

für den Vorgänger dieser Aufgabenstellung hattest Du eine funktionierende Lösung, bei der es keine Rolle spielte, ob der Key in beiden Blättern in der gleichen Zeile lag.

Inhaltlich fällt mir bei deinem Code auf:
- es soll auch der Inhalt der Sp 5 gleich sein; im Code fragst Du nur bei 'pending' ab
- bei 'new' kann schon eine Zeile in der Zieldatei vorkommen; ist das so ?

Anbei mein ursprünglicher Code, abgeändert auf Deine neue Aufgabenstellung, aber ungetestet.
Es wäre eben hilfreich, wenn Du eine Beispieldatei zur Verfügung stellen würdest.

Option Explicit

Sub copyOverviewtohistory()
Dim i As Long
Dim quelltab As Worksheet, zieltab1 As Worksheet
Set quelltab = Worksheets("Tabelle1")
Set zieltab1 = Worksheets("Tabelle2")

Dim LRowQ As Long ' letzte Zeile Quell-Tabelle
Dim LRowZ As Long ' aktuell letzte Zeile Ziel-Tabelle
Dim erg As Variant ' Ergebnis Match

With quelltab
For i = 3 To LRowQ
If .Cells(i, 7) = "new" Then ' new
LRowZ = LRowZ + 1
.Range(.Cells(i, 1), .Cells(i, 7)).Copy zieltab1.Cells(LRowZ, 1)

ElseIf .Cells(i, 7) = "pending" Or .Cells(i, 7) = "yes" Then ' pending and yes
erg = Application.Match(.Cells(i, 3), zieltab1.Range("C3:C" & LRowZ), 0)
If IsNumeric(erg) Then
If .Cells(i, 5) Like zieltab1.Cells(erg + 2, 5) Then
zieltab1.Cells(erg + 2, 7) = .Cells(i, 7)
End If
End If
End If
Next i
End With
End Sub

Gruß
Aloys
-

Vielen Dank Aloys für die Anpassung des Codes, mir ist beim 1. Mal ein Denkfehler unterlaufen, da ich in der Zieltabelle ja noch Datensätze von Vormonate habe und deshalb die Keys nicht in der gleichen Zeile sich befinden. Deiner Anpassungen hat genau mein Fehler gelöst!!!!!! Nochmals herzlichen Dank für deiner Mühe!! :)

Luxikatz
28.08.2017, 15:09
Aus deinem Code werde ich nicht so ganz schlau, weil er zudem auch nicht korrekt strukturiert geschrieben ist und ich deinen tatächlichen Tabellenaufbau nicht kenne - deshalb hier folgendes Beispiel:

1. verglichen wird in einre Schleife auf Tabelle1, ob in Spalte 7 "yes" steht
2. ist diese Bedingung erfüllt, dann suche in Tabelle2 Spalte 3 nach dem Inhalt der Spalte 3 Quelltabelle laufende Zeile
3. wurde in Spalte 3 der Inhalt der laufenden Zeile aus Spalte 3 gefunden und stimmen die Inhalte der Spalte 1 in beiden Tabellen überein, dann trage in Spalte 5 ein "identisch", anderdenfalls "keine Übereinstimmung"

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Danke Beverly für deiner Datei, die habe ich mir gleich abgespeichert. ;)