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