Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1160to1164
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

Listenabgleich, eine Datei auf Netzlaufwerk

Listenabgleich, eine Datei auf Netzlaufwerk
Tanja
Hallo liebe Excellianer,
ich benötige ein wenig Hilfe bei einem Makro...
Folgende Sitation:
Ich habe zwei Excel-Files. File 1 liegt auf einem Netzlaufwerk und wird von sämtlichen Leuten bearbeitet. File 2 ist lokal bei den Mitarbeitern gespeichert.
In File 1 stehen ab C4 Vor- und ab D4 Nachnamen.
In File 2 stehen ab D5 Vor- und ab E5 Nachnamen.
File 2 soll Namen, die noch nicht in File 2 stehen, aus File 1 "reinladen". Die Namensliste soll also aktualisiert werden.
Das Problem dabei für mich: In File 1 stehen die Namen nicht direkt untereinander, sondern es können durchaus mal ein paar Leerzeilen dazwischensein. Diese sollen natürlich nicht mit in File 2 übernommen werden. ;)
Meine Fragen sind nun: Wie kann ich es bewerkstelligen, dass aus File 1 fehlende Namen (am besten auf Knopfdruck) eingelesen werden, ohne das hinterher Namen doppelt in File 2 sind? Ist das überhaupt möglich, wenn File 1 auf einem Netzlaufwerk liegt?
Wäre für jede Hilfe sehr dankbar!
VG
Tanja
AW: Listenabgleich, eine Datei auf Netzlaufwerk
14.06.2010 11:13:28
Oberschlumpf
Hi Tanja
Versuch es mal hiermit:
https://www.herber.de/bbs/user/70039.zip
Die 2 Dateien in der Zip-Datei müssen zuerst in das gleiche Verzeichnis entpackt werden.
Dann starte die Datei mit dem Namen "lokale Datei mit Makro.xls".
Starte über Extras/Makro/Makros das Makro "sbNamen".
Nach kurzer Zeit wirst du sehen, dass die fehlenden Einträge in Spalte D + E ans Ende der Liste angehängt wurden.
Um die Datei auch für euer Netzwerk lauffähig zu machen, musst du die im Makro eingetragenen Hinweise beachten.
Sollte etwas nicht funktionieren, nenn uns bitte den korrekten Servernamen, auf dem die Netzwerkdatei gespeichert ist. Und auch der Name der Datei ist wichtig.
Und beschreibe bitte sehr genau, was nicht funktioniert. Nur der Hinweis "es geht nicht", ist nicht hilfreich.
Klappt es denn schon?
Ciao
Thorsten
Anzeige
AW: Listenabgleich, eine Datei auf Netzlaufwerk
14.06.2010 11:57:49
Tanja
Hi Thorsten,
erst einmal vielen lieben Dank!
Lokal funktioniert dein Makro einwendfrei. Dafür schonmal ganz herzlichen Dank! Sobald ich aber auf die Netzwerkdatei verlinke, läuft das Makro zwar immer noch durch, aber das einzige Ergebnis, dass ich bekomme sind drei Zeilen:
8 c:\Test\xls\Offer.xls
13 c:\Test\xls\Offer.xls
12 c:\Test\xls\Offer.xls
Ich persönlich sehe in der Netzwerk-Datei nur ein Tabellenblatt. Ich vermute mal, dass es noch andere ausgeblendete gibt, dass ich nun erstmal rausfinden muss, auf welchem Blatt die Daten nun wirklich stehen. ;)
Falls du noch eine andere Idee hast, woran das liegen könnte, würde mich es freuen zu hören!
Ganz liebe Grüße und vielen Dank
Tanja
Anzeige
AW: Listenabgleich, eine Datei auf Netzlaufwerk
14.06.2010 12:06:09
Tanja
Es lag tatsächlich am Tabellenblatt. Nun funktioniert alles wunderbar. Ich danke dir! :)
AW: Listenabgleich, eine Datei auf Netzlaufwerk
14.06.2010 12:09:31
Tanja
Kurze Frage nochmal... könntest du mir vielleicht noch ein wenig mehr kommentieren? Würde gerne nachvollziehen können, was dort passiert. :)
AW: Listenabgleich, eine Datei auf Netzlaufwerk
14.06.2010 14:58:10
Oberschlumpf
Hi Tanja
Hier die Erklärungen zum Code:
Modul Modul1
'wenn die nächste Codezeile vorhanden, 
'dann MUSS jede Variable deklariert werden 
'nicht zwingend erforderlich, erleichtert aber das Programmieren 
'wenn man sich bei ner Variable mal verschreibt, 
'wird der Code gar nicht erst gestartet, weil die vertippte Variable 
'dem Code niht bekannt ist 
Option Explicit 
 
Sub sbNamen() 
 
 'Deklaration aller verwendeten Variablen 
 'ist nicht zwingend erforderlich (nur, wenn Option Explicit nicht vorhanden), 
 'fördert aber ein "saubereres" Programmieren 
 Dim lloRow As Long, lloNetIndex As Long, lloLocalIndex As Long 
 Dim lvarNetNames(), lvarLocalNames(), lboTreffer As Boolean 
 
 'Erstellt die Anzahl und Tiefen der benötigten Dimensionen von Array-Variablen 
 'eine Array-Variable muss man sich wie eine Tabelle vorstellen 
 'z Bsp lvarNetNames(2, 2) bedeutet eine "Tabelle" mit 3 Spalten + 3 Zeilen 
 '3 deshalb, weil als Standard die Zählung bei 0 beginnt...0,1,2 = 3 Stellen 
 Redim lvarNetNames(2, 0) 
 Redim lvarLocalNames(1, 0) 
 
 'es werden die... 
 'a)...Bildschirmaktualisierung 
 'b)...Ereignis-Verfolgung 
 'abgeschaltet 
 'a) es sieht schöner aus, weil die Anzeige auf dem Monitor nicht flackert 
 'b) es werden unerwünschte Aktionen verhindert 
 'wenn z Bsp an anderer Stelle bei Änderung in Spalte C VBA-Code gestartet 
 'werden soll, wird das hier verhindert, weil in diesem Codeteil nicht gewünscht 
 'ausserdem ist der Ablauf schneller 
 With Application 
 .ScreenUpdating = False 
 .EnableEvents = False 
 End With 
 
 'hier den Pfad + Dateinamen 
 'für die Datei im Netzwerk 
 'anpassen...usw 
 '...den Text kennst du ja schon 
 
 'die Netzwerkdatei wird geöffnet 
 'weil ScrrenUpdating = False, sieht der Anwender nur in der Taskleiste, 
 'dass die Datei geöffnet wurde 
 'True am Ende der Zeile bedeutet, dass die Datei schreibgeschützt 
 'geöffnet wurde 
 Workbooks.Open ThisWorkbook.Path & "\netzwerkdateiname.xls", , True 
 
 'der Code innerhal von With + End With bezieht sich NUR auf das Objekt, 
 'dessen Bezeichnung dem ersten With folgt - hier ist es 
 'das erste Tabellenblatt aus der Datei, die gerade geöffnet wurde - 
 'die Datei im Netzwerk 
 With ActiveWorkbook.Sheets(1) 
 
 'eine For/Next-Schleife durchläuft alle Zellen in Spalte C + D, 
 'beginnend in Zeile 4, endend in der letzten benutzten Zeile 
 'in Spalte C (3) 
 For lloRow = 4 To .Cells(Rows.Count, 3).End(xlUp).Row 
 
 'wenn eine Zelle in Spalte C NICHT leer ("") ist, dann... 
 If .Range("C" & lloRow).Value <> "" Then 
 
 '...schreibe den Wert aus Zelle in Spalte C in die Array-Variable an erster Stelle 
 '...schreibe den Wert aus Zelle in Spalte D in die Array-Variable an zweiter Stelle 
 '...schreibe die aktuelle Zeile in die Array-Variable an dritter Stelle 
 lvarNetNames(0, lloNetIndex) = .Range("C" & lloRow).Value 
 lvarNetNames(1, lloNetIndex) = .Range("D" & lloRow).Value 
 lvarNetNames(2, lloNetIndex) = lloRow 
 
 'der Index-Zähler für die Array-Variable wird um 1 erhöht 
 lloNetIndex = lloNetIndex + 1 
 
 'die Array-Variable wird um eine Zeile erhöht 
 '- aus dem Grund, weil immer nur genau so viele Zeilen/Spalten 
 ' in eine Array-Variable hinein passen, wie vorhanden sind 
 'kannst du mit Excel bis Version 2003 vergleichen 
 'ein Tabellenblatt hat auch nur 256 Spalten 
 'und etwas mehr als 65.000 Zeilen 
 Redim Preserve lvarNetNames(2, lloNetIndex) 
 End If 
 Next 
 End With 
 
 'der Code innerhal von With + End With bezieht sich NUR auf das Objekt, 
 'dessen Bezeichnung dem ersten With folgt - hier ist es 
 'das erste Tabellenblatt aus der Datei, in der auch dieser Code steht - 
 'die lokal gespeicherte Datei 
 With ThisWorkbook.Sheets(1) 
 
 'siehe im vorherigen With/End With Code 
 'hier passiert fast das selbe, wie mit der Netzwerkdatei 
 'die For/Next-Schleife beginnt nur in der 5. Zeile in der 4. Spalte 
 'auch hier werden vorhandene leere Zeilen NICHT beachtet 
 For lloRow = 5 To .Cells(Rows.Count, 4).End(xlUp).Row 
 If .Range("D" & lloRow).Value <> "" Then 
 lvarLocalNames(0, lloLocalIndex) = .Range("D" & lloRow).Value 
 lvarLocalNames(1, lloLocalIndex) = .Range("E" & lloRow).Value 
 lloLocalIndex = lloLocalIndex + 1 
 Redim Preserve lvarLocalNames(1, lloLocalIndex) 
 End If 
 Next 
 
 'nun erfolgt der Vergleich zwischen Netzwerk- und lokal gespeicherter Datei 
 
 'eine For/Next-Schleife mit den Einträgen aus der 
 'Netzwerkdatei wird gestartet 
 'beginnend mit dem ersten, gefundenen Namen/Vornamen 
 'endend mit dem letzten Eintrag für Name/Vorname 
 For lloNetIndex = Lbound(lvarNetNames, 2) To Ubound(lvarNetNames, 2) 
 
 
 'eine For/Next-Schleife mit den Einträgen aus der 
 'lokal gespeicherten Datei wird gestartet 
 'beginnend mit dem ersten, gefundenen Namen/Vornamen 
 'endend mit dem letzten Eintrag für Name/Vorname 
 For lloLocalIndex = Lbound(lvarLocalNames, 2) To Ubound(lvarLocalNames, 2) 
 
 'wenn Name + Vorname aus der Netzwerkdatei 
 'mit Name + Vorname aus der lokal gespeicherten Datei 
 'identisch ist, dann... 
 If lvarLocalNames(0, lloLocalIndex) = lvarNetNames(0, lloNetIndex) And _
 lvarLocalNames(1, lloLocalIndex) = lvarNetNames(1, lloNetIndex) Then 
 
 '...melde an den Code einen Treffer, 
 'der NICHT berücksichtig werden soll, und... 
 lboTreffer = True 
 
 'verlasse die For/Next-Schleife für die Werte in der lokalen Datei 
 Exit For 
 End If 
 Next 
 
 'wenn Treffer gefunden, dann... 
 If lboTreffer = True Then 
 
 '...vergiss das ganz schnell wieder :-) 
 lboTreffer = False 
 Else 
 'wenn kein Treffer gefunden (gleicher vollständiger Name 
 'in beiden Dateien), dann... 
 '...wurde in der Netzwerkdatei ein Name gefunden, 
 'der nicht in der lokalen Datei vorhanden ist 
 
 'deswegen... 
 'trage in die lokale Datei in Spalte D den Vornamen 
 'und in Spalte E den Namen ein 
 .Range("D" & .Cells(Rows.Count, 4).End(xlUp).Row + 1).Value = lvarNetNames(0, lloNetIndex) 
 .Range("E" & .Cells(Rows.Count, 4).End(xlUp).Row).Value = lvarNetNames(1, lloNetIndex) 
 End If 
 Next 
 End With 
 
 'nach vollständigen Durchlauf aller verwendeten For/Next-Schleifen wird 
 'die Netzwerkdatei automatisch wieder geschlossen 
 ActiveWorkbook.Close False 
 
 'die... 
 '...Bildschirmaktualisierung 
 '...Ereignis-Verfolgung 
 'werden wieder eingeschaltet 
 With Application 
 .ScreenUpdating = True 
 .EnableEvents = True 
 End With 
 
 'puhh...FERTIG! :-) 
 
End Sub 
[size=8]Code eingefügt mit [url=http://vbahtml.origo.ethz.ch] VBA in HTML 2.0.0.3[/url][/size]
Hilfts? Ne Antwort wäre nett.
Ciao
Thorsten
Anzeige
AW: Listenabgleich, eine Datei auf Netzlaufwerk
14.06.2010 15:05:06
Tanja
Hi Thorsten,
das hast du so beispielhaft beschrieben, dass ich das sogar wunderbar verstehe. Danke! :)
LG
Tanja
AW: Listenabgleich, eine Datei auf Netzlaufwerk
15.06.2010 09:22:54
Tanja
Guten Morgen,
kurze Ergänzungsfrage: Wenn ich in Spalte A bei den neuen Einträgen ein "X" stehen haben möchte, muss ich deinen Code
.Range("D" & .Cells(Rows.Count, 4).End(xlUp).Row + 1).Value = lvarNetNames(0, lloNetIndex)
.Range("E" & .Cells(Rows.Count, 4).End(xlUp).Row).Value = lvarNetNames(1, lloNetIndex)
dann so ändern?
.Range("A" & .Cells(Rows.Count, 4).End(xlUp).Row + 1).Value = "X"
.Range("D" & .Cells(Rows.Count, 4).End(xlUp).Row).Value = lvarNetNames(0, lloNetIndex)
.Range("E" & .Cells(Rows.Count, 4).End(xlUp).Row).Value = lvarNetNames(1, lloNetIndex)
Trau mich nicht, es einfach auszuprobieren. ;)
LG
Tanja
Anzeige
AW: Listenabgleich, eine Datei auf Netzlaufwerk
15.06.2010 09:47:05
Oberschlumpf
Moin Tanja :-)
Doch, doch, probier es ruhig...zuerst vllt mit einer Testkopie deiner Datei.
Aber ich denke, alles sollte ok sein.
Das + 1 in deiner X-Zeile "belegt" als erstes die nächste freie Datenzeile.
Und dann folgen - ohne + 1 - die anderen Daten in andere Spalten in der gleichen Zeile.
Viel Erfolg! :-)
Ciao
Thorsten
AW: Listenabgleich, eine Datei auf Netzlaufwerk
15.06.2010 14:31:25
Tanja
Hallo Thorsten,
also der Code muss so aussehn?!
.Range("A" & .Cells(Rows.Count, 4).End(xlUp).Row + 1).Value = "X"
.Range("D" & .Cells(Rows.Count, 4).End(xlUp).Row + 1).Value = lvarNetNames(0, lloNetIndex)
.Range("E" & .Cells(Rows.Count, 4).End(xlUp).Row).Value = lvarNetNames(1, lloNetIndex)
Ist mir zwar vollkommen unklar, wieso, aber bei dem anderen sind nur Fehler aufgetreten. Danke nochmal für deine Hilfe! :)
LG
Tanja
Anzeige
AW: Listenabgleich, eine Datei auf Netzlaufwerk
16.06.2010 07:26:08
Oberschlumpf
Hi Tanja
Meine letzte Erklärung/ungetestete Vermutung war falsch.
Dein Code ist jetzt richtig - und auch logisch ;-)
jetzt meine - richtige - Erklärung ;-)
Cells(Rows.Count, 4).End(xlUp).Row.....(ohne + 1)
gibt die zuletzt benutzte Zeile in Spalte 4 (D) zurück
dein erster Befehl
.Range("A" & .Cells(Rows.Count, 4).End(xlUp).Row + 1).Value = "X"
schreibt aber in Spalte 1 (A) einen Wert in die nächste freie Zeile - abhängig von Spalte 4 (D)
somit hat sich in Spalte 4 (D) noch nichts geändert.
Deswegen muss auch dein nächster Befehl mit + 1 arbeiten.
Erst jetzt gibt es in Spalte 4 (D) "Zuwachs" - die Anzahl der benutzten Zeilen hat sich mit dem 2. Befehl um 1 erhöht.
Und somit "kommt" erst der dritte Befehl ohne +1 aus und schreibt den Wert trotzdem in die richtige Zeile.
Hoffe, dir mit diesem Wirrwarr an Erklärung doch noch zum richtigen Verständnis geholfen zu haben ;-)
Ciao
Thorsten
Anzeige
AW: Listenabgleich, eine Datei auf Netzlaufwerk
16.06.2010 09:05:33
Tanja
Hallo Thorsten,
unglaublich aber wahr... ich hab's tatsächlich verstanden. ;)
Danke! :-)
LG
Tanja

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige