Clever-Excel-Forum

Normale Version: Zeilen von div. Arbeitsmappen übertragen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo
ich habe keine grosse Ahnung von vba und hoffe somit auf Hilfe von einem Profi.
Wir haben ein Excel Arbeitsmappe, welches von mehreren Personen jeweils als als copy benutzt wird. Innerhalb der Arbeitsmappe wird in es ein Tabellenblatt eine Zeile mit ca. 30 Spalten generiert. Nun möchten wir diese Zeile von der jeweiligen Arbeitsmappe in eine zentrale Arbeitsmappe übertragen und bei Änderungen bei der Source, diese auch wiederum in der zentralen Arbeitsmappe nachführen. 

Ich habe etwas "gebastelt" und wenigstens wird ein Eintrag schon Mal übertragen, aber der Update funktioniert in dem Sinne nicht, weil jeweils eine neue Zeile erstellt wird.

Option Explicit

Sub Service_Offering_Update()
    Application.ScreenUpdating = False
    Dim LastRow As Long
    Workbooks.Open "https://company365.sharepoint.com/sites/ServiceManagement/Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix.xlsx?web=1"
    Workbooks("Estimator 2.5.xlsm").Worksheets("Offering").Activate
    LastRow = Range("Offering").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Dim rng As Range
    Dim foundVal As Range
    For Each rng In Sheets("Offering").Range("A5:A" & LastRow)
        Set foundVal = Workbooks("Servicematrix.xlsx").Sheets("Servicematrix").Range("A:A").Find(rng, LookIn:=xlValues, lookat:=xlWhole)
            If foundVal Is Nothing Then
                rng.EntireRow.Copy
                Workbooks("Servicematrix.xlsx").Sheets("Servicematrix").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
            Else
                rng.EntireRow.Copy
                Workbooks("Servicematrix.xlsx").Sheets("Servicematrix").Cells(Rows.Count, "A").End(xlUp).Offset(0, 0).PasteSpecial xlPasteValues
            End If
    Next rng
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub
Hallöchen,

Zitat:aber der Update funktioniert in dem Sinne nicht, weil jeweils eine neue Zeile erstellt wird.

prüfe mal, ob was gefunden wird und wenn nicht, warum. Eine neue Zeile wird ja nur erstellt, wenn es keine Treffer gibt. Nimm dazu z.B. mal rng.Value in die Überprüfung und schaue selbst nach, ob der Inhalt vorhanden ist. Prüfe auch, ob eventuelle Leerzeichen das Ergebnis verfälschen.
Hallo Schauan Danke für die schnelle Hilfe
Wie gesagt ich bin kein Hero in vba, ist schon ein Wunder dass wenigstens ein Teil vom Script funktioniert. Ein Auszug der Quelldatei hat im Bsp. zwei Zeilen.
Änderungen an der Zeile mit Kunde B, werden in der Zieldatei sauber nachgeführt. Im Prinzip wird eine Änderung auch bei Kunde A übertragen, nur wird leider jedesmal wenn das Script ausgeführt wird eine Copy vom Kunden A erstellt (siehe Zieldatei 3x Ausführung)

[
Bild bitte so als Datei hochladen: Klick mich!
]

[
Bild bitte so als Datei hochladen: Klick mich!
]
Füge ich in der Quelldatei einen dritten Kunden ein, dann wird der vorerst mal richtig übertragen, dann wird aber jeweils der Kunde B dupliziert und Änderungen bei Kunden A werden nicht mehr erkannt. 
[
Bild bitte so als Datei hochladen: Klick mich!
]
Die Zieldatei sieht die Zieldatei immer schlimmer aus  Huh 
[
Bild bitte so als Datei hochladen: Klick mich!
]

Zu erwähnen ist vielleicht noch, dass eigentlich pro Quelldatei immer nur eine Zeile mit einem Kundeneintrag bestehen wird.
Ich trage nur mehrere Kunden ein, um den Use Case zu simulieren. 

Zu Deinem Hinweis bzw Tipp, wie kann ich den rng.Value prüfen? (sorry, bin eben kein Hirsch)
Hallöchen,

die Bilder sieht man nicht, die müsstest Du hier hochladen.
Zitat:Zu Deinem Hinweis bzw Tipp, wie kann ich den rng.Value prüfen?
Gehe unten in den Überwachungsbereich - falls der nicht da ist, über Ansicht ... einschalten - klicke mit der rechten Maustaste, nimm "Überwachung hinzufügen" und gib dort rng.value ein.

Klicke vor Start des Makros in die Zeile mit For Each rng.. und drücke F9, dann hast Du dort einen Haltepunkt. Dann kannst Du das Makro starten. Wenn es den Haltepunkt erreicht, hält es Smile und Du kannst unten nachschauen, was in rng.Value steht. Mit F8 kannst Du das makro dann zeilenweise ausführen, mit F5 bis zum nächsten Halt oder Ende.
wieder etwas gelernt  Blush

Habe den Haltepunkt gesetzt und beim Ausführen steht dort "nothing".
Wenn ich im Einzelschritt durchgehe, dann steht jeweils auf der nächsten Zeile (gelb) der erste Wert aus der Quelldatei, also "A".
Beim zweiten Durchlauf entsprechend "B" und danach "C"

habe 3 Bildeli dazu hochgeladen, hoffe das hilft

Bei der Arbeitsmappe mit der Quelle, liegen die Daten im Tabellen Offering und sind dort als Tabelle formatiert
Bei der Zieldatei hätte ich eigentlich auch gerne eine Tabelle gehabt, aber damit funktioniert mein Script noch weniger, d.h die kopierten Einträge werden dann jeweils unter die Tabelle geschrieben. Das ist aber vorerst wohl das kleinere Problem  Huh
Hallöchen,

das Nothing zeigt Dir, dass da was nicht korrekt läuft. Dann könnte man etwas eher ansetzen und z.B. LastRow prüfen.
Nur mal als Hinweis:
LastRow = Range("Offering").... funktioniert nur, wenn Du auf dem Blatt Offering auch einen benannten Bereich Offering hast. Hast Du doch, oder nicht?
Hallo

sorry für die verspätete Antwort, ich war kurz offline
In der Zwischenzeit konnte das Problem dank externer Unterstützung, unter Verwendung der von Dir vorgeschlagenen LastRow innerhalb eines Namensbereichs gelöst werden.

Danke nochmals für Deine Hilfe