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

Wieder mal suchen

Wieder mal suchen
19.11.2016 18:18:36
Peter
Hi alle,
ich kreise nun schon einige Zeit um das folgende Problem (siehe auch Anhang https://www.herber.de/bbs/user/109556.xlsm):
In einer "Master" Excel Sheet habe ich eine Liste, welche ich von Zeit zu Zeit aktualisieren möchte. Die neuen Daten sind in dem Sheet "Neu". Der Einfachheit halber habe ich nur das eigentliche Grundproblem in dies Exceldatei kopiert.
Es soll nun folgendes gemacht werden:
- Der Eintrag im "Master" Sheet soll im "Neu" Sheet gesucht werden. Problem hierbei ist, dass alle drei Zellen (Nummer 1 - 3) überein stimmem müssen. Wird eine Übereinstimmung gefunden, dann soll die Zeile in "Master" mit der von "Neu" aktualisiert werden (das ist nun hier natürlich nicht sichtbar, die Werte befinden sich in den Spalten ab 4 bis 14, das kopieren kriege ich aber hin... ;-)). Ich schaffe es, mit der .find Methode die erste Zahl "Nummer1" zu finden, aber ich bin ratlos, wie ich die nächsten Zahlen finden soll...
- Wird der Eintrag im "Master" in "Neu" nicht gefunden, dann ist er alt und soll durchgestrichen dargestellt werden.
Danach muss ich noch von "Neu" nach "Master" suchen, da ja auch neue Nummern hinzugekommen sein können. Diese müssen dann von "Neu" in "Master" hineinkopiert werden (und grün markiert werden).
Ein paar Beispiele, wie das im Excel Sheet umgesetzt werden müsste:
1) Die Zeilen 2 - 9 und 11 - 13 sind im Sheet "Neu" nicht vorhanden und sollen durchgestrichen werden.
2) Die Zeile 10 ist vorhanden und wird belassen (im finalen Excel aktualisiere ich hier die Daten)
3) Die Zeile 3 ist im Sheet "Neu", aber nicht im Sheet "Master" und soll daher in das Sheet "Master" kopiert werden, und zwar zwischen die Zeilen 10 und 11.
So, ich hoffe ich konnte verdeutlichen, was ich machen will.
Bin wirklich dankbar für jede Hilfe...
Viele Grüße,
Peter

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wieder mal suchen
19.11.2016 22:25:12
fcs
Hallo Peter,
du kannst dir in einer Hilfspalte mit einer Formel alá
=A2&"|"&B2&"|"&C2
eindeutige Codes erzeugen.
Nach dem Erzeigen der Codes die Formeln durch Werte ersetzen.
Dann kannst du wieder mit der Find-Methode arbeiten.
Die neuen Einträge soltest du einfach am Ende der Liste anfügen und zum Schluss die Master-Liste neu sorieren.
Nach Abschluss der Datenübertragung kannst du die Hilfspalten wieder löschen.
Grundsätzlich könnte man eindeutigen Codes auch in Datenarray erzeugen und dann geänderten, neuen und nicht mehr vorhandenen Codes suchen.
Das ist aber etwas mehr an Fleißarbeit in der VBA-Programmierung.
Gruß
Franz
Anzeige
AW: Wieder mal suchen
19.11.2016 23:57:28
Peter
Hi Franz,
danke für die Antwort. Auf so eine Idee bin ich nicht gekommen - und wäre ich wohl auch nicht. Danke!
Gruß,
Peter
AW: Wieder mal suchen
19.11.2016 22:34:42
Ur-Opa
Hallo Peter,
wenn man mehrere Suchkriterien hat, kann man diese auch in einer verborgenen Hilfsspalte
verketten. Das vereinfacht das Coding ungemein.
Schau Dir den folgenden Makro einmal an.
Option Explicit
Sub Abgleich()
Dim rngMst As Range, _
rngNeu As Range
Dim rngCMst As Range, _
rngCNeu As Range
Dim varPMst As Variant, _
varPNeu As Variant
Set rngMst = ThisWorkbook.Worksheets("Master").Cells(1, 1).CurrentRegion
Set rngNeu = ThisWorkbook.Worksheets("Neu").Cells(1, 1).CurrentRegion
If rngMst.Rows.Count 

Damit müßte Deine Anforderung zu einem gewissen Teil abgedeckt sein.
Viel Erfolg
Ur-Opa
Anzeige
AW: Wieder mal suchen
20.11.2016 00:15:16
Peter
Hi Ur-Opa,
vielen Dank für die Mühe. Ich habe mir den Code angeschaut. So ganz komplett verstehe ich ihn nicht. Aber er sieht ziemlich gut aus.
Ich habe zu dem Code ein paar Fragen:
1) Eine Hilfsspalte nimmst Du nicht, richtig? Du überschreibst einfach die Spalte A? Ich denke, da muss ich vorher noch eine Spalte vor "A" einfügen und da dann die Verkettung machen, oder? Kann ich die Spalte gleich zu Beginn einfügen? Oder gibt es da Restriktionen und ich sollte sie erst vor rngMst.Columns(1).FormulaR1C1 = "=RC[1]&RC[2]&RC[3]" einsetzen?
2) Bei der Kopieraktion
"Range(rngCNeu.Cells(1, 5), rngCNeu.Cells(1, 15)).Copy _
Destination:=Range(rngCMst.Cells(1, 5), rngCMst.Cells(1, 15))"
kommt es zu einem Laufzeitfehler 1004 "Anwendungs- oder objektorientierter Fehler". Da ich den Code nicht so richtig durchdrungen habe, bin ich mir nicht sicher, wo der Fehler her kommt.
3) In der "For Each rngCMst In rngMst.Rows" Schleife läuft er ein mal mehr durch, als es Zeilen in der Masterliste gibt (vermutlich wegen dem Header?). Bei einer normalen "For" Schleife würde ich da einfach ein "-1" hinzufügen, aber die Schleife hier verstehe ich auch nicht so super... Daher bin ich mir nicht sicher, woran das liegt.
4) Das Sortieren funktioniert irgendwie gar nicht, habe ich das Gefühl, zumindest passiert da nichts. Ich vermute, man würde vor dem Sortieren die Hilfspalte wieder löschen und dann sortieren?
Aber ansonsten sieht der Code ziemlich cool aus.
Kannst Du mir bei den 4 Fragen hier oben noch helfen?
Vielen Dank und viele Grüße,
Peter
Anzeige
AW: Wieder mal Tabellen vergleichen
20.11.2016 09:50:19
fcs
Hallo Peter,
ich hab auch mal versucht, das Makro von Ur-Opa nachzuvollziehen.
1. Er hat vergessen, die Hilfsspalte für die Formeln links von Spalte A in beiden Blättern einzufügen
2. Durch den 1. Fehler passt dann auch die Suche nach dem eindeutigen Code nicht, da Werte in den falschen Spalten verglichen werden.
3. Beim Einfügen von neuen Datensätzen von Neu nach Master ist er dann noch bei den Variablen durcheinander gekommen, so dass beim Kopieren eine schon vorhandene Zeile überschrieben werden soll, was zur Fehlermeldung führt.
Ich hab seinen Code angepasst plus das Färben der neuen Datensätze eingefügt, so dass er jetzt funktioniert.
ich hab dann auch noch eine Lösung ohne Hilfsspalten gebastelt. Hier wird dann im Makro mit Arrays gearbeitet in denen die Codes in Master und Neu verarbeitet werden.
LG
Franz
korrigierte Lösung von Ur-Opa
Sub Abgleich()
Dim rngMst As Range, _
rngNeu As Range
Dim rngCMst As Range, _
rngCNeu As Range
Dim varPMst As Variant, _
varPNeu As Variant
Set rngMst = ThisWorkbook.Worksheets("Master").Cells(1, 1).CurrentRegion
Set rngNeu = ThisWorkbook.Worksheets("Neu").Cells(1, 1).CurrentRegion
If rngMst.Rows.Count 
Lösung ohne Hilfsspalten
'Code in einem allgemeinen Modul
Sub Update_Master()
Dim wksMaster As Worksheet, wksNeu As Worksheet
Dim arrNeu, arrCode, sCode As String, arrMaster
Dim Zeile_N As Long, Zeile_M As Long
Dim varZeile As Variant
Set wksNeu = ActiveWorkbook.Worksheets("Neu")
Set wksMaster = ActiveWorkbook.Worksheets("Master")
'Array mit Codes aus Daten in Spalten A bis C von Blatt "Neu" erstellen
arrCode = fncArrCode(wksNeu, Array(1, 2, 3))
With wksMaster
'Codea "Master" in Array einlesen
arrMaster = fncArrCode(wksMaster, Array(1, 2, 3))
'Codes im Master in Neu suchen
For Zeile_M = 2 To UBound(arrMaster)
sCode = arrMaster(Zeile_M)
varZeile = Application.Match(sCode, arrCode, 0)
If IsNumeric(varZeile) Then
'Code in Master ist in Neu vorhanden
wksNeu.Range(wksNeu.Cells(varZeile, 4), wksNeu.Cells(varZeile, 14)).Copy _
Destination:=.Cells(Zeile_M, 4)
Else
'Code in Master ist in Neu nicht vorhanden - durchstreichen
With .Range(.Cells(Zeile_M, 1), .Cells(Zeile_M, 14))
.Font.Strikethrough = True
End With
End If
Next
'Neue Codes mit Masterdaten vergleichen
For Zeile_N = 2 To UBound(arrCode)
sCode = arrCode(Zeile_N)
varZeile = Application.Match(sCode, arrMaster, 0)
If IsNumeric(varZeile) Then
'Zeile ist schon vorhanden - wurde aktualisiert
Else
'Einfüge-Zeile ermittel (Master-Liste muss aufsteigend sortiert sein!!!)
varZeile = Application.Match(sCode, arrMaster, 1)
If IsError(varZeile) Then varZeile = 1 'neuer Eintrag vor 1. Zeile
wksNeu.Range(wksNeu.Cells(Zeile_N, 1), wksNeu.Cells(Zeile_N, 14)).Copy
'kopierte Zellen einfügen
.Range(.Cells(varZeile + 1, 1), .Cells(varZeile + 1, 14)).Insert _
shift:=xlShiftDown
'eingefügte zeile grün färben
With .Range(.Cells(varZeile + 1, 1), .Cells(varZeile + 1, 14))
.Interior.Color = RGB(red:=0, green:=255, blue:=0)
End With
'Codes-Master neu berechnen
arrMaster = fncArrCode(wksMaster, Array(1, 2, 3))
End If
Next
End With
Erase arrMaster, arrCode
End Sub
Private Function fncArrCode(wks As Worksheet, arrSpalten, Optional sTrenn$ = "|", _
Optional Zeile1& = 1) As Variant
'Schlüsselwerte aus mehreren Spalten in einem 1-spaltigen Array zusammenfassen
Dim arrErgebnis() As String
Dim Spalte As Integer
Dim arrData
Dim Zeile_L As Long, Zeile As Long
With wks
'letzte Zeile mit Daten in den Spalten ermitteln
For Spalte = LBound(arrSpalten) To UBound(arrSpalten)
Zeile = .Cells(.Rows.Count, arrSpalten(Spalte)).End(xlUp).Row
If Zeile >= Zeile_L Then Zeile_L = Zeile
Next
'Daten in Tabelle in Array einlesen
arrData = .Range(.Cells(Zeile1, 1), .Cells(Zeile_L, arrSpalten(UBound(arrSpalten))))
ReDim arrErgebnis(Zeile1 To Zeile_L)
'Codes in Array schreiben mit Trennzeichen
For Zeile = Zeile1 To Zeile_L
arrErgebnis(Zeile) = arrData(Zeile, arrSpalten(LBound(arrSpalten)))
For Spalte = LBound(arrSpalten) + 1 To UBound(arrSpalten)
arrErgebnis(Zeile) = _
arrErgebnis(Zeile) & sTrenn & arrData(Zeile, arrSpalten(Spalte))
Next
Next Zeile
End With
fncArrCode = arrErgebnis
Erase arrErgebnis
End Function

Anzeige
AW: Wieder mal Tabellen vergleichen
20.11.2016 13:08:12
Peter
Hi Franz,
voll krass :-), vielen Dank.
Ich habe bis eben gebraucht, Deine Lösung in mein anderes Excel zu integrieren... :-)
Aber ich glaube, dass ich das meiste hinbekommen habe. *thumbs up*
Es hat länger gedauert, weil ich noch eine Progress Bar eingebaut habe, welche mir den Fortschritt anzeigt, da das Makro ja doch ein wenig länger dauert...
Dann habe ich noch versucht, das sortieren von Ur-Opa einzufügen - tut aber (noch) nicht.
Sobald ich Apply anwende, kommt ein "Laufzeitfehler 1004": "Der Sortierbezug ist ungültig. Überprüfen Sie, ob sich der Sortierbezug innerhalb der markierten Daten befindet und ob das Feld "Sortieren nach" nicht den gleichen Bezug enthält oder leer ist."
Habe mir das Sortieren aber noch nicht sooo genau angeschaut.
Ich werde mir jetzt dann mal den von Dir korrigierten Code von Ur-Opa anschauen... Könnte aber ein Weilchen dauern, da ich nicht soooo fit im VBA bin... :-)
Ich habe noch eine Frage zu Deinem ursprünglichen Code:
In dem Abschnitt:
   'Master Nummer 2+3 weitersuchen
If Not rFind Is Nothing Then
With rFind:  flg = Empty
'Schleife zum Suchen aller Daten
For j = 1 To 100
If AC.Value  .Cells(j, 1) Then flg = "No": Exit For
If Num2 = .Cells(j, 2) And Num3 = .Cells(j, 3) Then
.Cells(j, 4).Resize(1, 14).Copy
           AC.Offset(0, 3).PasteSpecial xlPasteValues
Application.CutCopyMode = False
Exit For
End If
Next j
End With
End If
Hier kopierst Du die Daten von Neu nach Master, also z. B. von Zeile 50 in "neu" in Zeile 30 in "Master". Wie kann ich heraus finden, welche Zeile im Tabellenblatt "Neu" aktuell kopiert wird (im Beispiel wäre das Zeile 50)? Ich würde nämlich gerne eine Berechnung in der Zelle im Master und der entsprechenden Zelle in "Neu" durchführen. Ich will quasi den Wert der einen Zelle im "Master" (Zeile 30, Spalte 10) von dem Wert in "Neu" (Zeile 50, Spalte 10) abziehen und in den "Master" (an eine Stelle janz weit draußen... also rechts (Zeile 30, Spalte 20)) kopieren.
Nochmals danke und Gruß,
Peter
Anzeige
AW: Wieder mal Tabellen vergleichen
20.11.2016 15:47:23
fcs
Hallo peter,
an meinen ursprünglichen Code kann ich mich nicht mehr so recht erinnern.
Aus dem Codeschnippsel müsste es etwa wie folgt aussehen:
   'Master Nummer 2+3 weitersuchen
If Not rFind Is Nothing Then
With rFind:  flg = Empty
'Schleife zum Suchen aller Daten
For j = 1 To 100
If AC.Value  .Cells(j, 1) Then flg = "No": Exit For
If Num2 = .Cells(j, 2) And Num3 = .Cells(j, 3) Then
.Cells(j, 4).Resize(1, 14).Copy
AC.Offset(0, 3).PasteSpecial xlPasteValues
Application.CutCopyMode = False
'           ZeileNeu = rFind.Row + j - 1
'in Spalte 20 von Master für Spalte 10 die Differenz zu Neu eintragen
AC.Offset(0, 19).Value = rFind.Offset(j - 1, 9).Value - AC.Offset(0, 9).Value
Exit For
End If
Next j
End With
End If
LG
Franz
Anzeige
AW: Wieder mal Tabellen vergleichen
20.11.2016 19:16:36
Peter
hi Franz,
suppi, funktioniert bestens. Vielen Dank nochmal. Ich werde noch ein wenig brauchen, bis ich Ur-Opas Lösung probiert habe, aber Deine funktioniert auf jeden Fall schon mal! Ich werde berichten.
Viele Grüße,
Peter
AW: Wieder mal suchen
20.11.2016 11:12:42
Ur-Opa
Hallo Peter,
Sorry, ich hatte nicht erwähnt, dass ich links (Spalte A) eine Hilfsspalte für die verketteten Schlüssel eingefügt hatte. Daher kommen auch die nachfolgenden Probleme.
Die Hilfsspalte muss nicht unbedingt immer wieder hinzugefügt oder gelöscht werden. Es reicht, wenn man die Spalte ausblendet.
Der Unterschied zu der Lösung von Piet liegt darin, dass ich konsequent Variablen verwende, die Bereiche im Arbeitsplatz repräsentieren, also Bereichs-Objekte bzw. Range-Objekte, einsetze.
Die Bereiche rngMst und rngNeu enthalten nach der Resize-Anweisung alle Master- bzw. Neu-Daten ohne Header.
Dann werden alle Zellen in der ersten (der Hilfsspalte) mit einer Formel nach der Z1S1-Notation gefÜllt. Z1S1 bedeutet, dass die Bezüge nicht mit A1, A2 etc., sondern Zeile 1/Spalte 1 etc adressiert werden. RC[1] adressiert eine Zelle in der gleichen Zeile eine Spalte rechts.
Durch die Verwendung der Range-Objekte ist es möglich, die Formel in alle Zellen der ersten Spalte des Ranges gleichzeitig einzutragen, ohne zu kopieren.
Die Range-Objekte rngCMst und rngCNeu nehmen einzelne Datenzeilen auf.
Sie dienen hauptsächlich als Laufvariable in den For-Next-Schleifen. Damit spart man sich die Verwaltung von nummerischen Indizes (z.B. For x = 1 to 10).
Statt der Find-Methode verwende ich mit Application.Match die VERGLEICH-Funktion aus dem Excel.
Als Ergebnis erhält man in varPMst bzw. varPNeu entweder einen Fehlerzustand oder die Zeilennummer, in der der entsprechende Schlüssel gefunden wurde.
Ich hoffe, diese Erläuterungen machen das Konzept etwas klarer.
Am besten den Makro einmal schrittweise ausführen und im Überwachungsfenster z.B. die
Adressen der Bereichs-Objekte überwachen.
Es lohnt sich, konsequent mit Objekten zu arbeiten, wie z.B.Range-Ojekten.
Damit stehen sehr vielfältige und mächtige Werkzeuge zur Verfügung und Code sieht "cool" aus.
An dieser Stelle noch herzlichen Dank an fcs für die Fehlerbereinigung.
Schönen Sonntag noch
Ur-Opa
Anzeige
AW: Wieder mal suchen
20.11.2016 19:19:11
Peter
Hi Ur-Opa,
vielen Dank für die weiterführende Erklärung. Ich werde mir das in aller Ruhe anschauen... Ich melde mich, sobald ich es integriert habe.
Liebe Grüße,
Peter
AW: "noch en Gedicht ...hi hi hi"
19.11.2016 23:07:34
Piet
Hallöchen "noch en Gedicht ..."
anbei die Beispieldatei mit zwei Suchmakros zurück. Nur noch einen Button einfügen, Fertig.
Ich kopiere allerdings nur die Daten aus Blatt Neu, oder markiere gelöschte Daten in Master.
Die Einzelheiten und Details von 1-3 am Ende Anfrage habe ich mir nicht weiter angesehen.
Den Code von Ur-Opa habe ich mir angesehen, aber nicht verstanden. Ist komplizierter.
Ich hoffe das mein Makro einfacher zu verstehen ist, falls du es noch abwandeln willst.
Würde mich freuen wenn dieser Teil schon mal weiterhilft, mehr kann ich nicht tun.
https://www.herber.de/bbs/user/109567.xlsm
mfg Piet
Anzeige
AW: "noch en Gedicht ...hi hi hi"
20.11.2016 00:54:49
Peter
Hi Piet,
vielen Dank für Deinen Code. Sieht auch sehr gut aus. Ich werde noch versuchen, den Code von Ur-Opa zu verstehen.
Insbesondere würde mich interessieren, was die wesentlichen Unterschiede zwischen den beiden Codes sind. Na ja - gut - einer der wesentlichen Unterschiede ist, dass ich Deinen einigermaßen, den von Ur-Opa, nur wenig verstehe :-)
Aber Spaß beiseite: Ur-Opa, kannst Du mir die Unterschiede (kurz) erklären?
Wie auch immer, ich bin ja kein Profi.
Ich werde morgen mal versuchen, die beiden Codes in mein eigentliches Excel rein zu pflegen und schaue, wie es läuft.
Vielen Dank auf jeden Fall euch beiden. Ohne euch hätte ich das nicht hin bekommen.
Viele Grüße,
Peter
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige