Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1876to1880
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 kopieren

Daten kopieren
06.04.2022 15:54:43
Daniela
Hallo zusammen,
Wer kann mir bei meinem Problemchen weiterhelfen?
Ich habe das folgende Makro mit dem Makrorekorder aufgezeichnet.
Das Makro kopiert Zellen werte vom einen zum anderen Formular (inhaltlich gleich große Zellen). Der Sinn der Sache ist, die Daten vom einen Formular nicht nochmals im zweiten Formular einzutippen, falls man diese Daten im zweiten Formular auch wirklich braucht.
Das Problem ist nun, wenn die Daten einmal kopiert werden (was auch richtig gut funktioniert) und ich den Button nochmals drücke, wird ein Fehler eingeblendet und das Makro bleibt stehen. Wie kann man nun das Makro so korrigieren dass wenn man die Daten schon kopiert hat und man klickt nochmals auf den Button, dass das Makro schon weis dass im zweiten Formular schon Daten vorhanden sind?

Option Explicit
Sub MAMFKopie()
' Daten kopieren
Range("C4:E4").Select
Sheets("Formular MA").Select
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C12:F12").Select
Sheets("Formular MA").Select
Range("C12:F12").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C13:F13").Select
Sheets("Formular MA").Select
Range("C13:F13").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C14:F14").Select
Sheets("Formular MA").Select
Range("C14:F14").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C15:F15").Select
Sheets("Formular MA").Select
Range("C15:F15").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C16:F16").Select
Sheets("Formular MA").Select
Range("C16:F16").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C17:F17").Select
Sheets("Formular MA").Select
Range("C17:F17").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C21:F21").Select
Sheets("Formular MA").Select
Range("C20:F20").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C25:D25").Select
Sheets("Formular MA").Select
Range("H23:I23").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C27:D27").Select
Sheets("Formular MA").Select
Range("C26:D26").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("H27:I27").Select
Sheets("Formular MA").Select
Range("H28:I28").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Formular MF").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Formular MA").Select
Range("C4:E4").Select
Application.CutCopyMode = False
Range("C4:E4").Select
End Sub
Danke für jede Hilfe
lg Daniela

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten kopieren
06.04.2022 15:57:56
{Boris}
Hi,

wird ein Fehler eingeblendet und das Makro bleibt stehen
Wo genau im Code?
VG, Boris
AW: Daten kopieren
06.04.2022 16:39:40
Daniela
Beim ersten

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Lad mal bitte Deine Mappe...
06.04.2022 16:43:02
{Boris}
Hi,
...mit Deinem Code hoch - vorher Daten anonymisieren.
VG, Boris
AW: Lad mal bitte Deine Mappe...
06.04.2022 16:47:38
Daniela
Was meinst du genau?
Lad mal bitte die Mappe hoch...
06.04.2022 16:48:52
{Boris}
Hi,
...heißt: Lad mal bitte die Mappe hoch. Oberhalb des Antwortfensters findest Du den Button "Zum File-Upload".
VG, Boris
AW: Lad mal bitte die Mappe hoch...
06.04.2022 17:20:48
Daniela
Ach so, das geht leider nicht so einfach vom Firmenstandort aus. Da werden immer wieder Firmenangaben mit reinkopiert, zudem muss eine sichere Verschlüsselte Verbindung stehen.
Anzeige
Dann schau Dir...
06.04.2022 17:25:28
{Boris}
Hi,
...solange mal die Hinweise von Daniel an. Daraus geht für mich zwar noch nicht genau hervor, weshalb der Code beim 2. Durchlauf abschmiert, aber z.B., dass an eine falsche Stelle kopiert wird, da die vollständigen Referenzierungen fehlen.
VG, Boris
AW: Daten kopieren
06.04.2022 17:16:01
Daniel
HI
eine bitte: vom Recorder aufgezeichneter Code sollte immer überarbeitet werden, weil er viel unnötiges und umständliches enthält.
Er zeichnet die Arbeitsweise von Mausbenutzern auf, diese ist im Code aber nicht notwendig.
du solltest beispielsweise immer die Aktion (also den Befehl) immer an das Blatt und den Zellbereich direkt anhängen, anstatt diese erst zu selektieren und dann den Befehl an "Selection" zu hängen.
auch kannst du das "Application.CutCopyMode = False" im Code überall rausschmeißen, das braucht man nicht, außer vielleicht ganz am Schluss, wenn das Marko durchgelaufen ist um die "Ameisenrahmen" um den zuletzt kopierten Bereich zu entfernen, aber ansonsten unnötig.
hier mal ein Beispiel für das Selection:
aus

Sheets("Formular MA").Select
Range("H23:I23").Select
Application.CutCopyMode = False
Selection.Copy
macht man

Sheets("Formular MA").Range("H23:I23").Copy
setz das mal bitte in deinem Code vollständig um.
Dieser wird dadurch kürzer, schneller, leichter lesbar und weniger fehleranfällig.
vielleicht hat sich dein Problem damit auch schon erledigt denn:
ein weiteres Problem, das du gerade am Anfang hast mit diesen Zeilen:

Range("C4:E4").Select
Sheets("Formular MA").Select
Selection.Copy
du selektierst das Blatt und kopierst dann sofort den auf diesem Blatt selektierten Zellbereich!
vermutlich war beim Aufzeichnen des Codes schon der richtige Zellbereich selektiert, so dass das funktioniert hat, und beim ersten Starten vielleicht auch.
aber wenn jetzt beim nächsten Start vielleicht ein anderer Zellbereich selektiert ist als der gewünschte, dann wird zumindsest mal der falsche Bereich kopiert, ohne dass du das siehst, weil du ggf mit einem anderen aktiven Blatt das Makro startest.
Daher immer auf das ganze Select/Selection verzichten und vollständig referenzieren, dh die Zellbereiche mit Tabellenblatt angeben und den Befehl direkt dahinter hängen.
weitere Infos zur vollständigen Referenzierung findest du hier:
https://online-excel.de/excel/singsel_vba.php?f=78
Gruß Daniel
Anzeige
AW: Daten kopieren
06.04.2022 17:25:16
Daniela
Vielen Dank, ich werde das Morgen so umschreiben wie du es vorgegeben hast. Ich werde wieder ein Feedback geben. Leider habe ich noch ein Meeting im Anschluss. Daher, bis Morgen.
lg Daniela
Code gekürzt
06.04.2022 18:16:58
Yal
Hallo Daniela,
dein Code könnte man wie folgt zusammenfassen:

Sub MAMFKopie()
' Daten von MA nach MF kopieren
Dim R
For Each R In Array("C4:E4", "C12:F17", "C20:F20", "C25:D26", "H23:I23", "H28:I28")
Worksheets("Formular MA").Range(R).Copy
Worksheets("Formular MF").Range(R).PasteSpecial Paste:=xlPasteValues
Next
Application.CutCopyMode = False
End Sub
VG
Yal
Anzeige
AW: Code gekürzt
06.04.2022 18:21:43
Yal
Hallo Daniela,
eigentlich braucht man das Copy-Paste_Value gar nicht. Wert-Übertragung reicht:

Sub MAMFKopie()
' Daten von MA nach MF kopieren
Dim R
For Each R In Array("C4:E4", "C12:F17", "C20:F20", "C25:D26", "H23:I23", "H28:I28")
Worksheets("Formular MF").Range(R) = Worksheets("Formular MA").Range(R).Value
Next
End Sub
VG
Yal
AW: Code gekürzt
06.04.2022 22:34:01
Yal
Hallo Daniela,
irgendwie ist deine Makroaufnahme ziemlich durcheinander:
anstatt klassisch "ich gehe auf Quellblatt, markiere die Quelle, kopiere, wechseln zu Zielblatt, markiere das Ziel und paste", und wiederhole,
machst Du "ich bin auf das Zielblatt, also markeire ich das Zielbereich, wechsel zu Quellblatt, markiere die Quelle, kopiere, wechsel zu Zielblatt und paste" und wiederhole.
Wenn die zweite Annahme richitg ist, muss ich wohl einsehen, dass es fast immer eine Unterschied zwischen Quell- und Zielrange.
Daher alles in Paarung Quelle|Ziel:

Sub MAMFKopie()
' Daten von MA nach MF kopieren
Dim R
'Alle Eingabe in Quelle|Ziel-Paare
For Each R In Array("C4:E4|C4:E4", "C12:F17|C12:F17", "C20:F20|C21:F21", "H23:I23|C25:D25", "C26:D26|C26:D26", "H28:I28|H27:I27")
Worksheets("Formular MF").Range(Split(R, "|")(1)) = Worksheets("Formular MA").Range(Split(R, "|")(0)).Value
Next
End Sub
Also wesentlich komplizierter :-)
VG
Yal
Anzeige
AW: Code gekürzt
07.04.2022 06:46:51
Daniela
Guten Morgen zusammen
Yal, ich habe deine Variante in einem Test-File ausgiebig getestet und, es funktioniert tadellos und ohne Fehler.
Dann war der Makrorekorder doch nicht so eine gute Idee.
Ich möchte mich bei allen helfenden herzlich bedanken und wünsche euch einen schönen Tag.
lg Daniela
Der Makrorekorder ist immer eine gute Idee
07.04.2022 08:55:18
Yal
... nur genau wie Daniel es gesagt hat, muss man den Code in der Hand nehmen, verstehen was da steht und bei Bedarf anpassen.
Idealerweise nimmt man zuerst nur eine einzige Aktion mit dem MR auf. Dann schaut man den Code an, der dann noch kurz ist, und es ist leichter zu verstehen.
Aber ein Sache würde ich gern wissen: war meine letzte Annahme richtig, dass die Zielbereich nicht die Quellberich entspricht?
Wenn ja, kommt dann die nächste "Empfehlung": die Aktionen in einer sinnvolle Reihenfolge aufnehmen. Sonst ist der Code kaum zu durchschauen.
Solltest Du dein Code selber vereinfachen wollen oder ergänzen, die letzte Version war nicht ganz einfach, kommst Du vielleicht mit folgendem besser zu recht:

Sub MAMFKopie()
' Daten von MA nach MF kopieren
Dim arrQuelle()
Dim arrZiele()
Dim i
arrQuelle = Array("C4:E4", "C12:F17", "C20:F20", "H23:I23", "C26:D26", "H28:I28")
arrZiele = Array("C4:E4", "C12:F17", "C21:F21", "C25:D25", "C26:D26", "H27:I27")
For i = 0 To UBound(arrQuelle)
Worksheets("Formular MF").Range(arrZiele(i)) = Worksheets("Formular MA").Range(arrQuelle(i)).Value
Next
End Sub
Ich kann deine VBA-Kompetenz schwer einschätzen, trotzdem ein Tipp: versuche "eingedeutsch" zu lesen:
die Variable arrQuelle bekommt eine Liste von Werte, ...
Für jeden i, der mit null startet und mit der Länge der Liste arrQuelle endet,
den Bereich in Formular MF, dessen Adresse an der "i" Stelle von Liste arrZiele steht, wird mit den Werte aus dem Bereich...
usw...
So kommt man Schritt für Schritt mithilfe des Markorekorders zu einem stabilen VBA-Wissen.
VG
Yal
Anzeige
AW: Der Makrorekorder ist immer eine gute Idee
07.04.2022 15:20:54
Daniela
Hallo Yal
Deine Annahme ist richtig, bei manchen Zellen stimmen die Start- und Ziel eingaben nicht überein.
Deine erste Version habe ich gut verstanden, werde aber deine jetzige auch noch etwas näher anschauen. Ich bin in Sachen VBA eine Anfängerin. Daher bin ich auch froh um jeden Hinweis.
lg Daniela
Froh über jede Hinweis
07.04.2022 20:02:50
Yal
Hallo Daniela,
wenn Die Bereitschaft VBA zu lernen und sich mit dem gelieferten Code auseinderzusetzen vorhanden ist, kommen wir gern zur Hilfe.
Ein paar Tipps, die das Verstehen + Lernen von VBA beschleunigt (neben dem schon angesprochenen Makrorekorder):
_ im Schritt-Modus arbeiten (aber das hast Du wohl schon entdeckt)
_ dabei das Lokalfenster offen halten (Ansicht, Lokalfenster)
_ Überwachungsausdrücke verwenden: in dem Fall arrQuelle(i) markieren, Rechtsklick auf "Überwachung hinzufügen...". Das gleiche für arrZiele(i).
_ man kann Variable reinbringen, die den Code nicht besonders viel bringt, aber zu einer besseren Sichtbarkeit im Lokalfenster, z.B.
strZiel = arrZiele(i)
strQuelle = arrQuelle(i)
_ auch gut: Debug.Print arrQuelle(i), druckt den Zustand eine Variable in das Direktfenster.
_ wenn ein VBA-Begriff nicht bekannt ist, Cursor drauf paltzieren und Strg+F1, um an der Online-Hilfe zu gelangen. Dort sich die Zeit nehmen, grundlich zu lesen (die Aufmachung ist nur am Anfang gewöhnungsbedürftig) und die gegebenen Beispiele anzuschauen.
_ wenn die erste Schritte schon gemacht sind, das Objektkatalog anschauen
VG
Yal
Anzeige
AW: Froh über jede Hinweis
11.04.2022 13:25:34
Daniela
Vielen herzlichen Dank für deine Tipps. Ich bemühe mich, vba besser zu verstehen.
lg Daniela

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige