Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1508to1512
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

nicht ohne viel "Wenn und Aber" ... :)

nicht ohne viel "Wenn und Aber" ... :)
15.08.2016 13:40:31
gjunge
Hallo,
ich vergleiche zwei Tabellen und führe diese dann mittels VBA zusammen. Das Ergebnis ist noch nicht ganz, was ich mir wünsche. Vielleicht kann mir hier jemand weiterhelfen?
Ich würde gern noch Spalte I abfragen. D.h. wenn in meinem Vergleich der Tabellen die Zellfarbe der Spalte A-I ohne Füllung und in Spalte I kein Ergebnis eingetragen ist und dabei der Inhalt der Spalten A-H in anderen Zeilen absolut identisch ist und die Zellfarbe = gelb und ein Ergebnis drinsteht, dann soll die Zeile ohne ein Ergebnis in I gelöscht werden.
Ich weiß, dass ich es mit einer Bedingten Formatierung mit Formel lösen kann. Leider geht das aufgrund der riesigen Datenmengen nicht unzusetzen.
Ich hoffe, dass meine Bsp. Datei aussagen kann, was ich möchte. Der VBA Code für diesen Teil sieht so aus:
Sub merge()
Dim wks As Worksheet
Dim rngA As Range, rngB As Range
Dim iRow As Integer, iCounter As Integer, iCol As Integer
Application.ScreenUpdating = False
Set rngA = Worksheets("download1507").Range("A1").CurrentRegion
Set rngB = Worksheets("download2207").Range("A1").CurrentRegion
Set wks = Worksheets("Daten")
iCol = rngA.Columns.Count
If rngB.Columns.Count > iCol Then
iCol = rngB.Columns.Count
End If
For iCounter = 1 To iCol
Next iCounter
rngA.Range("A1").CurrentRegion.Copy wks.Range("A2")
iRow = wks.Cells(Rows.Count, 1).End(xlUp).Row + 1
rngB.Range("A1").CurrentRegion.Copy wks.Cells(iRow, 1)
wks.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=wks.Cells(1, wks.UsedRange.Columns.Count + 1), _
Unique:=True
wks.Range(wks.Cells(1, 1), wks.Cells(1, iCol)). _
EntireColumn.Delete
wks.Columns.AutoFit
End Sub

Sub UpdateResults()
Dim lngLetzte As Long
Dim lngZeile As Long
Application.ScreenUpdating = False
lngLetzte = IIf(IsEmpty(Range("I65536")), Range("I65536").End(xlUp).Row + 1, 65536)
For lngZeile = lngLetzte To 1 Step -1
If Cells(lngZeile, 9)  "" Then
Cells(lngZeile, 9).EntireRow.Interior.ColorIndex = 6
End If
Next
Application.ScreenUpdating = True
End Sub
https://www.herber.de/bbs/user/107629.xlsx
Für Hilfe bin ich dankbar

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: nicht ohne viel "Wenn und Aber" ... :)
16.08.2016 00:19:45
fcs
Hallo gjunge,
wenn ich deine Erläuterungen richtig verstanden habe, dann kann ein entsprechendes Makro wie folgt aussehen. Allerdings werte ich im Makro nicht die gelbe Füllfarbe aus, sondern die Inhalte Spalte I (nicht leer). Das geht schneller als die Füllfarbe auszulesen.
Gruß
Franz
Sub Check_I_und_Loesche_Doppelte()
Dim arrData, arrResult()
Dim Zeile_1 As Long, Zeile_2 As Long, Spalte As Long, sTemp As String
Dim wks As Worksheet
Set wks = ActiveSheet
'Daten aus Spalten A bis I in Array einlesen
With wks
Zeile_1 = .Cells(.Rows.Count, 1).End(xlUp).Row
arrData = .Range(.Cells(1, 1), .Cells(Zeile_1, 9))
End With
'Ergebnis-Array dimensionieren
ReDim arrResult(1 To Zeile_1, 1 To 3)
For Zeile_2 = 2 To Zeile_1
'Werte in Spalten A bis H mit Trennzeichen in ein Feld schreiben (für Vergleich)
sTemp = arrData(Zeile_2, 1)
For Spalte = 2 To 8
sTemp = sTemp & "|" & arrData(Zeile_2, Spalte)
Next
arrResult(Zeile_2, 1) = sTemp
'Merker auf True setzen, wenn Inhalt in Spalte I
arrResult(Zeile_2, 2) = Not IsEmpty(arrData(Zeile_2, 9))
'Merker, dass Zeile gelöscht werden soll auf False setzen
arrResult(Zeile_2, 3) = False
Next
Erase arrData
'Zeilen des Result-Arrays abarbeiten
For Zeile_1 = 2 To UBound(arrResult, 1)
'prüfen, ob Spalte I leer ist
If arrResult(Zeile_1, 2) = False Then
'Wert aus Spalten A bis H in Variable einlesen
sTemp = arrResult(Zeile_1, 1)
'Wert mit allen Zeilen vergleichen, die in Spalte I ein Ergebnis haben
For Zeile_2 = 2 To UBound(arrResult, 1)
If arrResult(Zeile_2, 2) = True Then
If sTemp = arrResult(Zeile_2, 1) Then
'bei Übereinstimmung Löschen-Merker für Zeile auf True setzen
arrResult(Zeile_1, 3) = True
End If
End If
Next
End If
Next
Zeile_2 = UBound(arrResult, 1)
sTemp = ""
Application.ScreenUpdating = False
With wks
'zu löschende Zeilen in Spalte J markieren
For Zeile_1 = 2 To Zeile_2
If arrResult(Zeile_1, 3) = True Then
.Cells(Zeile_1, 10) = "X"
sTemp = "X" 'Merker, dass eine Zeile zu löschen ist
End If
Next
If sTemp = "X" Then
'Markierte Zeilen löschen
With .Range(.Cells(2, 10), .Cells(Zeile_2, 10))
.SpecialCells(xlCellTypeConstants).EntireRow.Delete _
Shift:=xlShiftUp
End With
End If
End With
Application.ScreenUpdating = True
Erase arrResult
End Sub

Anzeige
AW: nicht ohne viel "Wenn und Aber" ... :)
16.08.2016 11:20:38
gjunge
Hallo Franz,
das scheint auf den ersten Blick super zu funktionieren.
Dankeschön :)
Ich werde das nochmal ausführlich testen und in die weiteren Schritte mit einbinden.
Viele Grüße
AW: nicht ohne viel "Wenn und Aber" ... :)
20.08.2016 08:05:13
Hajo_Zi
warum offen, Du willst doch testen?
Ich habe nicht gelesen das jemand vorbei kommen soll und helfen soll beim testen?

25 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige