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

Vergleichen in 2 Tabellenblättern und dann einfärb

Vergleichen in 2 Tabellenblättern und dann einfärb
13.06.2016 20:36:27
Danny
Hallo liebe Gemeinde,
ich bin mal wieder am verzweifeln.
Es sollen 2 Tabellenblätter verglichen werden.
In "Gesamt Material" von A 17 bis A1627 und
in "Freie Nummern" von A4 bis N803.
Gefundene Doppelgänger sollen dann in der Mappe "Freie Nummern" Rot markiert werden (Hintergrund).
Ich hoffe es gibt hierfür eine einfache VBA Lösung und hoffe jemand kann mich Retten.
Gruß und Danke im vorraus
Danny
Hier meine Vorlage: https://www.herber.de/bbs/user/106209.xlsm

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Tabellenblätter einfärben (Dic)
13.06.2016 21:08:17
Michael
Hi Danny,
so in Modul1:
Sub machen()
Dim o As Object, k As Variant
Dim a
Dim z&, zmax&
With Sheets("Gesamt Material")
zmax = .Range("A" & .Rows.Count).End(xlUp).Row
a = .Range("A1:A" & zmax)
End With
Set o = CreateObject("scripting.dictionary")
For z = 17 To zmax
If Len(a(z, 1)) > 1 Then o(a(z, 1)) = o(a(z, 1)) + 1
Next
z = 0
If o.Count > 0 Then
With Sheets("Freie Nummern")
For Each k In o.keys
If o(k) > 1 Then
z = z + 1
.Cells(Mid(k, 2) + 3, Mid(k, 1, 1)).Interior.Color = vbRed
End If
Next
End With
MsgBox o.Count & " Einträge, davon " & z & " Doppelte"
End If
End Sub
Allerdings habe ich in "Freie Nummern" die Werte R in die Spalte R verschoben (das spart Herumrechnerei), und siehe da: es gibt einige Werte mit P.
Schöne Grüße,
Michael

Anzeige
AW: Tabellenblätter einfärben (Dic)
14.06.2016 06:01:30
Danny
Hallo Michael,
ich danke dir für die super schnelle Hilfe.
Der Code macht was er soll und ich wäre wohl nicht auf so eine Lösung gekommen.
Also Danke du Lebensretter!!!!!

danke für die Rückmeldung & usedrange
14.06.2016 15:35:54
Michael
Hi zusammen,
freut mich, wenn es tut.
@Zwenn: Alles gut. So ähnlich bin ich überhaupt auf eine Kalkulation gekommen, aber ne Ecke eher: bei uns im Büro saßen der Chef und der "Stift" einmal im Monat an einer Monstertabelle, die sie beide meist mehrmals durchgerechnet hatten ("was ham Sie?" "41.001,57" "Scheiße, ich hab 40.750,37, also nochmal").
Ich hab mir dann ein Quattro Pro 3.0 gekauft, und nach ein paar Stunden war die Tabelle fertig.
Ach so, genau, die händischen Ergebnisse wurden zuvor in eine unsägliche Textverarbeitung geklopft, gegen die der olle Wordstar schon "komfortabel" war. Mann, Mann.
Zu Deiner Lösung: Arrays sind natürlich schneller als direkte Zellenzugriffe, und das gute Dictionary ist eine der fixesten Möglichkeiten, u.a. Doppelte zu finden oder auch herauszuwerfen usw.
Ich wollte Dich aber auf das grundsätzliche Problem usedrange.rows aufmerksam machen: FALLS der usedrange nicht links oben (in A1) beginnt, werden anschließend nicht alle Zeilen berücksichtigt.
Teste mal den Code ...
Option Explicit
Sub ur()
Dim r As Range
Set r = ActiveSheet.UsedRange
MsgBox "activeSheet.UsedRange.Rows.Count " & _
ActiveSheet.UsedRange.Rows.Count & _
vbLf & "activeSheet.UsedRange.columns.Count " _
& ActiveSheet.UsedRange.Columns.Count & vbLf & _
"activeSheet.UsedRange(0).address bzw. r(0) " & _
r(0).Address
' usedrange(0) geht nicht
End Sub

... mit derartigen Daten:
Userbild
D.h., daß man beim Einsatz von usedrange immer auch dessen linke, obere Ecke ermitteln sollte.
Ok, das nur der Vollständigkeit halber.
Happy Exceling,
Michael
P.S.: Da ist mir doch ein Fehler reingerutscht: es fängt ja gar nicht in A2 an: das liegt an r(0): die Zählung beginnt aber er erst bei r(1) - dann kommt auch richtigerweise B2 raus...
Oder die Alternative ohne ein zusätzliches range:
Sub ur2()
MsgBox "activeSheet.UsedRange.Rows.Count " & _
ActiveSheet.UsedRange.Rows.Count & _
vbLf & "activeSheet.UsedRange.columns.Count " _
& ActiveSheet.UsedRange.Columns.Count & vbLf & _
"Split(ActiveSheet.UsedRange.Address,...)(0) " & _
Split(ActiveSheet.UsedRange.Address, ":")(0)
End Sub

Anzeige
Nostalgie-Lösung ;-)
13.06.2016 22:37:58
Zwenn
Hallo Danny,
zwar hat Michael einmal mehr eine Lösung geliefert, und ich hoffe Du bist nicht böse, dass ich mich einmische Michael. Ich möchte meine Lösung nämlich aus nostalgischen Gründen trotzdem präsentieren. Bei mir musst Du zwar keine Spalte verschieben, aber das Ganze läuft dafür (auf meiner AMD Kaveri Maschine) ca. 1 Minute, bis es fertig ist.
Die nostalgischen Anwandlungen rühren daher, dass eine ähnliche Aufgabenstellung mein Einstieg in Excel VBA war. 2006 arbeitete ich als Freelancer in einem von zwei Teams, die Fotoaufnamen von Mitarbeitern eines Unternehmens für neue Konzernausweise machten. Am Ende eines Tages setzten sich zwei Leute aus beiden Teams zusammen und glichen die Listen von Hand ab. Welches Team hat wen Fotografiert. Ich dachte ich guck nicht richtig, steuerte nach Feierabend die nächste Buchhandlung an und kaufte mir mein erstes Buch zu Excel VBA. Eine Woche später präsentietre ich den beiden Teams eine Lösung, die die beiden Tageslisten automatisch abgleicht. (Fast 9.000 Personaldatensätze)
Wichtig war mir bei der Entwicklung meines Makros, dass genau so vorgegangen wurde, wie alle Team-Kollegen es kannten. Es wurde mit Hintergrundfarben gearbeitet, um bereits fotografierte Mitarbeiter zu markieren. Ich fand das alles wahnsinnig kompliziert, wollte aber unbedingt die Automatik, ohne den Kollegen gegenüber überheblich zu erscheinen. Es ging ja nur darum etwas zu vereinfachen, damit alle früher Feierabend haben.
Das hat super funktioniert. Alle waren zufrieden :-)
Hier mein Färbelösung für Dein Problem:

Option Explicit
Sub ZellenFaerben()
Dim i As Long
Dim j As Long
Dim k As Long
Dim strQuellTabelle As String
Dim strZielTabelle As String
Dim lQuellTabelleZeilen As Long
Dim lZielTabelleZeilen As Long
Dim lZielTabelleSpalten As Integer
Dim lStartZeileQuellTabelle As Byte
Dim lStartZeileZielTabelle As Byte
Dim lDoppelteFarbeRotAnteil As Long
Dim lDoppelteFarbeGruenAnteil As Long
Dim lDoppelteFarbeBlauAnteil As Long
Dim bolTreffer As Boolean
strQuellTabelle = "Gesamt Material"
strZielTabelle = "Freie Nummern"
lQuellTabelleZeilen = Sheets(strQuellTabelle).UsedRange.Rows.Count
lZielTabelleZeilen = Sheets(strZielTabelle).UsedRange.Rows.Count
lZielTabelleSpalten = Sheets(strZielTabelle).UsedRange.Columns.Count
lStartZeileQuellTabelle = 17
lStartZeileZielTabelle = 4
lDoppelteFarbeRotAnteil = 255
lDoppelteFarbeGruenAnteil = 0
lDoppelteFarbeBlauAnteil = 0
For i = lStartZeileQuellTabelle To lQuellTabelleZeilen
bolTreffer = False
If Sheets(strQuellTabelle).Cells(i, 1).Value  "" Then
For j = lStartZeileZielTabelle To lZielTabelleZeilen
For k = 1 To lZielTabelleSpalten
If Sheets(strQuellTabelle).Cells(i, 1).Value = Sheets(strZielTabelle). _
Cells(j, k).Value Then
Sheets(strZielTabelle).Cells(j, k).Interior.Color = RGB( _
lDoppelteFarbeRotAnteil, _
lDoppelteFarbeGruenAnteil, _
lDoppelteFarbeBlauAnteil)
bolTreffer = True
Exit For
End If
If bolTreffer = True Then
Exit For
End If
Next k
Next j
End If
Next i
End Sub
Viele Grüße,
Zwenn

Anzeige
Keine Minute ;-)
13.06.2016 23:27:44
Zwenn
Ok,
45 Sekunden ;-)
Gruß,
Zwenn

AW: Keine Minute ;-)
14.06.2016 06:07:05
Danny
Hallo Zwenn,
deine nostalgie Lösung läuft genau so super wie die von Michael.
Mal schauen welche Version ich nachher benutze.
Werde heute Abend mal mit beiden rumspielen zum Verstehen.
Auch dir vielen, vielen Dank für deine Mühen.
Das Forum ist der Hammer!!!!
Gruß danny

Kleinen Fehler behoben
14.06.2016 10:20:19
Zwenn
Hallo Danny,
habe grade gesehen, dass ich den Abbruch der zweiten Schleife noch in die erste gesetzt hatte, die sowieso abgebrochen wird, wenn ein Treffer vorliegt. Habe das korrigiert. Nun läuft das Makro auch eher in der Geschwindigkeit, die ich erwartet hatte.
Makro mit korrigiertem zweiten Schleifenabbruch:

Option Explicit
Sub ZellenFaerben()
Dim i As Long
Dim j As Long
Dim k As Long
Dim strQuellTabelle As String
Dim strZielTabelle As String
Dim lQuellTabelleZeilen As Long
Dim lZielTabelleZeilen As Long
Dim lZielTabelleSpalten As Integer
Dim lStartZeileQuellTabelle As Byte
Dim lStartZeileZielTabelle As Byte
Dim lDoppelteFarbeRotAnteil As Long
Dim lDoppelteFarbeGruenAnteil As Long
Dim lDoppelteFarbeBlauAnteil As Long
Dim bolTreffer As Boolean
strQuellTabelle = "Gesamt Material"
strZielTabelle = "Freie Nummern"
lQuellTabelleZeilen = Sheets(strQuellTabelle).UsedRange.Rows.Count
lZielTabelleZeilen = Sheets(strZielTabelle).UsedRange.Rows.Count
lZielTabelleSpalten = Sheets(strZielTabelle).UsedRange.Columns.Count
lStartZeileQuellTabelle = 17
lStartZeileZielTabelle = 4
lDoppelteFarbeRotAnteil = 255
lDoppelteFarbeGruenAnteil = 0
lDoppelteFarbeBlauAnteil = 0
For i = lStartZeileQuellTabelle To lQuellTabelleZeilen
bolTreffer = False
If Sheets(strQuellTabelle).Cells(i, 1).Value  "" Then
For j = lStartZeileZielTabelle To lZielTabelleZeilen
For k = 1 To lZielTabelleSpalten
If Sheets(strQuellTabelle).Cells(i, 1).Value = Sheets(strZielTabelle). _
Cells(j, k).Value Then
Sheets(strZielTabelle).Cells(j, k).Interior.Color = RGB( _
lDoppelteFarbeRotAnteil, _
lDoppelteFarbeGruenAnteil, _
lDoppelteFarbeBlauAnteil)
bolTreffer = True
Exit For
End If
Next k
If bolTreffer = True Then
Exit For
End If
Next j
End If
Next i
End Sub

Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige