Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1768to1772
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

Kopieren und aktualisieren von Zeilen

Kopieren und aktualisieren von Zeilen
15.07.2020 10:45:50
Zeilen
In einer mehrfach benutzten (kopierten) Arbeitsmappe wird innerhalb einer Tabelle ein Kunden Angebot, mit Selektion von enthaltenen Services erfasst. In der Spalte A steht der Kundenname, gefolgt von ca. 40 Spalten. In den Spalten stehen Services und je nach dem, ob ein Service bei Angebot für den Kunden enthalten ist oder nicht, werden entsprechende Werte erfasst. Die Angaben mit den verteilt erfassten Kunden und den entsprechenden Spaltenwerten, werden für nachfolgende Prozesse benötigt und sollen zu diesem Zweck zentral gesammelt werden. Dazu wird eine auf Office365 gespeicherte Arbeitsmappe mit einer Tabelle benutzt. Der Prozess sieht vor, dass das Angebot angepasst werden kann. D.h die Zeilenwerte können sich ändern und müssen somit in der zentralen Tabelle aktualisiert werden können.
Es ist logisch, dass bei diesem Modell die Gefahr besteht, dass in unterschiedlichen Quell Tabellen ein gleichnamiger Kunde " Meier AG" erfasst werden könnte. Dies würde natürlich dazu führen, dass die entsprechende Zeile in der zentralen Ziel Datei mit der jeweils letzten Aktualisierung einer Quelle überschrieben würde. Da nur wenige Personen Angebote erstellen und Wahrscheinlichkeit mit identischen Kundennamen sehr klein ist, würde ich dieses Risiko vorerst in Kauf nehmen.
Ich habe ein VBA Script gebastelt, aber dieses funktioniert nur teilweise. D.h. die Kunden werden zwar erweiternd kopiert, aber mit dem Update klappt es dann nicht mehr, sodass ich mit jedem Durchlauf mehrfache Kunden Einträge erhalte :(
Eine Lösung mittels Excel Power Query ist nicht möglich, da Quellen nicht definiert werden können.
Wäre genial wenn mir jemand helfen könnte

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
und was soll...
15.07.2020 11:28:16
Werner
Hallo,
...hier jemand mit der Beschreibung anfangen?
Wenn dein Auto kaputt ist, rufst du dann bei der Werkstatt deines Vertrauens an und fragst: Mein Auto ist kaputt, warum? Oder bringst du dein Auto dort hin?
Also bitte zumindest mal den Code posten. Wobei das auch nicht wirklich weiterhilft. Am besten mal den Code mit einer Beispielmappe hier hochladen.
In der Beispielmappe ein Blatt mit den Quelldaten die kopiert werden müssen und ein zweites Blatt, das den Aufbau der Zieldatei zeigt.
Gruß Werner
AW: und was soll...
15.07.2020 12:52:09
Herby
Hallo Werner
Sorry, ist mein erster Beitrag hier und wusste, wie ich hier starten sollte.
Habe eine reduzierte Quell Datei (Estimator) und eine Zieldatei (Servicematrix) hochgeladen.
Die Files haben den Status, nachdem das Script einmal durchgelaufen ist. Dann sieht ja alles noch gut aus.Auch wenn eine (leere) Kopie der Quelldatei mit den Angaben eines anderen Kunden auf der entsprechenden Zeile erstellt wird, funktioniert alles noch wie erwartet. Dann gibt es in der Zieldatei zwei Zeilen, mit den bis dato erstellen Kunden(Dateien).
Wenn nun aber eine der beiden Quelldateien verändert wird und das Script wieder durchläuft, dann stimmen zwar die Werte ab Spalte B, aber der Kundenname in Spalte A, wird falsch überschrieben. Dann steht dort anstatt 1x Meier AG und 1x Huber AG, zweimal der gleiche Name drin
https://www.herber.de/bbs/user/139063.xlsm
https://www.herber.de/bbs/user/139064.xlsx
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.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

Anzeige
AW: und was soll...
16.07.2020 11:49:42
Werner
Hallo,
teste mal.
https://www.herber.de/bbs/user/139099.xlsm
Ich habe eine Userform eingebaut. Die gibt eine Meldung aus, wenn ein Kunde bereits in der "Zieldatei" vorhanden ist. Dort hast du die Möglichkeit auszuwählen, ob die Daten in der "Zieldatei" aktualisiert (überschrieben) werden sollen, oder ob ein Neuer Kunde mit diesem Namen angelegt werden soll.
Du solltest du aber darüber im Klaren sein, dass du ein Problem hast, wenn du zwei Kunden mit dem gleichen Namen hast. Wie willst du bei späterer Aktualisierung der "Zieldatei" dann unterscheiden, welchen der zwei Kunden du ansprechen willst?
Gruß Werner
Anzeige
AW: und was soll...
17.07.2020 16:54:15
Herby
Hallo Werner
Zuerst einmal herzlichen Dank dafür, dass Du Dir die Zeit genommen hast um mir eine Lösung zu bieten. Ich habe den Code in meine originale Arbeitsmappe überführt und die die nötigen Anpassungen vorgenommen, damit die auf das Script auf das zentrale Excelsheet zugreifen kann, welches in der Cloud bei Microsoft 365 liegt. Das hat soweit alles geklappt, aber der Code hat einen Laufzeitfehler reklamiert welchen ich lange nicht beheben konnte. Kurz bevor ich aufgeben und Dich wieder belästigen wollte, konnte ich den Fehler beseitigen. Ich vermute es liegt an der Zeile With ThisWorkbook. Ich habe die im Screenshot ersichtliche Zeile eingefügt und dann hat alles sofort funktioniert.
Userbild
Ein Problem gab es noch mit der Zeile Set wbZiel, welche Du mit einem Zeilenumbruch versehen hattest. Das hat erst dann funktioniert, als ich den entfernt habe, aber ich denke das liegt eher an den Auflagen von Microsoft, wenn eine Datei von MS Online angezapft werden soll.
Ursprünglich war auf dem Ziel Tabellenblatt eine Tabelle, da man für PowerAutomate nur mit solchen Tabellen arbeiten kann. Ich habe es aber nicht fertiggebracht, in den Bereich der Tabelle zu schreiben. Das Script hat immer auf die Zeile darunter geschrieben :(
Geht so etwas gar nicht, oder ist das zu kompliziert?
Mit dem von Dir angesprochene Problem mit dem überschreiben eines Kunden, wenn ein gleichnamiger schon vorhanden ist, können wir gut umgehen.
In jedem Fall kann ich gar nicht genug betonen, wie dankbar ich Dir bin und wünsche Dir ein schönes WE
Liebe Grüsse
Herby
Nachfolgend der aktuelle Code

Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix.xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
Workbooks("Estimator 2.5.xlsm").Worksheets("Offering").Activate
With ThisWorkbook.Worksheets("Offering")
LastRow = .Columns("A").Find(what:="*", LookIn:=xlValues, searchdirection:=xlPrevious).Row
For Each rng In Sheets("Offering").Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
.Cells(foundVal.Row, "A").PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End With
Else
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:= _
xlPasteValues
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Save
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing
End Sub

Anzeige
Anmerkung
17.07.2020 17:53:48
Werner
Hallo,
dass der Zeilenumbruch im Pfad nicht korrekt war, kann ich mir zwar nicht vorstellen, aber seis drum.
Zu deinem Fehler:
mit ThisWorkbook wird das Workbook angesprochen, in dem sich das ausgeführte Makro befindet. Und in deinem Fall bin ich davon ausgegangen, dass es sich dabei um das Workbook "Estimator 2.5.xlsm" handelt, was aber offensichtlich nicht der Fall zu sein scheint.
Augenscheinlich ist das Makro in einer anderen Datei und der Code versucht in dieser Datei das Worksheet "Offering" anzusprechen. Das gibt es in der Makrodatei aber nicht, weshalb der Code auf einen Index 9 Fehler läuft.
Ändere einfach die Codezeile mit
 With ThisWorkbook.Worksheets("Offering")

um in
With Workbooks("Estimator 2.5.xlsm").Worksheets("Offering")

deine Codezeile in der du dieses Workbook und Blatt aktivierst bitte löschen.
Was du bezüglich der Tabelle meinst? Meinst du damit eine intelligente Tabelle? Wenn ja, dann erzähl mal wo die beginnt. Da muss die letzte belegte Zelle/Zeile anders ermittelt werden.
Gruß Werner
Anzeige
AW: Anmerkung
19.07.2020 13:41:59
Herby
Hallo Werner
Danke, ich habe die von Dir vorgeschlagenen Änderungen durchgeführt, aber leider funktioniert der Code damit nicht mehr.

Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix.xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
'Workbooks("Estimator 2.5.xlsm").Worksheets("Offering").Activate
'With ThisWorkbook.Worksheets("Offering"
With Workbooks("Estimator 2.5.xlsm").Worksheets("Offering")
LastRow = .Columns("A").Find(what:="*", LookIn:=xlValues, searchdirection:=xlPrevious).Row
For Each rng In Sheets("Offering").Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
.Cells(foundVal.Row, "A").PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End With
Else
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:= _
xlPasteValues
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Save
wbZiel.Close
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing
End Sub

Bei der Zeile "For each rng.." bleit es mit einem Laufzeitfehler 9 stehen.
Mit dem Probleme kämpfte ich eben stundenlang, bis ich auf meine Lösung mit dem Acitvate gekommen bin. Der Code ist und war nie in einer anderen Arbeitsmappe als (Estimator 2.5.xlsm) im Einsatz. Bei ersten Mal als ich den Code in's Formum kopiert hatte die Namen angepasst und alle anderen Tabellenblätter aus der Arbeitsmappe entfernt, da ich meinte damit etwas vereinfachen zu können.
Beide Arbeitsmappen liegen auf dem SharePoint Online von Microsoft und ich habe den Verdacht, dass es daran liegt. Irgendwo habe ich gelesen, dass man die Online Pfade immer vollständig angeben muss. Ich habe den Verdacht, dass VBA deshalb auch ein Problem mit dem Zeilenumbruch hat. Ich habe wirklich lange damit rum geübt und es hat sofort funktioniert, als ich diesen raus genommen habe.
Userbild
Userbild
Zu Deiner Frage, ja mit Tabelle meine ich eine Intelligente Tabelle oder aoto table, wie die Amis sagen.
Diese würde den exakt gleichen Aufbau haben, wie das aktuelle Tabellenblatt Servicematrix. Die Titel sowie die ersten 3 Zeilen dürfen nicht überschrieben werden. Da ich zu einem späteren Zeitpunkt mit Wverweisen darauf zugreifen muss, Das heisst die erste Zeile mit Kunden Daten steht ab A5. Ich habe Dir dazu einen Sreenshot von einer Quell Datei und der Zieldatei erstellt.
Userbild
Vielleicht noch als Hinweis, ich bezeichne jede Auto Table (intelligente Tabelle) mit AT_Tabellenname
Anzeige
AW: Anmerkung
19.07.2020 14:13:14
Werner
Hallo,
versuch mal hier
For Each rng In Sheets("Offering").Range("A5:A" & LastRow)

das Sheet wegzulassen, also so
For Each rng In .Range("A5:A" & LastRow)

Und hier
wbZiel.Save
wbZiel.Close

reicht
wbZiel.Close True
Gruß Werner
AW: Anmerkung
21.07.2020 09:25:24
Herby
Hallo Werner
ich habe die von Dir vorgeschlagenen Anpassungen vorgenommen und der Code funktioniert damit reibungslos, Danke dafür. Mir ist allerdings nicht ganz klar, ob mit dem Weglassen der Angabe zum Sheet auch die intelligente der Zieldatei funktionieren sollte. Ich habe den Bereich in der Zieldatei "Servicematrix" als gleichnamige intelligente Tabelle formatiert. Das Script schreibt im Moment immer die Zelle darunter, egal wie wie viele Leerzeilen in der intelligenten Tabelle darüber leer gelassen werden.
Gruss
Herby

Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix.xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
With ThisWorkbook.Worksheets("Offering")
LastRow = .Columns("A").Find(what:="*", LookIn:=xlValues, searchdirection:=xlPrevious).Row
For Each rng In .Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
.Cells(foundVal.Row, "A").PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End With
Else
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:= _
xlPasteValues
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Close True
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing
End Sub

Anzeige
AW: Anmerkung
21.07.2020 10:09:19
Werner
Hallo,
versuchs mal so:
Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix. _
xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
With ThisWorkbook.Worksheets("Offering")
LastRow = .Columns("A").Find(what:="*", LookIn:=xlValues, searchdirection:=xlPrevious).Row
For Each rng In .Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
Set foundVal = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
If Not raFund Is Nothing Then
.Cells(foundVal.Row, "A").Offset(1).PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End If
End With
Else
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:= _
xlPasteValues
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Close True
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing
End Sub
Frage: Warum hast du die Variablen foundVal, boAktualisieren und boAbbruch als Public deklariert?
Gruß Werner
Anzeige
AW: Anmerkung
21.07.2020 14:09:21
Herby
Hallo Werner
Bei der Zeile

If Not raFund Is Nothing Then
kam ein Fehler und ich habe die Zeile auf
  If Not foundVal Is Nothing Then

geändert.
Aber egal mit oder ohne Not, so wie ich es geändert habe kommt zwar kein Fehler mehr, aber das Script schreibt noch immer "unter" die intelligente Tabelle. Dies auch ungeachtet davon, ob im Bereich innerhalb der intelligenten Tabelle leere Zeilen vorhanden sind, oder nicht.
nachfolgend der aktuelle Stand gemäss Deinem Vorschlag

Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix.xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
With ThisWorkbook.Worksheets("Offering")
LastRow = .Columns("A").Find(what:="*", LookIn:=xlValues, searchdirection:=xlPrevious).Row
For Each rng In .Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
Set foundVal = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
'                    If Not raFund Is Nothing Then
If Not foundVal Is Nothing Then
.Cells(foundVal.Row, "A").Offset(1).PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End If
End With
Else
With wsZiel
.Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:= _
xlPasteValues
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Save
'wbZiel.Close True
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing
End Sub

Dass die Variablen als Public definiert sind, entstammt nicht meiner Feder. Ich wäre auch nicht qualifiziert um überhaupt auf diese Idee gekommen zu sein :)
Anzeige
AW: Anmerkung
21.07.2020 14:23:13
Werner
Hallo,
das ganze ist jetzt nur noch Rätselraten. Lad mal deine Zielmappe mit der intelligenten Tabelle hier hoch.
Gruß Werner
AW: Anmerkung
21.07.2020 14:54:35
Herby
Da hast Du wohl Recht
https://www.herber.de/bbs/user/139200.xlsx
Die Datei heisst: Servicematrix.xlsx
Das Worksheet: Servicematrix
Die Intelligente Tabelle: At_Servicematrix
Under Bereichsnamen wäre wiederum : Servicematrix
Es sollte kein Problem sein, wenn die Namensgebung der unterschiedlichen Elemente immer identisch ist, oder etwa doch?
Hast du denn...
21.07.2020 15:30:05
Werner
Hallo,
...den Code, den ich um 14:48 h, gepostet habe schon versucht?
Gruß Werner
Anzeige
AW: Anmerkung
21.07.2020 14:48:59
Werner
Hallo,
nochmal ein Versuch, war an der falschen Stelle:
Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range, raFund As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix. _
xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
With Workbooks("Estimator 2.5.xlsm").Worksheets("Offering")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For Each rng In Sheets("Offering").Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
Set raFund = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
If Not raFund Is Nothing Then
.Cells(raFund.Row, "A").Offset(1).PasteSpecial Paste:=xlPasteValues
End If
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
.Cells(foundVal.Row, "A").PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End With
Else
With wsZiel
Set raFund = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
If Not raFund Is Nothing Then
.Cells(raFund.Row, "A").End(xlUp).Offset(1).PasteSpecial _
Paste:=xlPasteValues
End If
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Save
wbZiel.Close
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing: Set raFund = Nothing
End Sub
Wenn es wieder nicht klappt bitte deine Zielmappe mit der intelligenten Tabelle.
Gruß Werner
AW: Anmerkung
21.07.2020 15:29:03
Herby
Hallo Werner
Zieldatei habe ich in der Zwischenzeit ja hochgeladen, nichtsdestotrotz habe ich Deinen letzten Vorschlag versucht. Dieser meldet einen Laufzeitfehler 9 und bleibt dann bei der Zeile 17 stehen.
Ich habe keine Ahnung, wieso nun wieder an dieser Stelle. Das hatten wir doch schon Mal, als wir es an der Stell mit ThisWokbook versucht hatten. Das ist mir zu hoch und Du kannst versichert sein, dass ich an der Umgebung gar nicht veränder habe, ausser (Neu) der intelligenten Tabelle und dem Bereichsnamen.
AW: Anmerkung
21.07.2020 15:34:10
Werner
Hallo,
da habe ich versehentlich wieder die Codezeile mit dem vorangestellten Sheets... mit rein kopiert.
das
For Each rng In Sheets("Offering").Range("A5:A" & LastRow)

ändern in
For Each rng In .Range("A5:A" & LastRow)
Gruß Werner
AW: Anmerkung
21.07.2020 16:21:49
Herby
Hallo Werner
jetzt bin ich schon fast ein ganz klein wenig stolz auf mich, dass ich deinen Code so anpassen konnte, dass nun alles funktioniert. Die Zeilen werden nun wie gewünscht, in den Bereich der intelligenten Tabelle geschrieben.
Ich musste aber die Zeile

With Workbooks("Estimator 2.5.xlsm").Worksheets("Offering"

wieder mit dieser hier ersetzen
With ThisWorkbook.Worksheets("Offering")

Zusammen mit deinem letzten Änderungsvorschlag von

For Each rng In Sheets("Offering").Range("A5:A" & LastRow)

zu

For Each rng In .Range("A5:A" & LastRow)

hat dann eben alles funktioniert. Damit sieht der fertige Code nun wie folgt aus

Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range, raFund As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix.xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
With ThisWorkbook.Worksheets("Offering")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For Each rng In .Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
Set raFund = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
If Not raFund Is Nothing Then
.Cells(raFund.Row, "A").Offset(1).PasteSpecial Paste:=xlPasteValues
End If
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
.Cells(foundVal.Row, "A").PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End With
Else
With wsZiel
Set raFund = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
If Not raFund Is Nothing Then
.Cells(raFund.Row, "A").End(xlUp).Offset(1).PasteSpecial _
Paste:=xlPasteValues
End If
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Save
wbZiel.Close
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing: Set raFund = Nothing
End Sub
Du hattest noch gefragt, wieso die Variablen als public definiert sind, ist das ein Problem und sollte besser geändert werden. Ich habe dazu keinen Plan :(
In jedem Fall noch einmal herzlichen Dank für Deine tolle Ungterstützung
Gruss
Herby
Gerne u. Danke für die Rückmeldung und..
21.07.2020 16:28:18
Werner
Hallo,
...nein, kein Problem und ist zudem auch von mir. Das ist der Userform geschuldet. Im Code der Userform werden diese Variablen entsprechend gesetzt. Und da die dann im allgemeinen Modul weiterverwendet werden, müssen sie als Public deklariert sein - das hatte ich nicht mehr auf dem Schirm.
Gruß Werner
AW: Anmerkung
21.07.2020 16:32:21
Herby
Da war ich zu schlampig bei Testen, denn es funktioniert nur die Aktualisierung von Zeilen, innerhalb der der intelligenten Tabelle. Ein neuer Eintrag, wird dann wiederum unter die Tabelle geschrieben. Das ist komisch, oder nicht?
Oh Mann...
21.07.2020 17:01:49
Werner
Hallo,
...ich glaub ich lass es für heute.
Hier ist/war noch ein .End(xlUp) drin, das da nichts zu suchen hat.
Option Explicit
Public foundVal As Range
Public boAktualisieren As Boolean
Public boAbbruch As Boolean
Sub Übertragen()
Dim LastRow As Long, rng As Range, raFund As Range
Dim wbZiel As Workbook, wsZiel As Worksheet
Application.ScreenUpdating = False
Set wbZiel = Workbooks.Open("https://upgreat365.sharepoint.com/sites/ServiceManagement/ _
Freigegebene%20Dokumente/SERVICE%20MANAGEMENT%20LIBRARY/1.%20Service%20Katalog/Servicematrix. _
xlsx?web=1")
Set wsZiel = wbZiel.Worksheets("Servicematrix")
With ThisWorkbook.Worksheets("Offering")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For Each rng In .Range("A5:A" & LastRow)
Set foundVal = wsZiel.Columns("A").Find(what:=rng, LookIn:=xlValues, lookat:=xlWhole)
If foundVal Is Nothing Then
rng.EntireRow.Copy
With wsZiel
Set raFund = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
If Not raFund Is Nothing Then
.Cells(raFund.Row, "A").Offset(1).PasteSpecial Paste:=xlPasteValues
End If
End With
Else
rng.EntireRow.Copy
UserForm2.Show
If boAbbruch Then
Application.CutCopyMode = False
Exit Sub
End If
If boAktualisieren Then
With wsZiel
.Cells(foundVal.Row, "A").PasteSpecial Paste:=xlPasteValues
boAktualisieren = False
End With
Else
With wsZiel
Set raFund = .Columns("A").Find(what:="*", LookIn:=xlValues, _
lookat:=xlWhole, searchdirection:=xlPrevious)
If Not raFund Is Nothing Then
'hier geändert ##
'.Cells(raFund.Row, "A").End(xlUp).Offset(1).PasteSpecial _
Paste:=xlPasteValues
.Cells(raFund.Row, "A").Offset(1).PasteSpecial Paste:=xlPasteValues
End If
End With
End If
End If
Next rng
End With
'Zieldatei speichern
wbZiel.Save
wbZiel.Close
Application.CutCopyMode = False
Set wbZiel = Nothing: Set wsZiel = Nothing: Set foundVal = Nothing: Set raFund = Nothing
End Sub
Wenns nicht klappt, dann ist hier für mich heute Schluss. Dann schau ich mir das Morgen nochmal an, wenn ich dazu komme.
Gruß Werner
AW: Oh Mann...
21.07.2020 17:44:31
Herby
Hallo Werner
das dachte ich mir eben auch und ich verstehe, wenn Du die Nerven mit mir verlierst.
Ich werde deinen letzten Hinweis noch verarbeiten.
Betreffen der intelligenten Tabellen und wie man diese mit VBA anspricht, habe ich vorhin einen Beitrag in einem Microsoft Forum gesehen. Da meint jemand, dass VBA diese Tabellen als ListObject anspricht und dass man diese entsprechend behandeln muss.
https://www.ms-office-forum.net/forum/showthread.php?t=339233

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige