Anzeige
Archiv - Navigation
1964to1968
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

Daten von Quelldatei in Zieldatei übertragen

Daten von Quelldatei in Zieldatei übertragen
28.02.2024 16:23:12
Gabi
Hallo,

ich möchte Daten von einer Datei in eine andere per Knopfdruck (siehe Button auf AC1 der Quelldatei) kopieren. Dabei ergeben sich für mich (absoluter Laie) zwei Probleme.

1. Die Anwahl des korrekten Tabellenblattes in der Zieldatei.
2. Das Format der Zellen in der Zieldatei.

Die Quelldatei (hier Test_Reisekosten_Abrechnung.xlsx) kann einen x-beliebigen Namen haben. Ich kann die Datei also nicht über den Namen ansprechen! Jeden Monat gibt es hunderte solcher Quelldateien mit den unterschiedlichsten Namen, deren Daten übertragen werden sollen.
Die Quelldatei hat im Original ca. 20 Arbeitsblätter. Eines davon heißt "Reisekosten". Die Bezeichnung des Quellarbeitsblattes ist immer gleich.

Die Zieldatei ist immer die gleiche. Hier im Beispiel heißt sie Test_Reisekosten.xlsx. Sie hat jedoch bis zu 100 Arbeitsblätter, pro Mitarbeiter ein separates Arbeitsblatt. Die Arbeitsblätter sind nach dem Nachnamen des Mitarbeiters benannt. Bei gleichen Nachnamen gibt es die Ausnahme, dass der Vorname als Abkürzung zugefügt wird (z.B. Meier, A und Meier, B). Das ist jedoch in meinem Programm vernachlässigt, da es selten vorkommt. Das könnte aus der Not heraus dann manuell abgearbeitet werden.

Um den Namen des korrekten Tabellenblattes in der Zieldatei zu finden, habe ich eine Behelfszelle angelegt (W1 der Quelldatei), welche den Nachnamen aus dem Gesamtnamen (G3) extrahiert. Der Gesamtname ist hier händisch eingetragen, in der Originaldatei ist die Zelle ein Verweis auf ein anderes Arbeitsblatt. Dort der Name entweder auch gezogen oder händisch eingegeben. Es ist ziemlich unstrukuriert. Der Gesamtname wird von vielen unterschiedlichen Leuten ausgefüllt. Es ist schwierig, die Mitarbeiter der Firma dazu zu bringen, eine gleiche Syntax einzuhalten. Nun wollte ich dieses Behelfsfeld als Variable nehmen (siehe Zeile 3 des Programms: Variable = ("W1")) und eine Verbindung zur Zieldatei herstellen. Das hat leider nicht funktioniert. Daher habe ich - um zu testen, ob der Rest meines Programmes funktioniert - die Variable durch "Meier" ersetzt. Also Frage 1.: Wie kann ich das korrekte Tabellenblatt in der Zieldatei ansprechen?

Dann werden einzelne Daten von der Quelldatei in die Zieldatei übertragen. In meinem jetzigen Programstadium nur Daten aus Zeile 8 und 9, ich würde den Part für Zeile 8 und 9 für Zeile 10 bis 12 wiederholen. Das funktioniert grundsätzlich auch. Jedoch nicht die Formatierung. Egal wie ich die Zellen in der Zieldatei formatiere, in Spalte B der Zieldatei steht ein falscher Wert und die Zellen der Spalten E, H und I verschlucken die zweite Null. Dazu muss ich sagen, dass in Zelle N8 und N9 der Quelldatei eigentlich eine Formel steht. Diese habe ich durch den Wert ersetzt. Das ändern am falschen Übertrag nichts. (Ich habe alle Formeln in der Quelldatei durch reine Daten ersetzt, da die Formeln durch die Benennung und Verweise sensible Daten enthalten. Ich gehe jedoch davon aus, dass dies für meine Probleme irrelevant ist.)

Zeile 7 und 8 der Zieldatei sind das Ergebnis des Übertrags per Button. Auch wenn ich die Zellen händisch im Nachhinein ändere, also das Format der Quelldatei übernehme, erscheinen die Nullen nicht?!?

Also Frage 2: Warum werden die Daten nicht korrekt übertragen, insbesonere auch Spalte B der Zieldatei?

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrück. Falls noch Fragen sind, gerne melden. Und vorab schon mal vielen Dank für Eure Hilfe!!!

LG Gabi

Dies sind die beiden Dateien:
https://www.herber.de/bbs/user/167393.xlsx
https://www.herber.de/bbs/user/167394.xlsx


Sub TestUebertragGesamttabelle()

ActiveWorkbook.Worksheets("Reisekosten").Select
Dim Variable As String
Variable = ("W1")
Dim Datum8 As String, Abwesenheit8 As String, SpesenNeu8 As String, SpesenKU8 As String, Fruehstueck8 As String, MittagAbend8 As String, Datum9 As String, Abwesenheit9 As String, SpesenNeu9 As String, SpesenKU9 As String, Fruehstueck9 As String, MittagAbend9 As String

Datum8 = Range("A8")
Abwesenheit8 = Range("N8")
SpesenNeu8 = Range("O8")
SpesenKU8 = Range("P8")
Fruehstueck8 = Range("Q8")
MittagAbend8 = Range("R8")

Datum9 = Range("A9")
Abwesenheit9 = Range("N9")
SpesenNeu9 = Range("O9")
SpesenKU9 = Range("P9")
Fruehstueck9 = Range("Q9")
MittagAbend9 = Range("R9")

Workbooks("Test_Reisekosten.xlsx").Activate
Worksheets("Meier").Activate
Range("A5").Select
If Workbooks("Test_Reisekosten.xlsx").Worksheets("Meier").Range("A5").Offset(1, 0) > "" Then
Workbooks("Test_Reisekosten.xlsx").Worksheets("Meier").Range("A5").End(xlDown).Select
End If

ActiveCell.Offset(1, 0).Select
ActiveCell.Value = Datum8
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Abwesenheit8
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = SpesenNeu8
ActiveCell.Offset(0, 2).Select
ActiveCell.Value = SpesenKU8
ActiveCell.Offset(0, 3).Select
ActiveCell.Value = Fruehstueck8
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = MittagAbend8

ActiveCell.Offset(1, -8).Select
ActiveCell.Value = Datum9
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Abwesenheit9
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = SpesenNeu9
ActiveCell.Offset(0, 2).Select
ActiveCell.Value = SpesenKU9
ActiveCell.Offset(0, 3).Select
ActiveCell.Value = Fruehstueck9
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = MittagAbend9

End Sub







14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten von Quelldatei in Zieldatei übertragen
28.02.2024 17:24:11
Yal
Hallo Gabi,

"Select" kommt vor, weil diese Makro mit dem Makrorekorder aufgenommen wurde und die Aktion sind immer zuerst eine Zelle auswählen ("Select"), dann eine Aktion ausführen. VBA braucht diese Select nicht.

Eine Quelle-Datei kann mit Application.Filedialog ausgewählt werden.

Der Code könnte so aussehen:
Sub TestUebertragGesamttabelle()

Dim Quelle As Workbook
Dim ServiceMA As String

With Application.FileDialog(msoFileDialogFilePicker)
If .Show = False Then
Exit Sub 'der User hat den Dialog mit "Abbrechen" verlassen
Else
Set Quelle = Workbooks.Open(.SelectedItems(1)).Worksheets("Reisekosten")
ServiceMA = Zielblatt_finden(Quelle.Range("G3").Value)
If ServiceMA = "" Then
Quelle.Activate
MsgBox "Name der Service-Mitarbeiter wahrscheinlich falsch: " & Quelle.Range("G3").Value, , "Bitte prüfen"
Exit Sub
End If
End If
End With

With ThisWorkbook.Worksheets(ServiceMA).Cells(Rows.Count, "A").End(xlUp)
.Offset(1, 0).Value = Quelle.Range("A8").Value 'Datum
.Offset(1, 1).Value = Quelle.Range("N8").Value 'Abwesenheit
.Offset(1, 2).Value = Quelle.Range("O8").Value 'Spesen Neu
.Offset(1, 4).Value = Quelle.Range("P8").Value 'Spesen KU
.Offset(1, 7).Value = Quelle.Range("Q8").Value 'Frühstück
.Offset(1, 8).Value = Quelle.Range("R8").Value 'Mittag Abend

.Offset(2, 0).Value = Quelle.Range("A9").Value 'Datum
.Offset(2, 1).Value = Quelle.Range("N9").Value 'Abwesenheit
.Offset(2, 2).Value = Quelle.Range("O9").Value 'Spesen Neu
.Offset(2, 4).Value = Quelle.Range("P9").Value 'Spesen KU
.Offset(2, 7).Value = Quelle.Range("Q9").Value 'Frühstück
.Offset(2, 8).Value = Quelle.Range("R9").Value 'Mittag Abend
End With
End Sub

Function Zielblatt_finden(Name) As String
Dim N
Dim Blattname As String
On Error Resume Next
For Each N In Split(Name)
Blattname = ThisWorkbook.Worksheets(N).Name
If Blattname > "" Then
Zielblatt_finden = Blattname
Exit Function
End If
Next
End Function


VG
Yal
Anzeige
Vergessen...
28.02.2024 17:26:20
Yal
Diese Makros gehören nicht in jede einzelne Reisekosten-Datei, sondern in der Sammeldatei.
AW: Vergessen...
29.02.2024 08:25:37
Gabi
Hallo Yal,

toll, vielen Dank für die prompte Antwort.
Mir ist nur eines nicht klar. Wenn das Makro in der Zieldatei ist, wie wird es dann angesprochen?

Ich habe vielleicht vergessen, einen wichtigen Punkt zu nennen:
Die Zieldatei darf nur von zwei Personen (Buchhalter) geöffnet und bearbeitet werden.
Die Quelldatei wird von der Buchhalterin bearbeitet und wenn sie damit fertig ist, sollen die Daten in die Zieldatei übertragen werden. Daher ist mein Button in der Quelldatei. Aber dieser Button darf nur dann funktionieren, wenn die Zieldatei gleichzeitig geöffnet ist. Das ist meine Sicherheit, dass niemand außer der Buchhalterin die Daten übertragen kann, da niemand außer ihr die Zieldatei öffnen kann. So war zumindest mein Plan.

Ich habe nun Dein Programm in die Zieldatei geschrieben, aber der Button ist nach wie vor in der Quelldatei mit Bezug auf das VBA in der Zieldatei.
Dein Programm will nun eine Datei öffnen. Aber die Datei ist bereits geöffnet, weil sie ja gerade in Bearbeitung ist und dort mein Button sitzt.

Wo ist mein Denkfehler?

LG
Gabi
Anzeige
AW: Vergessen...
29.02.2024 09:03:56
Yal
Hallo Gabi,

vielleicht mal eine paar Grundwissen: Makros sind kein Zauberstab. Wenn ein Mitarbeiter kein Schreiberechte in das Zieldatei hat, wird das Makro, das eben durch diese MA angestossen wird, diese Recht auch nicht haben, egal von woher diese angestossen wird.

Der Gedanken hinter dem Makro-in-Ziel anstatt Makro-in-Quelle ist, dass Du ein Ziel hast, aber hunderten Quellen. D.h. es muss in alle Quelle das Makro vorhanden sein. Es geht nur gut, weil diese Makro nur einmal angestossen wird und dann nie wieder. Wenn es aber regelmässig anzustossen wäre (in dieselbe Datei. Reine Gfedankenspiel, weil hier nicht relavant), hätten wir das Problem, dass wenn der Name des Zeiles sich ändert, diese Änderung in alle Quellen gemacht werden muss.

Eine gesunde Alternativ wäre, diese Makro in einer separaten "Makro.xlsm"-Datei abzulegen. Es müsste eine Anpassung von "ThisWorkbook" in "ActiveWorkbook" genommen werden. Makro werden mit Alt+F8 auch abgerufen, auch wenn diese in einer anderen Datei vorliegen. Die Makro-Datei muss nur offen sein.

VG
Yal
Anzeige
AW: Vergessen...
29.02.2024 09:34:19
Gabi
Hallo Yal,

vielen Dank für Deine Antwort.

Ich habe nun folgendes probiert:
Das Makro ist in der Zieldatei. Wenn die Buchhalterin also die Zieldatei aufruft, kann sie das Makro manuell aufrufen und ausführen (ohne Button).
Das Problem mit dem Zugriff durch Nichtautorisierte ist damit ja gelöst.

Dann folgt trotzdem der Fehler, dass das Programm nach Öffnen der Datei hängen bleibt:
Laufzeitfehler '13': Typen unverträglich
Set Quelle = Workbooks.Open(.SelectedItems(1)).Worksheets("Reisekosten")

LG
Rosi
AW: Vergessen...
29.02.2024 11:48:49
Yal
Hallo Gabi,

ich habe diese Code ohne Test gemacht, daher solche Fehler nicht entdeckt.

Es mekert zwar an diese Stelle, aber da wo es falsch ist, ist eine andere:
Sub TestUebertragGesamttabelle()

Dim Quelle As Workbook
Dim ServiceMA As String


Die Variable "Quelle" sollte nicht als "Workbook" sondern als "Worksheet" dimensioniert sein:
Sub TestUebertragGesamttabelle()

Dim Quelle As Worksheet
Dim ServiceMA As String


VG
Yal
Anzeige
AW: Vergessen...
29.02.2024 12:16:48
Gabi
Hallo Yal,

nun scheint es weitestgehend zu funktionieren. Lediglich die Daten der Spalte N werden noch falsch übertragen.
Zeile 8: Quelle 11:00 Ziel 0,46
Zeile 9: Quelle 20:15 Ziel 0,84

Gruß
Gabi
AW: Vergessen...
29.02.2024 12:41:32
Yal
Hallo Gabi,

es ist ein Formatierungsproblem.
Datum sind in 2 geteilt:
vor der Komma sind die Anzahl von Tage ab dem 31.12.1899 (Tag 0). Heute ist Tag 45351.
nach der Komma, die "Anteil vom Tag": 12Uhr mittag ist 0,5, 16 Uhr ist 0,66 und 0,46 eben 11Uhr.

Rechtsklick auf die Zelle "Zellen formatieren" und Kategorie "Uhrzeit" auswählen und Typ 13:30 nehmen.

VG
Yal
Anzeige
AW: Vergessen...
29.02.2024 13:54:28
Gabi
Hallo Yal,

es nimmt kein Ende. ;-)

Bis hier hin tausend Dank. Das hätte ich alleine nicht hinbekommen.

Es gibt noch ein Problem:
Wenn Zeile 9 der Quelldatei leer ist, dürfen keine Daten übertragen werden. Es sollen immer nur die Daten von ausgefüllten Zeilen übertragen werden.
Ich muss das Programm ja noch so anpassen, dass auch die Daten der Zeilen 10-12 übertragen werden. Für diese gilt das dann auch.

Aktuell steht, wenn Zeile 9 der Quelldatei leer ist, in der zweiten Zeile der Zieldatei:
12:00:00 AM 0:00 0,00 0,00 0,00 0,00

LG
Gabi


Anzeige
AW: Vergessen...
29.02.2024 13:58:56
Gabi
Korrektur!

Ich korrigiere wie folgt:
Die Zeile bzw. die Zellen sind nie leer. Denn es ist dort im Original ein Verweis auf ein anderes Tabellenblatt - also eine Formel hinterlegt.
Mit "leer" meine ich also, dass kein Wert wie z.B. Datum "sichtbar" ist.

LG
AW: Vergessen...
29.02.2024 16:40:07
Yal
Hallo Gabi,

kein Problem: man prüft jeweils was in A8 und A9 steht, und agiert dementsprechend
// Achtung: Zielblatt_finden und deren Aufruf sind geändert worden.
Man muss das Nakro beim aktiven ZIel-Workbook starten.

Sub TestUebertragGesamttabelle()

Dim Quelle As Worksheet
Dim ServiceMA As String
Dim ZielWB As Workbook

Set ZielWB = ActiveWorkbook 'man muss das Makro straten, während das Ziel-wb aktiv ist!!
With Application.FileDialog(msoFileDialogFilePicker)
If .Show = False Then
Exit Sub 'der User hat den Dialog mit "Abbrechen" verlassen
Else
Set Quelle = Workbooks.Open(.SelectedItems(1)).Worksheets("Reisekosten")
ServiceMA = Zielblatt_finden(ZielWB, Quelle.Range("G3").Value)
If ServiceMA = "" Then
Quelle.Activate
MsgBox "Name der Service-Mitarbeiter wahrscheinlich falsch: " & Quelle.Range("G3").Value, , "Bitte prüfen"
Exit Sub
End If
End If
End With

With ZielWB.Worksheets(ServiceMA).Cells(Rows.Count, "A").End(xlUp)
If Quelle.Range("A8").Value > 0 Then
.Offset(1, 0).Value = Quelle.Range("A8").Value 'Datum
.Offset(1, 1).Value = Quelle.Range("N8").Value 'Abwesenheit
.Offset(1, 2).Value = Quelle.Range("O8").Value 'Spesen Neu
.Offset(1, 4).Value = Quelle.Range("P8").Value 'Spesen KU
.Offset(1, 7).Value = Quelle.Range("Q8").Value 'Frühstück
.Offset(1, 8).Value = Quelle.Range("R8").Value 'Mittag Abend
End If
If Quelle.Range("A9").Value > 0 Then
.Offset(2, 0).Value = Quelle.Range("A9").Value 'Datum
.Offset(2, 1).Value = Quelle.Range("N9").Value 'Abwesenheit
.Offset(2, 2).Value = Quelle.Range("O9").Value 'Spesen Neu
.Offset(2, 4).Value = Quelle.Range("P9").Value 'Spesen KU
.Offset(2, 7).Value = Quelle.Range("Q9").Value 'Frühstück
.Offset(2, 8).Value = Quelle.Range("R9").Value 'Mittag Abend
End If
End With
End Sub

Function Zielblatt_finden(WB As Workbook, Name) As String
Dim N
Dim Blattname As String
On Error Resume Next
For Each N In Split(Name)
Blattname = WB.Worksheets(N).Name
If Blattname > "" Then
Zielblatt_finden = Blattname
Exit Function
End If
Next
End Function


VG
Yal
Anzeige
AW: Vergessen...
05.03.2024 16:25:47
Gabi
Hallo Yal,

sorry, dass ich mich jetzt erst wieder melde. Wir hatten Monatswechsel und somit war ich hauptsächlich mit Abschlussarbeiten beschäftigt.

Vielen Dank auch für die letzte Änderung. Ich werde dies nun so unserer Buchhaltung vorstellen. Sollten sich dann noch Änderungswünsche ergeben, so melde ich mich wieder.

Anderenfalls möchte ich mich an dieser Stelle ganz herzlich für Deinen Einsatz bedanken. Das hätte ich alleine niemals hinbekommen. Toll! Drei mal Daumen hoch! Danke! :-)

LG
Gabi
AW: Vergessen...
14.03.2024 09:00:42
GGG2019
Hallo Yal,

die Buchhaltung arbeitet jetzt mit dieser Tabelle. Nun kommen die ersten Praxisprobleme. Es stellt sich heraus, dass die Reisekostenabrechnungen nicht in zeitlich korrekter Reihenfolge eingehen. Das heißt, nach dem Eintrag müssen die Daten in den Zellen A5:J300 in dem jeweiligen Tabellenblatt nach Spalte A (Datum) aufsteigend sortiert werden. Kannst Du das noch einbauen? Das wäre toll.

Danke und Gruß
Gabi
Anzeige
AW: Vergessen...
18.03.2024 10:33:13
Gabi
Hallo Yal,

die Buchhaltung arbeitet jetzt mit dieser Tabelle. Nun kommen die ersten Praxisprobleme. Es stellt sich heraus, dass die Reisekostenabrechnungen nicht in zeitlich korrekter Reihenfolge eingehen. Das heißt, nach dem Eintrag müssen die Daten in den Zellen A5:J300 in dem jeweiligen Tabellenblatt nach Spalte A (Datum) aufsteigend sortiert werden. Kannst Du das noch einbauen? Das wäre toll.

Danke und Gruß
Gabi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige