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

VBA-Code in verschied. Dateiversionen vergleichen

VBA-Code in verschied. Dateiversionen vergleichen
Jörg-HH
Hallo zusammen
über das Thema "irgendwas vergleichen" gibt's ja hunderte Archivtreffer. Leider betreffen die immer nur Excel. Ich habe folgendes Problem, dessen Ursache ich in VBA vermute:
Ein simples Gültigkeits-Dropdown funktioniert "plötzlich" nicht mehr. Vor einem halben Jahr ging's noch. Allerdings habe ich es wohl auch ein halbes Jahr nicht benutzt - hingegen jede Menge weiteren Code für alles Mögliche entwickelt.
Nun bewahre ich brav alle alten Versionen der Datei auf und konnte durch probieren zurückverfolgen, bei welcher Version es noch ging und ab wann nicht mehr (Okt. 08). Dann habe ich die Codes der Arbeitsblätter der beiden Versionen per Augenschein nebeneinander verglichen und konnte keinen Unterschied sehen. Auch sonst kann ich keine gravierenden Änderungen finden.
Gibt es einen Code oder was auch immer, der den gesamten Code einer Version mit einer anderen vergleicht und mir die Zeilen mit Änderungen (bzw. neu hinzugekommene) anzeigt? (Oder vielleicht auch sonstige Änderungen in Excel aufspürt...)
Danke für 'n Tip...
Jörg
AW: VBA-Code in verschied. Dateiversionen vergleic
17.07.2009 16:38:15
Klaus
Sind vielleicht Zeilen fixiert?
Beim Mac führt das auch unter Office 2003 zum Aussetzer …
Gruß
Klaus
an Fixierg kann's nicht liegen
17.07.2009 16:46:52
Jörg-HH
Hi Klaus, es ist in einem Blatt eine Fixierung - aber die gab's vorher auch schon...
AW: VBA-Code in verschied. Dateiversionen vergleichen
17.07.2009 18:12:07
ransi
HAllo
Hier mal was mit der ganz heißen Nadel zusammengestrickt.
(Fast ohne Fehlerbehandlung)
Es geht 2 x ein Datei öffnen Dialog auf.
Da wählst du die zu vergleichenden Dateien aus.
Achte drauf das sie nicht den gleichen Namen haben, das geht nicht gut.
Dann hast du schonmal was zum vergleichen.("von Hand")
Ich bastel noch etwas dranrum, dann gehts automatisch.
ransi
Anzeige
ooops...Code vergessen.
17.07.2009 18:13:06
ransi
Option Explicit


Private Sub CommandButton1_Click()
Dim newApp As Application
Dim strText As String
Dim dlg As FileDialog
Dim c As Object
Dim wb(1 To 2) As Workbook
Dim L As Long
Dim Z As Long
Dim I
Set newApp = CreateObject("Excel.Application")
With newApp
    .Visible = False
    .EnableEvents = False
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then
        Set wb(1) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then
        Set wb(2) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    For I = 1 To 2
        If wb(I).VBProject.Protection = False Then
            For Each c In wb(I).VBProject.VBComponents
                Z = 0
                With c.CodeModule
                    If .CountOfLines > 0 Then
                        For L = 1 To .CountOfLines
                            If Trim(Application.Clean(.Lines(L, 1))) <> "" Then
                                Z = Z + 1
                                Cells(Z, I) = Trim(Application.Clean(.Lines(L, 1)))
                            End If
                        Next
                    End If
                End With
            Next
            Else:
            MsgBox "Das VBA-Project ist geschützt." & vbCrLf & "Bitte den Schutz aufheben und nochmal starten."
        End If
    Next
End With
raus:
If Not wb(1) Is Nothing Then wb(1).Close False
If Not wb(2) Is Nothing Then wb(2).Close False
newApp.Quit
End Sub


Anzeige
wow...
17.07.2009 20:51:34
Jörg-HH
Hi Ransi
bin begeistert und zugleich völlig überfordert. Hab alle fraglichen Dateien geschlossen, den Code in eine neue Datei gefüllt, den Butten gebastelt, gedrückt - und wuschschsch.... hatte ich zwei Spalten zu ca. 1800 Codezeilen...
Die Frage ist nun: Was lese ich da? Den Code aus zwei Dateien, oder die Änderungen von einer zur anderen Datei?
Grüße -Jörg
AW: wow...
17.07.2009 21:05:01
ransi
HAllo Jörg
das ist der code von den 2 Dateien.
Ich bastel noch was das damit die Änderungen kenntlich gemacht gemacht werden.
ransi
Unterschiede von 2 Programmcodes listen
18.07.2009 11:50:19
2
HAllo Jörg
Das ist ein Interessantes Problem.
Teste mal diesen Code:
Option Explicit


Private Sub CommandButton1_Click()
Dim newApp As Application
Dim dlg As FileDialog
Dim c As Object 'As VBComponent
Dim wb(1 To 2) As Workbook
Dim L As Long 'Zähler
Dim Z As Long 'Zähler
Dim I As Integer 'Zähler
Dim str_Modul As String 'Code im CodeModul
Dim strLine As Variant 'Code gesplittet nch vbcrlf
Dim Dic1 As Object 'As Dictionary
Dim Dic2 As Object 'As Dictionary
Dim K 'As Dictionary.Key
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
Set newApp = CreateObject("Excel.Application")
With newApp
    .Visible = False
    .EnableEvents = False
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then
        Set wb(1) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then
        Set wb(2) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    For I = 1 To 2
        If wb(I).VBProject.Protection = False Then
            A = A + 1
            Z = 0
            For Each c In wb(I).VBProject.VBComponents
                With c.CodeModule
                    If .countoflines > 0 Then
                        str_Modul = .Lines(1, .countoflines)
                        str_Modul = Replace(str_Modul, "_" & vbCrLf, "")
                        arr = Split(str_Modul, vbCrLf)
                        For L = LBound(arr) To UBound(arr)
                            strLine = WorksheetFunction.Trim(arr(L))
                            If strLine <> "" Then
                                Select Case I
                                    Case 1
                                        Dic1(strLine) = c.Name
                                        Z = Z + 1
                                        Cells(Z, 1) = c.Name
                                        Cells(Z, 2) = strLine
                                    Case 2
                                        Dic2(strLine) = c.Name
                                        Z = Z + 1
                                        Cells(Z, 3) = c.Name
                                        Cells(Z, 4) = strLine
                                End Select
                            End If
                        Next
                    End If
                End With
            Next
            Else:
            MsgBox "Das VBA-Project ist geschützt." & vbCrLf & "Bitte den Schutz aufheben und nochmal starten."
        End If
    Next
End With
'Vergleichen
Z = 1
Cells(1, 5) = "in Datei 1 aber nicht in Datei 2"
Cells(1, 7) = "in Datei 2 aber nicht in Datei 1"
For Each K In Dic1.keys
    If Not Dic2.exists(K) Then
        Z = Z + 1
        Cells(Z, 5) = Dic1(K)
        Cells(Z, 6) = K
    End If
Next
Z = 1
For Each K In Dic2.keys
    If Not Dic1.exists(K) Then
        Z = Z + 1
        Cells(Z, 7) = Dic2(K)
        Cells(Z, 8) = K
    End If
Next
Do Until newApp.Workbooks.Count = 0
    DoEvents
    If Not wb(1) Is Nothing Then wb(1).Close False
    If Not wb(2) Is Nothing Then wb(2).Close False
Loop
newApp.Quit
Exit Sub
raus:
Do Until newApp.Workbooks.Count = 0
    DoEvents
    If Not wb(1) Is Nothing Then wb(1).Close False
    If Not wb(2) Is Nothing Then wb(2).Close False
Loop
newApp.Quit
End Sub


Die Unterschiede werden in F und H gelistet.
ransi
Anzeige
AW: Unterschiede von 2 Programmcodes listen
18.07.2009 12:07:01
2
HAllo
Irgendwie hab ich eben den verkehrten Code erwischt....
Der hier tuts:
Option Explicit


Private Sub CommandButton1_Click()
Dim newApp As Application
Dim dlg As FileDialog
Dim c As Object 'As VBComponent
Dim wb(1 To 2) As Workbook
Dim L As Long 'Zähler
Dim Z As Long 'Zähler
Dim I As Integer 'Zähler
Dim str_Modul As String 'Code im CodeModul
Dim Arr As Variant 'Code gesplittet nach vbcrlf
Dim strLine As String 'Line
Dim Dic1 As Object 'As Dictionary
Dim Dic2 As Object 'As Dictionary
Dim K 'As Dictionary.Key
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
Set newApp = CreateObject("Excel.Application")
With newApp
    .Visible = False
    .EnableEvents = False
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then
        Set wb(1) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then
        Set wb(2) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    For I = 1 To 2
        If wb(I).VBProject.Protection = False Then
            Z = 0
            For Each c In wb(I).VBProject.VBComponents
                With c.CodeModule
                    If .countoflines > 0 Then
                        str_Modul = .Lines(1, .countoflines)
                        str_Modul = Replace(str_Modul, "_" & vbCrLf, "")
                        Arr = Split(str_Modul, vbCrLf)
                        For L = LBound(Arr) To UBound(Arr)
                            strLine = WorksheetFunction.Trim(Arr(L))
                            If strLine <> "" Then
                                Select Case I
                                    Case 1
                                        Dic1(strLine) = c.Name
                                        Z = Z + 1
                                        Cells(Z, 1) = c.Name
                                        Cells(Z, 2) = strLine
                                    Case 2
                                        Dic2(strLine) = c.Name
                                        Z = Z + 1
                                        Cells(Z, 3) = c.Name
                                        Cells(Z, 4) = strLine
                                End Select
                            End If
                        Next
                    End If
                End With
            Next
            Else:
            MsgBox "Das VBA-Project ist geschützt." & vbCrLf & "Bitte den Schutz aufheben und nochmal starten."
        End If
    Next
End With
'Unterschiede rausarbeiten und listen
Z = 1
Cells(1, 5) = "in Datei 1 aber nicht in Datei 2"
Cells(1, 7) = "in Datei 2 aber nicht in Datei 1"
For Each K In Dic1.keys
    If Not Dic2.exists(K) Then
        Z = Z + 1
        Cells(Z, 5) = Dic1(K)
        Cells(Z, 6) = K
    End If
Next
Z = 1
For Each K In Dic2.keys
    If Not Dic1.exists(K) Then
        Z = Z + 1
        Cells(Z, 7) = Dic2(K)
        Cells(Z, 8) = K
    End If
Next
'Aufräumen
Do Until newApp.Workbooks.Count = 0
    DoEvents
    If Not wb(1) Is Nothing Then wb(1).Close False
    If Not wb(2) Is Nothing Then wb(2).Close False
Loop
newApp.Quit
Exit Sub
raus:
Do Until newApp.Workbooks.Count = 0
    DoEvents
    If Not wb(1) Is Nothing Then wb(1).Close False
    If Not wb(2) Is Nothing Then wb(2).Close False
Loop
newApp.Quit
End Sub




ransi
Anzeige
...das legt den Rechner lahm :-)
18.07.2009 14:05:36
Jörg-HH
Hi Ransi
ich hab den zweiten Code probiert (ist der so unterschiedlich zum ersten?) - da wird mir was in den Spalten A und B angezeigt, step by step zum zugucken, und irgendwie ist der Rechner dann mit 50% Leistung blockiert. Nach 5 Minuten hab ich Excel beendet.
Wie kommt das denn? Gestern die alte Version ging doch so rasant...?
Grüße - Jörg
AW: ...das legt den Rechner lahm :-)
18.07.2009 14:58:09
ransi
HAllo
Wieviel andere Mappen hast du noch offen ?
Wenn du die schließt, ist es dann besser ?
ransi
ja, is besser...
18.07.2009 18:48:52
Jörg-HH
...jetzt sind innerhalb von Sekundenbruchteilen nicht nur 1800 Codezeilen erschienen, sondern 6500. In Spalten E+F hat er mir 23 Ausdrücke ausgeworfen und in den Spalten G+H 145. Die muß ich jetzt mal durchstöbern nach komischen Inhalten... Dank dir für den Schubs...
Das ist ja alles sehr beeindruckend. Oft ist es so: Wenn einer von euch hier was bastelt, dann verstehe ich den Code wenigstens im Nachhinein in groben Zügen. Aber in diesem Fall ist dermaßen viel (für mich) Neues dabei, daß ich kaumn was kapier. Fällt mir da grad ins Auge: Was bedeutet denn die -1 im Ausdruck If dlg.Show = -1 Then...
Gib mir doch mal 'ne ungefähre Vorstellung: Wie lange sitzt man als Excelprofi an so einer Lösung, und wie viele Jahre Erfahrung gehen dem voraus?
Grüße - Jörg
Anzeige
Kommentare
19.07.2009 10:00:40
ransi
HAllo Jörg
Gib mir doch mal 'ne ungefähre Vorstellung: Wie lange sitzt man als Excelprofi an so einer Lösung...
Keine Ahnung wie lange ein Profi daransitzt, bin keiner, von daher kann ich da auch nur raten.
Ich hab ca 1 stunde gebraucht. Allerdings ohne vernünftige Fehlerroutinen.
Die dauern erfahrungsgemäß immer am längsten.
Wenn der "Fahrplan" feststeht, ist soein Code recht schnell geschrieben.
Defekte oder nicht vorhandene Verweise können auch schuld sein das dein Code nicht rund läuft.
Hab die Überprüfung mal mit reingehäkelt.
Ausserdem das Ganze noch ein wenig kommentiert.
Option Explicit


Private Sub CommandButton1_Click()
Dim newApp As Application
Dim dlg As FileDialog
Dim c As Object 'As VBComponent
Dim wb(1 To 2) As Workbook
Dim L As Long 'Zähler
Dim Z As Long 'Zähler
Dim I As Integer 'Zähler
Dim str_Modul As String 'Code im CodeModul
Dim Arr As Variant 'Code gesplittet nach vbcrlf
Dim strLine As String 'Line
Dim Verweis As Object 'As Reference
Dim Dic1 As Object 'As Dictionary
Dim Dic2 As Object 'As Dictionary
Dim K 'As Dictionary.Key
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
Set newApp = CreateObject("Excel.Application")
With newApp
    .Visible = False
    .EnableEvents = False
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then 'Kein Abbrechen oder Schließkreuz
        Set wb(1) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    Set dlg = Application.FileDialog(msoFileDialogOpen)
    If dlg.Show = -1 Then
        Set wb(2) = newApp.Workbooks.Open(dlg.SelectedItems(1))
        Else: GoTo raus
    End If
    For I = 1 To 2
        If wb(I).VBProject.Protection = False Then 'VBA_Projct ist ungeschützt
            Z = 0
            For Each Verweis In wb(I).VBProject.References 'vorhandene Verweise auslesen
                Z = Z + 1
                If I = 1 Then 'Für die erste Datei
                    Dic1(Verweis.Description) = Verweis.IsBroken 'Verweis ins Dictionary
                    Cells(Z, 1) = Verweis.Description 'Verweis ausgeben
                    Cells(Z, 2) = Verweis.IsBroken 'Schauen ob der Verweis ungültig ist
                    Else: 'Für die zweite Datei
                    Dic2(Verweis.Description) = Verweis.IsBroken
                    Cells(Z, 3) = Verweis.Description
                    Cells(Z, 4) = Verweis.IsBroken
                End If
            Next
            For Each c In wb(I).VBProject.VBComponents 'Schleife über jede VBComponent
                With c.CodeModule
                    If .countoflines > 0 Then 'Schauen ob da was drin steht
                        str_Modul = .Lines(1, .countoflines) 'der ganze Code im CodeModul
                        str_Modul = Replace(str_Modul, "_" & vbCrLf, "") 'Mit " _" getrennte Zeilen zusammnfügen
                        Arr = Split(str_Modul, vbCrLf) 'Den Code in Zeilen aufteilen
                        For L = LBound(Arr) To UBound(Arr) 'die einzelnen Zeilen abklappern
                            strLine = WorksheetFunction.Trim(Arr(L))
                            If strLine <> "" Then 'Schauen ob in der Zeile was drin steht
                                Select Case I 'Für die erste Datei
                                    Case 1
                                        Dic1(strLine) = c.Name 'Die Zeile in ein Dictionary aufnehmen
                                        Z = Z + 1
                                        Cells(Z, 1) = c.Name 'Das Modul in der die Zeile steht
                                        Cells(Z, 2) = strLine 'Die eigentliche Zeile
                                    Case 2 'Für die zweite Datei
                                        Dic2(strLine) = c.Name 'Die Zeile in ein Dictionary aufnehmen
                                        Z = Z + 1
                                        Cells(Z, 3) = c.Name
                                        Cells(Z, 4) = strLine
                                End Select
                            End If
                        Next
                    End If
                End With
            Next
            Else:
            MsgBox "Das VBA-Project ist geschützt." & vbCrLf & "Bitte den Schutz aufheben und nochmal starten."
            GoTo raus
        End If
    Next
End With
'Unterschiede rausarbeiten und listen
Z = 1
Cells(1, 5) = "in Datei 1 aber nicht in Datei 2"
Cells(1, 7) = "in Datei 2 aber nicht in Datei 1"
For Each K In Dic1.keys
    If Not Dic2.exists(K) Then
        Z = Z + 1
        Cells(Z, 5) = Dic1(K)
        Cells(Z, 6) = K
    End If
Next
Z = 1
For Each K In Dic2.keys
    If Not Dic1.exists(K) Then
        Z = Z + 1
        Cells(Z, 7) = Dic2(K)
        Cells(Z, 8) = K
    End If
Next
'Aufräumen
Do Until newApp.Workbooks.Count = 0
    DoEvents
    If Not wb(1) Is Nothing Then wb(1).Close False
    If Not wb(2) Is Nothing Then wb(2).Close False
Loop
newApp.Quit
Exit Sub
raus:
Do Until newApp.Workbooks.Count = 0
    DoEvents
    If Not wb(1) Is Nothing Then wb(1).Close False
    If Not wb(2) Is Nothing Then wb(2).Close False
Loop
newApp.Quit
End Sub


ransi
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige