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.

    Ja.
    Wenn's in einem Modul läuft, musst du den Pointer auf dein lokales Worksheet in einer Variablen abspeichern (s.o. ws1)
    Dann hast du ws1 für dein lokales Sheet und ws2 für dein neu geöffnetes Sheet.
    Bei den Operationen musst du halt immer angeben, auf welches Sheet sich die Objekte beziehen (wie in meinem obigen Beispiel).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Visual Basic-Quellcode

    1. For r = 1 to ws1.Cells(Rows.Count,1).End(xlUp).Row 'Schleife für alle belegten Zeilen in ws1
    2. Set CodeCell = ws1.Cells(r,1) 'Referenzzelle ist in der ersten Spalte
    3. Set LookupCell = ws2.Columns(1).Find(CodeCell.Value) 'Suche den Inhalt der Referenzzelle im zweiten Worksheet in der ersten Spalte
    4. If LookupCell is Nothing Then 'nicht gefunden
    5. CodeCell.Interior.Color=RGB(255,0,0) 'färbe Referenzzelle rot
    6. ElseIf LookupCell.Offset(0,1).Value <> CodeCell.Offset(0,1).Value Then 'vergleiche ob die Zellen rechts von Referenzzelle bzw. gefundener Zelle unterschiedlich sind
    7. CodeCell.Interior.Color=RGB(255,255,0) ' färbe gelb
    8. Else 'Zellen sind gleich
    9. CodeCell.Interior.Color=RGB(0,255,0) 'färbe grün
    10. Endif
    11. Next 'nächste Zeile
    Noch mehr vorkauen kann ich nicht.
    Jetzt wird's Zeit, dass du mit konkreten Fragen kommst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich wollte leicht anders suchen: Im zweiten Dokument soll die erste Spalte nach Nummern bzw Codes durchgesucht werden, welche im ersten Dokument vorhanden sind... ebenfalls Spalte 1...

    D.H. ich gehe Spalte 1 im zweiten Dokument durch und suche diese Nummern (eine nach der anderen) in Spalte 1 im ersten Dokument. Stimmt eine Nummer überein, dann gehe ich die Zeile durch... und schaue was dort übereinstimmt. Bei Abweichungen färbe ich im Dokument 2 die Felder rot ein. Dabei ist das Problem, dass die Spalten in Dokument 1 und 2 nicht gleich angeordnet sind... weshalb Zeile 1 in beiden Dokumenten verglichen werden muss, da dort die Erklärungen für die Spalten stehen.

    Logisch ???
    Ich habe jetzt vor erst einmal folgenden Code einzubauen:

    Visual Basic-Quellcode

    1. for col = 1 to worksheetxyz.rows(2).specialcels(last col)
    2. if (worksheetxyz.cells(Zeile2!,col).value = "Name")then
    3. variable colName = col
    4. Endif
    5. next col


    Was haltet ihr davon? Zum Spaltenvergleichen (wegen Reihenfolge).

    :thumbup:

    CIA_MAN schrieb:

    dass die Spalten in Dokument 1 und 2 nicht gleich angeordnet sind
    Ist die Spaltenaufteilung wenigsten konstant in jedem Dokument, dann kannst du ja die Offsets auch konstant eintragen?

    Wenn nicht, baust du dir halt eine Property ein, die du alternativ numerisch oder mit den Headernamen (in Zeile und/oder Spalte) abfragen kannst

    Visual Basic-Quellcode

    1. Public Property Get CellValue(ByVal Row as Variant, ByVal Col as Variant) As Variant
    2. On Error Goto Done 'return Nothing on error
    3. If Not IsNumeric(Col) Then Col = Rows(1).Find(Col).Column
    4. If Not IsNumeric(Row) Then Row = Columns(1).Find(Row).Row
    5. CellValue = Cells(Row, Col).Value
    6. Done:
    7. End Property

    Aufrufmethoden:

    Visual Basic-Quellcode

    1. Debug.Print CellValue(2,2) ' Range("B2")
    2. Debug.Print CellValue("Test",5) 'sucht nach "Test" in erster Spalte und gibt den Wert der 5.Spalte
    3. Debug.Print CellValue(3,"Name") 'sucht nach "Name" in erster Zeile und gibt den Wert der 3. Zeile
    4. Debug.Print CellValue("Test","Name") 'sucht nach "Test" in erster Spalte und "Name" in der 1.Zeile und gibt den entsprechenden Wert zurück
    5. If CellValue("nonexist","nonexist") Is Nothing Then Debug.Print "Header nicht gefunden"
    Die Headerzeilen und -spalten sollten bei der Methode allerdings eindeutig sein, da immer nur der erste Wert gefunden wird.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    De facto ist es ein Dreizeiler. Mit Prozedur-Rahmen und Error-Handler sind es sieben Zeilen.
    Und dafür 5 verschiedene Aufrufbeispiele mit Beschreibung.
    Was daran hast du denn noch nicht verstanden?

    Die Grundidee ist, ein Arbeitsblatt mit einer weiteren Property zu versehen.
    So wie es in bereits vordefinierte Properties gibt (z.B. Name, Range, Cells, QueryTables), kannst du dir selber noch welche definieren. In diesem Fall CellValue.

    Dazu muss der Code der Property im Codebereich des Arbeitsblatt selbst stehen.

    Wenn du die Property von aussen adressieren willst, kannst du sie wie jedes andere Objekt des Arbeitsblatts ansprechen.

    Visual Basic-Quellcode

    1. InhaltVonB2 = Thisworkbook.Sheets("Tabelle1").CellValue(2,2)
    Oder eben mit jeder anderen beschriebenen Variante von Parametern.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Dann solltest du dir ganz dringend ein paar Grundlagen reinziehen.
    Du kannst nicht Auto fahren, ohne die grundlegende Funktionsweise zu verstehen.
    Du musst nicht genau wissen, wie die Einspritzpumpensteuerung funktioniert, aber die Bedienerschnittstellen wie Gaspedal, Bremse, Geschwindigkeitsanzeige und Öldruckwarnung sollten dir geläufig sein.

    Gas und Bremse sind "Methoden", um das Objekt Auto zu einer Aktion zu bewegen.

    Die Geschwindigkeit ist eine Eigenschaft (Property), die du am Objekt Tacho ablesen kannst.
    Dieser bekommt die anzuzeigende Information vom Objekt Getriebe, was dich aber schon nicht mehr zu interessieren braucht, weil das keine öffentliche (Public) Funktion ist.
    Und wenn beim nächsten Modell der Geschwindigkeitssensor an der Antriebswelle sitzt, wird das für dich nicht wichtig sein.
    Die einzige Schnittstelle des Getriebes nach aussen ist der Schalthebel. Dessen Funktion musst du wiederum verstehen.

    Und wenn unerwartet die Öldruckanzeige leuchtet, ist das ein Ereignis (Event), das dich zur Ausführung geeigneter Maßnahmen zwingen sollte.

    Du kannst natürlich in der Werkstatt anrufen, wenn du etwas nicht weißt.
    Wenn du eine spezielle Frage zu den Knöfen des Multifunktionslenkrads hast, wird dir der Mechaniker das gerne erklären.
    Aber wenn öfters Fragen nach grundlegenden Selbstverständlichkeiten auftauchen, wird er dich bitten, die Bedienungsanleitung zu lesen.
    Dort steht drin, wie man den Motor startet und wie man mit Gaspedal, Bremse und Schalthebel umgeht.
    Und das, was dort schon vorausgesetzt wird, bringt einem (kostenpflichtig) der Fahrlehrer bei.

    Tu dir den Gefallen und google nach den Grundlagen, wenn du sie nicht verstehst.
    In diesem spezifischen Fall hilft vielleicht msdn.microsoft.com/en-us/library/ms172576(v=vs.80).aspx
    Wenn dich das überlastet, findest du ja vielleicht einen "Fahrlehrer", der dir die Grundlagen etwas nahe bringt.
    Für den absoluten Anfang ist das eine durchaus bewährte Methode.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok danke... das hat mir jetzt echt bildlich das Ganze näher gebracht... Ich weiß es ist blöde ohne Grundwissen hier heran zu gehen... doch manche Leute meinen man lernt das Programmieren wie die Vögel das fliegen lernen -> schmeiß den Frischling einfach aus dem Nest... :)

    Ich finde das so auch nicht gut :( Aber so ist es halt...