Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Copy und Paste mit Offset

Forumthread: Copy und Paste mit Offset

Copy und Paste mit Offset
27.02.2018 18:50:27
Brandner
Hallo zusammen,
ich habe folgenden Code:

Sub Leerzellen2()
Dim Bereich As Range, Zelle As Range
Set Bereich = ActiveSheet.Range("A5:D18000")
Dim Zeile As Integer
Dim x As Integer
Dim y As Variant
Dim z As Variant
x = Sheets("RVO").Range("A4").Value
For Each Zelle In Bereich.SpecialCells(xlCellTypeBlanks)
y = Zelle.Row
z = Cells(y - 1, 1).Value
Zeile = Sheets("RVO").Range("f18:f18000").Find(What:=z).Row
  Sheets("RVO").Range(Cells(Zeile, 10), Cells(Zeile, 62 - x)).Copy
Sheets(k).Range(Cells(y, 5), Cells(y, 48)).Paste
Sheets(k).Cells(y, 1).Value = Sheets(k).Cells(y - 1, 1).Value
Next Zelle
End Sub

Ich komme bis zu der fett markierten Zeile.
Mein Problem ist das er mir das kopierte aus dem sheet "RVO" nicht in sheets(k) einfügt. Gleichzeitig habe ich noch das Problem das die Endspalte immer Spalte 48 ist. Spalte fünf sich aber bei jeder Aktualisierung um eine Spalte nach rechts beim einfügen bewegen soll.
Kann mir hier vllt jemand weiterhelfen?
Vielen Lieben Dank!
Hier wären noch meine anderen Codes die in dieser Arbeitsmappe ausgeführt werden:
Dim k As Integer
Sub execute()
Dim blatt As Variant
k = 3
Do While k Sheets(k).Activate
Call leerzeilen2
Call Leerzellen2
k = k + 1
Loop
End Sub
Sub leerzeilen2()
Dim i As Long
Dim lastrow As Long
lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
For i = lastrow To 3 Step -1
If ActiveSheet.Cells(i, 1).Value = "" Or ActiveSheet.Cells(i - 1, 1).Value = "" Then
ElseIf ActiveSheet.Cells(i, 1).Value ActiveSheet.Cells(i - 1, 1).Value Then
Rows(i).Insert
End If
Next i
End Sub
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Copy und Paste mit Offset
27.02.2018 19:12:10
Hajo_Zi
Range bezieht sich auf Sheets("RVO") und Cells auf die aktuelle das geht nicht.
Arbeite mit With

Ich gebe keinen Dank für eine Rückmeldung, da ich durch solche Beiträge nicht meine Beitragszahl erhöhen muss.
Also ich schreibe keine Beiträge mit dem Betreff "Gerne u. Danke für die Rückmeldung....."
Rückmeldung ist ja in der Heutigen Zeit nicht üblich und die wenigen die eine Rückmeldung geben,
mögen mir das verzeihen, das kein Danke für eine Rückmeldung kommt.
Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
Anzeige
AW: Copy und Paste mit Offset
27.02.2018 19:12:47
Werner
Hallo,
hier:
Sheets(k)
benutzt du eine Variable "k". Die ist in deinem Code aber nirgends Deklariert, geschweige denn ist ihr ein Wert zugewiesen. Die Variable "k" ist also leer. Und ein Blatt mit dem Namen "" kannst du nicht ansprechen, gibt es nicht.
Gewöhne dir mal an, oberhalb deiner Prozedur Option.Explicit einzutragen, dann müssen alle Variablen deklariert werden. Wenn du das vergisst, dann wirst du angemeckert.
Ansonsten lade bitte eine Beispielmappe hoch.
Gruß Werner
Anzeige
AW: Copy und Paste mit Offset
28.02.2018 06:15:48
Gerd
Moin
'.............
Dim aa As Long
Sheets("RVO").Range(Sheets("RVO").Cells(Zeile, 10), Sheets("RVO").Cells(Zeile, 62 - x)).Copy _
Destination:=Sheets(k).Cells(y, 5 + aa)
Sheets(k).Cells(y, 1).Value = Sheets(k).Cells(y - 1, 1).ValueSheets(k).Cells(y, 1).Value
aa = aa + 1
Gruß Gerd
Anzeige
AW: Copy und Paste mit Offset
28.02.2018 16:00:01
Brandner
Hallo,
ich habe die Variable "k" in einem vorherigen Code deklariert. Hat so eigentlich funktioniert das dadurch alle Tabellenblätter durchgearbeitet werden. Hier nochmal mein kompletter Code. Und im letzen Abschnitt funktioniert eben das paste in die einzelnen Tabellenblätter und der Versatz nicht. Meine Wochenrange geht jetzt von Woche 9 bis Woche 52. Und wenn ich nächste Woche ein Upadate mache dann sollen die neuen Daten eben in die neu generiert Zeile eingefügt werden von Woche 10 bis 52, dann 11 bis 52, usw. Sodann quasi ein Wasserfallchart entsteht.
Danke!
Dim k As Integer
Sub execute()
Dim blatt As Variant
k = 3
Do While k 
Sub leerzeilen2()
Dim i As Long
Dim lastrow As Long
lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
For i = lastrow To 3 Step -1
If ActiveSheet.Cells(i, 1).Value = "" Or ActiveSheet.Cells(i - 1, 1).Value = ""  _
Then
ElseIf ActiveSheet.Cells(i, 1).Value  ActiveSheet.Cells(i - 1, 1).Value Then
Rows(i).Insert
End If
Next i
End Sub

Sub Leerzellen2()
Dim Bereich As Range, Zelle As Range
Set Bereich = Sheets(k).Range("A5:D18000")
Dim Zeile As Integer
Dim x As Integer
Dim y As Variant
Dim z As Variant
x = Sheets("RVO").Range("A4").Value
For Each Zelle In Bereich.SpecialCells(xlCellTypeBlanks)
y = Zelle.Row
z = Cells(y - 1, 1).Value
Zeile = Sheets("RVO").Range("f18:f18000").Find(What:=z).Row
Sheets("RVO").Range(Cells(Zeile, 10), Cells(Zeile, 62 - x)).Copy
Sheets(k).Range(Cells(y, 5), Cells(y, 48)).Paste
Sheets(k).Cells(y, 1).Value = Sheets(k).Cells(y - 1, 1).Value
Next Zelle
End Sub

Anzeige
Beispielmappe bitte
02.03.2018 20:05:09
Werner
Hallo,
mach mal eine Beispielmappe mit deinem Quellblatt und zumindest einem Zielblatt. Im Zielblatt bitte ein paar Datensätze eintragen, so wie dur dir das Ergebnis vorstellst.
Gruß Werner
;
Anzeige

Infobox / Tutorial

Copy und Paste mit Offset in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Initialisiere die Variablen: Stelle sicher, dass alle Variablen korrekt deklariert sind. Verwende Option Explicit am Anfang deines Codes, um sicherzustellen, dass jede Variable deklariert ist.

    Option Explicit
    Dim k As Integer
  2. Definiere den Bereich: Setze den Bereich, aus dem du die Daten kopieren möchtest.

    Set Bereich = Sheets(k).Range("A5:D18000")
  3. Schleife durch die Zellen: Verwende eine Schleife, um durch alle leeren Zellen im definierten Bereich zu iterieren.

    For Each Zelle In Bereich.SpecialCells(xlCellTypeBlanks)
  4. Kopiere die Daten: Nutze Cells.Offset, um die Daten aus dem Quellblatt (z.B. "RVO") zu kopieren und in das Zielblatt einzufügen. Achte darauf, dass die Destination korrekt gesetzt ist.

    Sheets("RVO").Range(Cells(Zeile, 10), Cells(Zeile, 62 - x)).Copy Destination:=Sheets(k).Cells(y, 5 + aa)
  5. Aktualisiere die Zielzellen: Setze die Werte in den Zielzellen entsprechend deiner Anforderungen, z.B. um einen Offset zu verwalten.

    Sheets(k).Cells(y, 1).Value = Sheets(k).Cells(y - 1, 1).Value
  6. Testen: Führe den Code aus und überprüfe, ob die Daten wie gewünscht kopiert und eingefügt werden.


Häufige Fehler und Lösungen

  • Variable "k" nicht deklariert: Stelle sicher, dass die Variable "k" vor ihrer Verwendung deklariert wird, um Laufzeitfehler zu vermeiden.

  • Fehler beim Kopieren: Wenn das Kopieren nicht funktioniert, überprüfe den Zielbereich und die Verwendung von Sheets(k). Es sollte immer sichergestellt werden, dass k einen gültigen Wert hat.

  • Offset-Problematik: Wenn die Daten nicht an den richtigen Stellen eingefügt werden, überprüfe die Berechnung des Offsets und stelle sicher, dass die Zielzelle korrekt adressiert wird.


Alternative Methoden

  • VBA Copy Destination: Nutze die Copy Destination-Methode, um das Kopieren und Einfügen in einem Schritt durchzuführen, was den Code effizienter macht:

    Sheets("RVO").Range("A1:A10").Copy Destination:=Sheets(k).Range("B1")
  • Arrays verwenden: Du kannst die Daten auch in ein Array laden und anschließend in das Zielblatt schreiben, was die Performance bei großen Datenmengen steigern kann.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du die Cells.Offset-Methode verwenden kannst:

Sub BeispielOffset()
    Dim i As Integer
    For i = 1 To 10
        Sheets("Zielblatt").Cells(i, 1).Value = Sheets("Quellblatt").Cells(i, 1).Offset(0, 1).Value
    Next i
End Sub

In diesem Beispiel wird der Wert der Zelle rechts von jeder Zelle im Quellblatt in das Zielblatt übertragen.


Tipps für Profis

  • Debugging: Nutze Debug.Print, um den Wert von Variablen zu überprüfen, während dein Code läuft, um Fehler schneller zu identifizieren.

  • Verwende die Option Explicit: Dies zwingt dich, alle Variablen zu deklarieren, was die Lesbarkeit und Wartbarkeit deines Codes erhöht.

  • Optimierung: Aktiviere und deaktiviere Application.ScreenUpdating, um die Ausführungsgeschwindigkeit deines Codes zu erhöhen:

    Application.ScreenUpdating = False
    ' Dein Code hier
    Application.ScreenUpdating = True

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Copy und Copy Destination?
Copy kopiert die Daten in die Zwischenablage, während Copy Destination die Daten direkt in die angegebene Zielzelle kopiert, was schneller ist.

2. Wie kann ich sicherstellen, dass ich alle leeren Zellen im Bereich erfasse?
Verwende die Methode SpecialCells(xlCellTypeBlanks), um gezielt leere Zellen zu erfassen.

3. Was mache ich, wenn mein Code nicht funktioniert?
Überprüfe alle Variablen und stelle sicher, dass alle Arbeitsblätter und Bereiche existieren. Nutze Debug.Print, um den Fluss deines Codes zu verfolgen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige