Master-Datei mit neuer Datei vergleichen und Unterschiede in neuer Datei einfärben

  • Excel

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von CIA_MAN.

    Master-Datei mit neuer Datei vergleichen und Unterschiede in neuer Datei einfärben

    Hallo zusammen,

    ich wäre euch dankbar, wenn ihr mir als Anfänger wieder etwas unter die Arme greifen könntet.

    Meine Aufgabe ist wie folgt: Ich will ein VBA-Skript schreiben, welches ein bestehendes Master-Dokument (über einen Button in diesem) mit einem neuen Dokument vergleicht. Dabei sollen die in der ersten Spalte eindeutigen Codes (Bsp BZ-56) zwischen den Dokumenten verglichen werden und dadurch im neuen Dokument die Zeile gefunden werden, die mit dem alten Dokument (Master) eigentlich identisch sein soll. Ist in dieser Zeile ein Spaltenelement nicht identisch, so soll dies durch Markierung der Zelle im neuen Dokument hervorgehoben werden. Jede Spalte hat dabei in beiden Dokumenten eine eindeutige Bedeutung, welche in der 2. Zeile jeweils zu finden ist. Jedoch kann es sein, dass die Reihenfolge der Spalten in den beiden Dateien unterschiedlich ist. Und zudem kann es sein, dass Spalten in der einen Datei vorkommen und in der anderen nicht...

    Ich möchte nun wie folgt vorgehen:

    Im neuen File möchte ich Spalte 1 (ab Zeile 3) durchgehen und die Codes mit dem Master-File vergleichen.

    Bei gleichem Code (Master <-> Neu):

    Zeile durchgehen (Vergleich) und Unstimmigkeiten in Neu markieren

    Am Ende Status über Fenster ausgeben (wie viele Zellen sind anders)


    Vielleicht könnt ihr mir wie gesagt etwas helfen.... das ist nämlich mein 2. VBA-Skript.... -> blutiger Anfänger ;) :S


    Edit:

    Sub FarbeAktiveZelle ()

    MsgBox "Die aktive Zelle " & ActiveCell.Adress & _
    " hat den Farbindex: " & ActiveCell.Interior.ColorIndex

    End Sub

    Hab hier was gefunden, mit dem man den Zellfarbenindex bestimmen kann. :|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „CIA_MAN“ ()

    Neuen interessanten Code-Schnipsel gefunden:

    Sub TextInArbeitsmappeSuchenUndKennzeichnen()
    Dim s As String
    Dim i As Integer
    Dim Erg1 As Variant
    Dim Erg2 As Variant

    s = InputBox _
    ("Geben Sie den Suchbegriff ein!". "Textsuche")
    If s= " " Then Exit Sub

    For i 0 1 To ActiveWorkbook.WorkSheets.Count
    Sheets(i).Activate
    Set Erg1 = Sheets(i).Cells.Find(s)
    If Not Erg1 Is Nothing Then
    Erg2 = Erg1.Adress
    Do
    With Erg1
    .Activate
    .Interior.ColorIndex = 4
    End With
    Set Erg1 = Cells.FindNext(After:=ActiveCell)
    On Error Resume Next
    If Erg1.Address = Erg2 Then Exit Do
    Erg1.Interior.ColorIndex = 4
    Loop
    End If
    Next i
    End Sub

    Langsam füllen sich die Lücken :rolleyes:
    In VBA ist es relativ trivial.
    Der letzte Code-Schnipsel zeigt in die richtige Richtung, wobei er noch etwas Dirty ist.
    Falls der Code im Master-Worksheet steht:

    Visual Basic-Quellcode

    1. Set ws2=Workbooks.Open("C:\blabla\xxx.xlsx").Sheets(1)
    2. For r = 1 to Cells(Rows.Count,1).End(xlUp).Row
    3. Set CodeCell = Cells(r,1)
    4. Set LookupCell = ws2.Columns(1).Find(CodeCell.Value)
    5. If LookupCell is Nothing Then
    6. CodeCell.Interior.Color=xlRed
    7. ElseIf LookupCell.Offset(0,1).Value <> CodeCell.Offset(0,1).Value Then
    8. CodeCell.Interior.Color=xlYellow
    9. Else
    10. CodeCell.Interior.Color=xlGreen
    11. Endif
    12. Next
    So in etwa.
    Musst du halt auf deine Umgebung anpassen.

    Das ganze geht aber auch ohne VBA, mit "Conditional Formatting".
    Das ist allerdings etwas tricky, hat aber gegenüber dem VBA-Ansatz einige Vorteile:
    - volldynamisch
    - funktioniert auch mit XLSX
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    CIA_MAN schrieb:

    Kannst du bitte den Code noch etwas genauer erklären
    Könnte ich.
    Aber ich fände es besser, wenn du ihn selbst verstehen lernst.
    Geh die Zeilen schrittweise im Debugger durch und schau dir die Variablen und den Programmablauf an.
    Wenn du zu einzelnen Statements Fragen hast, kann ich sie gerne beantworten.

    CIA_MAN schrieb:

    was ist bitte Conditional Formatting?
    Eine Excel-interne Funktion, die Zellen abhängig von allem möglichen anderen formatiert. Zum Beispiel vom Ergebnis von Excel-Formeln.
    Hier ist eine kleine Anleitung: wikihow.com/Apply-Conditional-Formatting-in-Excel
    Aber wie gesagt, ist in deinem Fall etwas tricky und du wirst eine Weile testen müssen, bis du zum gewünschten Ergebnis kommst.

    CIA_MAN schrieb:

    ich habe xlsx... geht da kein VBA?
    Nein.
    Du musst die Datei als XLSM oder XLSB abspeichern, sonst wird kein VBA-Code gespeichert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Okay! Dann erstmal danke!

    Dann versuche ich mit dem Code erst einmal mein Glück. Aber bleib bitte mal in der "Gegend", für weitere Fragen.
    ;)

    Ich bräuchte noch die Dimensions für CodeCell & LookupCell. Bitte ;(

    Und wie debugge ich schrittweise?

    auch x1Red und x1Yellow macht Probleme :(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „CIA_MAN“ () aus folgendem Grund: Ergänzung

    CIA_MAN schrieb:

    Dimensions für CodeCell & LookupCell
    Range

    CIA_MAN schrieb:

    wie debugge ich schrittweise?
    Mausklick in die Prozedur, dann kannst du mit F8 Einzelschritte machen.
    In der Ansicht das Überwachungsfenster aktivieren.
    Dort kannst du die Variablen und Objekte reinziehen und anschauen.

    CIA_MAN schrieb:

    x1Red und x1Yellow
    Das Ganze war aus dem Kopf geschrieben.
    Ich dachte, die Werte seien definiert.
    Ansonsten kannst du auch die RGB-Werte oder den ColorIndex verwenden.
    siehe dmcritchie.mvps.org/excel/colors.htm

    Visual Basic-Quellcode

    1. CodeCell.Interior.Color=RGB(255,0,0) 'rot
    2. CodeCell.Interior.ColorIndex=3 'rot
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Habe es jetzt in

    CodeCell.Interior.Color = RGB(255, 0, 0) 'rot

    abgeändert ;) Danke!

    Aber nochmal zur oberen Frage! Kann mir die jemand beantworten? -_-


    Habe nun herausgefunden, dass mit "Set ws2 = Workbooks.Open("C:\blabla\xxx.xlsx").Sheets(1)" die 2. Datei gemeint war...

    Doch nun nimmt er in der 2. Datei einfach die erste Mappe... ich möchte aber, dass er die 2. nimmt :wacko:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „CIA_MAN“ () aus folgendem Grund: Ergänzung / Lösung + neues Problem

    Habe nun mein Programm folgendermaßen abgeändert, damit er mir einen Auswahldialog bringen soll:

    Visual Basic-Quellcode

    1. DatOP = Application.GetOpenFilename(" Excel-Dateien(*.xl*),*.xl*")
    2. If DatOP = False Then Exit Sub
    3. Set ws2 = Workbooks.Open Filename:=DatOP


    Jedoch kommt Syntaxfehler als Fehlermeldung bei der letzten Zeile... warum... ?? In meinem Buch ist es so beschrieben.... ?(

    CIA_MAN schrieb:

    Habe nun herausgefunden, dass mit "Set ws2 = Workbooks.Open("C:\blabla\xxx.xlsx").Sheets(1)" die 2. Datei gemeint war...
    Doch nun nimmt er in der 2. Datei einfach die erste Mappe... ich möchte aber, dass er die 2. nimmt

    Meinst Du mit Mappe die Tabelle?
    Die Tabelle kannst Du mit dem Sheet-Index ansprechen.
    .Sheets(1) = erste Tabelle
    .Sheets(2) = zweite Tabelle
    etc.

    CIA_MAN schrieb:

    Set ws2 = Workbooks.Open Filename:=DatOP
    Die Aufrufvarianten sind in VBA icht ganz konsistent.
    Der Aufruf von Subs (oder Funktionen, die als Sub aufgerufen werden) erfolgt ohne Klammer, während eine Funktion, die einen Wert zurückgibt, mit Klammern versorgt werden muss.

    Visual Basic-Quellcode

    1. Set wb2 = Workbooks.Open(Filename:=DatOP) 'open gibt ein Workbook zurück
    2. Set ws2 = wb2.Sheets(1) 'du benötigst ein Worksheet
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Okay! Danke! Doofer Fehler.... :huh: Dann war mein Buch falsch.... ;(
    Das mit dem Zugriff auf das Sheet habe ich vorher schon gecheckt ;)

    Nur irgendwie will er nicht auf das 2. Sheet zugreifen?!


    Hier der Code:

    Visual Basic-Quellcode

    1. DatOP = Application.GetOpenFilename("Excel-Dateien(*.xl*),*.xl*")
    2. If DatOP = False Then Exit Sub
    3. Set wb2 = Workbooks.Open(Filename:=DatOP)
    4. Set ws2 = wb2.Sheets(2)


    Weiß hierzu jemand ne Lösung?
    In welchem Modul steht der Code drin?
    Im Context eines Worksheets oder im Context eines Moduls?

    Im zweiten Fall:

    Visual Basic-Quellcode

    1. Set ws1=ThisWorkbook.Sheets("Tabelle1")
    Dann ist ws1 dein lokales Sheet und ws2 ist dein frisch geöffnetes Sheet und du kannst mit den beiden arbeiten.

    Beispiel:

    Visual Basic-Quellcode

    1. ws1.Range("A1").Formula = ws2.Range("A1").Value
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Im VBA-Editor hast du links (innerhalb VBAProject) eine Gruppe "Microsoft Excel Objekte".
    Da sind die Arbeitsbereiche für das Workbook und die einzelnen Worksheets drin.
    Darunter hast du Module und Klassenmodule (falls welche existieren).

    In welchem dieser Bereiche steht dein Code?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --