Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
836to840
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
836to840
836to840
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Brauch dringend Hilfe bei Makro!!!!

Brauch dringend Hilfe bei Makro!!!!
19.01.2007 09:54:26
Katharina
Hi,
ich hab ein paar Makros zusammengematscht um folgende Aufgabe zu lösen:
Es gibt zwei Excel-Dateien:
• In der Datei „Zentrale.xls“ werden die ersten drei Spalten (Nr., Thema, Details) gepflegt.
• Die Datei „Werk.xls“ übernimmt die Einträge in diesen Spalten, und es werden von anderen Nutzern in den Spalten vier und fünf (Bewertungsampel und –begründung) eigene Einträge gemacht, die sich auf die Einträge der ersten drei Spalten beziehen (ein Datensatz je Zeile).
• Alle Dateien werden laufend aktualisiert.
• In der Datei „Zentrale.xls“ werden Zeilen zwischen bestehenden Datensätzen angelegt und dort neue Datensätze angelegt. Außerdem werden bereits bestehende Datensätze geändert oder ergänzt (z.B. wenn zunächst nur die erste Spalte angelegt wurde).
• Die Datei „Werk.xls“ soll beim Öffnen automatisch erkennen, ob eine Aktualisierung stattgefunden hat und wenn ja, jede Aktualisierung von „Zentrale.xls“ übernehmen. Dabei müssen bereits eingetragene Bewertungen in Spalte 4 und 5 zum jeweiligen Thema zugeordnet bleiben (=der Datensatz in einer Zeile bleibt vollständig zusammen).
Mein Makro sieht jetzt folgendermaßen aus:
Option Explicit
Option Compare Text
Public

Function IsFileOpen(ByRef Path As String) As Boolean
Dim FileNr As Integer
Dim ErrorNr As Long
'Datei testweise öffnen:
On Error Resume Next
FileNr = FreeFile
Open Path For Input Lock Write As #FileNr
ErrorNr = Err.Number
Close #FileNr
On Error GoTo 0
'Ggf. Fehler verarbeiten:
Select Case ErrorNr
Case 0    'kein Fehler:
'NOP
Case 70   'Permission denied':
IsFileOpen = True
Case Else 'sonstiger Fehler:
Err.Raise ErrorNr
End Select
End Function


Sub zen_werk()
'Unter der Voraussetzung das in beiden Mappen in den Spalten A nur Zahlen enthalten
'sind und es keine Doppelgänger gibt.
'Natürlich vorläufig nur mit Kopien probieren.
Dim wb1 As Workbook 'Arbeitsmappe zentrale
Dim wb2 As Workbook 'Arbeitsmappe werk
Dim ws1 As Worksheet 'Tabellenblatt 1 zentrale
Dim ws2 As Worksheet 'Tabellenblatt 1 werk
Dim rnga As Range 'Suchrange in Tab Werk Spalte A
Dim lngNr1 As Long 'Zeilenzähler
Dim lngNr2 As Long 'Zeilenzähler
Dim strS1 As String
Dim strS2 As String
Dim path_wb1 As String 'Pfad Zentrale
Dim path_wb2 As String 'Pfad Werk
On Error GoTo errorhandler
'Es fehlt noch die Überprüfung ob die Datei schon geöffnet ist.(Überall im Netz zur finden)
path_wb2 = "O:\TI-50\TI-501\20_Team\Giesguth\Sonstiges\BBM\Test1\Werk.xls" 'Pfad anpassen
Workbooks.Open path_wb2 & "Werk.xls" 'Dateinamen anpassen
strS1 = FileDateTime("O:\TI-50\TI-501\20_Team\Giesguth\Sonstiges\BBM\Test1\Zentrale.xls") ' Pfad und Dateinamen anpassen
Set wb1 = Workbooks("Zentrale.xls")
Set wb2 = Workbooks("Werk.xls")
Set ws1 = wb1.Sheets(1)
Set ws2 = wb2.Sheets(1)
'Wenn die Datei erneut gespeichert wurde, dann
If strS1 <> wb2.Sheets("zeit").Cells(1, 1).Value Then 'Tabellenblatt zeit in der Arbeitsmappe Werk anlegen
path_wb1 = "O:\TI-50\TI-501\20_Team\Giesguth\Sonstiges\BBM\Test1\Zentrale.xls"
Workbooks.Open path_wb1 & "Zentrale.xls"
lngNr1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
lngNr2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
For lngNr1 = 2 To lngNr1
With ws2.Range("A:A")
Set rnga = .Find(ws1.Cells(lngNr1, 1), LookIn:=xlValues)
End With
If Not rnga Is Nothing Then
lngNr2 = rnga.Row
If ws1.Cells(lngNr1, 2).Value <> ws2.Cells(lngNr2, 2).Value Or _
ws1.Cells(lngNr1, 3).Value <> ws2.Cells(lngNr2, 3).Value Then
ws2.Cells(lngNr2, 2).Value = ws1.Cells(lngNr1, 2).Value
ws2.Cells(lngNr2, 3).Value = ws1.Cells(lngNr1, 3).Value
End If
End If
Next
For lngNr1 = 2 To lngNr1
If ws1.Cells(lngNr1, 1).Value <> ws2.Cells(lngNr1, 1).Value Then
ws2.Cells(lngNr1, 1).EntireRow.Insert
ws2.Cells(lngNr1, 1).Value = ws1.Cells(lngNr1, 1).Value
ws2.Cells(lngNr1, 2).Value = ws1.Cells(lngNr1, 2).Value
ws2.Cells(lngNr1, 3).Value = ws1.Cells(lngNr1, 3).Value
End If
Next
wb2.Sheets("zeit").Cells(1, 1).Value = strS1
End If
Set wb1 = Nothing
Set wb2 = Nothing
Set ws1 = Nothing
Set ws2 = Nothing
Set rnga = Nothing
Exit Sub
errorhandler:
Resume
End Sub

Das Problem ist jetzt, dass ich meine fehlermeldungen bezüglich aktualisierung jetzt zwar beseitigt habe, es aber gar keine Aktualisierung mehr stattfindet.
Außerdem besteht seit anfang das Problem, dass in datei zwei keine ganze Zeilen eingefügt werden, sondern nur Spalte 1-3.
Kann mir da irgendwer weiterhelfen? es ist echt wichtig!
P.S.: ich hab die beiden Probedateien mal angehängt.
https://www.herber.de/bbs/user/39770.xls

Die Datei https://www.herber.de/bbs/user/39771.xls wurde aus Datenschutzgründen gelöscht

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Brauch dringend Hilfe bei Makro!!!!
21.01.2007 15:36:30
fcs
Hallo Katharina,
"zusammengematsch" ist leider das richtige Wort für die Makros. Leider waren immer noch etliche Syntax-Fehler im Code. Diese wurden aber durch die Art der Fehlerbehandlung nicht mehr angezeigt und der Code lief ohne Aktionen durch oder in eine Endlosschleife. Während des Testens/der Erstellung eines Makros sollte man die Fehlerbehandlung deaktivieren oder ,wenn man genau weiß wie es geht, die Fehlercodes anzeigen lassen. Dann bricht das Makro immer an der Problemstelle ab und man weiß wo man ansetzen muss zur Fehlerbeseitigung.
Ich hab den Code mal entrümpelt und die Such-/Einfüge-Schleife für den Vergleich der beiden Dateien etwas modifiziert.
Damit das Ganze flexibel bleibt und auch funktioniert, empfehle ich, die Zeilennummern in Spalte A nicht per Formel zu berechnen und die Zeilennummern in 10er- oder 100er-Gruppen zu vergeben. Je nachdem wieviele Zeilen pro Haupteintrag zu erwarten sind. Dann kann das Makro auch problemlos zusätzliche Zeilen aus der Zentrale.xls in die Werk.xls einfügen und übertragen.
In der ZIP-Datei findest du deine Beispieldateien entsprechend aufbereitet. Sowie eine Steuerdatei mit dem modifizierten Makro.
https://www.herber.de/bbs/user/39825.zip
Gruss
Franz
Der modifizierte Code schaut jetzt so aus:

Option Explicit
Option Compare Text
Function IsFileOpen(ByRef Path As String) As Boolean
Dim FileNr As Integer
Dim ErrorNr As Long
'Datei testweise öffnen:
On Error Resume Next
FileNr = FreeFile
Open Path For Input Lock Write As #FileNr
ErrorNr = Err.Number
Close #FileNr
On Error GoTo 0
'Ggf. Fehler verarbeiten:
Select Case ErrorNr
Case 0    'kein Fehler:
'NOP
Case 70   'Permission denied':
IsFileOpen = True
Case Else 'sonstiger Fehler:
Err.Raise ErrorNr
End Select
End Function
Sub zen_werk()
'Unter der Voraussetzung das in beiden Mappen in den Spalten A nur Zahlen enthalten
'sind und es keine Doppelgänger gibt.
'Natürlich vorläufig nur mit Kopien probieren.
Dim wb1 As Workbook 'Arbeitsmappe zentrale
Dim wb2 As Workbook 'Arbeitsmappe werk
Dim ws1 As Worksheet 'Tabellenblatt 1 zentrale
Dim ws2 As Worksheet 'Tabellenblatt 1 werk
Dim rnga As Range 'Suchrange in Tab Werk Spalte A
Dim lngNr1 As Long 'Zeilenzähler
Dim lngNr2 As Long 'Zeilenzähler
Dim strS1 As String
Dim strS2 As String
Dim path_wb1 As String 'Pfad Zentrale
Dim path_wb2 As String 'Pfad Werk
Dim eingefuegt As Boolean 'Check für einfügen von neuen Zeilen in Werk.xls
On Error GoTo errorhandler
'Pfade der Dateien setzen
'  GoTo test_1 'Zum testen diese Zeile aktivieren
path_wb1 = "O:\TI-50\TI-501\20_Team\Giesguth\Sonstiges\BBM\Test1\"
path_wb2 = "O:\TI-50\TI-501\20_Team\Giesguth\Sonstiges\BBM\Test1\"
GoTo Test2
test_1:
'Pfade zum Testem
path_wb1 = "C:\Test\"
path_wb2 = "C:\Test\"
Test2:
'Prüfung ob Datei Werk.xls geöffnet ist
If IsFileOpen(path_wb2 & "Werk.xls") = False Then
Workbooks.Open path_wb2 & "Werk.xls" 'Dateinamen anpassen
Set wb2 = Workbooks("Werk.xls")
Set ws2 = wb2.Sheets(1)
Else
MsgBox "Datei Werk.xls ist zur Zeit geöffnet und kann nicht bearbeitet werden." & vbLf & vbLf _
& "Bitte später noch einmal Versuchen"
Exit Sub
End If
strS1 = FileDateTime(path_wb1 & "Zentrale.xls") ' Pfad und Dateinamen anpassen
'Vergleich der Speicherzeit von Zentrale.xls mit der zuletzt verwendeten Version
If strS1 <> wb2.Sheets("zeit").Cells(1, 1).Value Then
Workbooks.Open path_wb1 & "Zentrale.xls"
Set wb1 = Workbooks("Zentrale.xls")
Set ws1 = wb1.Sheets(1)
lngNr1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
lngNr2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
For lngNr1 = 2 To lngNr1
With ws2.Range("A:A")
Set rnga = .Find(ws1.Cells(lngNr1, 1), LookIn:=xlValues)
End With
If Not rnga Is Nothing Then
'Nummer in Werk.xls bereits vorhanden
lngNr2 = rnga.Row
'Inhalte in Spalten 2 und 3 vergleichen
If ws1.Cells(lngNr1, 2).Value <> ws2.Cells(lngNr2, 2).Value Or _
ws1.Cells(lngNr1, 3).Value <> ws2.Cells(lngNr2, 3).Value Then
ws2.Cells(lngNr2, 2).Value = ws1.Cells(lngNr1, 2).Value
ws2.Cells(lngNr2, 3).Value = ws1.Cells(lngNr1, 3).Value
End If
Else
'Nummer in Werk.xls noch nicht enthalten
'Zeile mit nächst höherer Nummer suchen und Zeile einfügen
eingefuegt = False
For lngNr2 = 2 To ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
If ws1.Cells(lngNr1, 1) < ws2.Cells(lngNr2, 1) Then
ws2.Cells(lngNr2, 1).EntireRow.Insert
ws2.Cells(lngNr2, 1).Value = ws1.Cells(lngNr1, 1).Value
ws2.Cells(lngNr2, 2).Value = ws1.Cells(lngNr1, 2).Value
ws2.Cells(lngNr2, 3).Value = ws1.Cells(lngNr1, 3).Value
eingefuegt = True
Exit For
End If
Next
If eingefuegt = False Then
'Neuen Eintrag am Ende der Liste eintragen
lngNr2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row + 1
ws2.Cells(lngNr2, 1).Value = ws1.Cells(lngNr1, 1).Value
ws2.Cells(lngNr2, 2).Value = ws1.Cells(lngNr1, 2).Value
ws2.Cells(lngNr2, 3).Value = ws1.Cells(lngNr1, 3).Value
End If
End If
Next
wb2.Sheets("zeit").Cells(1, 1).Value = strS1
wb1.Close 'Datei Zentrale.xls schließen
MsgBox "Abgleich mit Datei Zentrale.xls ist abgeschlossen"
Set wb1 = Nothing
Set ws1 = Nothing
Set rnga = Nothing
Else
MsgBox "Datei Werk.xls ist aktuell. Kein Abgleich mit Zentrale.xls erforderlich."
End If
wb2.Activate
ws2.Activate
Set wb2 = Nothing
Set ws2 = Nothing
Exit Sub
errorhandler:
MsgBox "Fehler ist aufgetreten!"
'  Resume
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige