Microsoft Excel

Herbers Excel/VBA-Archiv

Copieren mit Range funktioniert nicht


Betrifft: Copieren mit Range funktioniert nicht
von: Oliver
Geschrieben am: 18.12.2018 15:02:14

Hallo liebes Forum,

ich habe mal wieder ein Problem.
Ich möchte gerne aus einer geöffneten Arbeitsmappe einen bestimmten Bereich in eine andere Arbeitsmappe kopieren.

Dazu habe ich folgenden Code: (Das ist nur der Ausschnitt einer I-Schleife, da ich das ganze für viele Workbooks mache.


Workbooks(Projectfile(n)).Sheets(ProjectTab).Range(Cells(5, 35), Cells(10, 35)).Copy
Workbooks(Targetfile).Sheets(TargetfileTab).Range(Cells(5, 35), Cells(10, 35)).PasteSpecial  _
xlPasteValues

Ich möchte das gerne mit der Range machen, da ich später die Spalte im "TargetTab" suchen möchte - soll "rechts neben die letzte gefüllte Spalte" gepasted werden.

Als Fehler gibt er mir nur ein

" Anwendungs- oder objetdefinierter Fehler "

Wäre für Hilfe sehr dankbar. Ich hoffe die Infos reichen.
Danke
Oliver

  

Betrifft: Kopieren mit Range
von: Beverly
Geschrieben am: 18.12.2018 15:10:59

Hi Oliver,

da der zu kopierende Bereich fix ist, sollte es so korrekt sein: (ungetestet)

Workbooks(Projectfile(n)).Sheets(ProjectTab).Range("AI5:AI10").Copy
Workbooks(Targetfile).Sheets(TargetfileTab).Range("AI5").PasteSpecial _
    xlPasteValues

GrußformelBeverly's Excel - Inn


  

Betrifft: AW: Kopieren mit Range
von: Oliver
Geschrieben am: 18.12.2018 15:19:08

Hallo Beverly,

danke dir für die schnelle Antwort.
So hatte ich das auch schon Aber:
Wie würde ich in diesem Fall die letzte beschrieben Spalte kommen?


Ich habe eine die letzte Spalte eben nur als Zahl:

leereSpalte = Workbooks(Targetfile).Sheets(TargetfileTab).Cells(10, Columns.Count).End(xlToLeft).Column
Ich dachte eben, ich könnte das dann so machen:
….Workbooks(Targetfile).Sheets(TargetfileTab).Range(Cells(5, leereSpalte).PasteSpecial  _
xlPasteValues
Hast du da vielleicht noch einen Tipp?

Vielen Dank
Oli


  

Betrifft: AW: Kopieren mit Range
von: Oliver
Geschrieben am: 18.12.2018 15:24:20

Hallo nochmal!
Nun klappt es!

Danke dir Beverly du hast mich auf den richtigen Pfad gebracht!!

Ich hab es jetzt so gebaut und es funktioniert:

leereSpalte = Workbooks(Targetfile).Sheets(TargetfileTab).Cells(10, Columns.Count).End(xlToLeft) _
.Column + 1


Workbooks(Projectfile(n)).Sheets(ProjectTab).Range("AI5:AI10").Copy
Workbooks(Targetfile).Sheets(TargetfileTab).Cells(5, leereSpalte).PasteSpecial xlPasteValues


So klappt das bestens.
Ich danke vielmals!!

Viele Grüße
Oliver


  

Betrifft: AW: Kopieren mit Range
von: Beverly
Geschrieben am: 18.12.2018 15:26:22

Hi Oliver,

weshalb .Range(Cells(5, letzteSpalte))? Entweder .Range("AI5") wenn die Zieladresse fix ist oder einfach .Cells(5, letzteSpalte) wenn sie variabel sein soll. Beim Einfügen reicht es, nur die Adresse der ersten Zelle des Zielbereichs anzugeben (im Gegensatz zum Kopieren).


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: Copieren mit Range funktioniert nicht
von: Christoph
Geschrieben am: 18.12.2018 15:33:32

Moin Oliver,

darüber habe ich mir auch schon des öfteren den Kopf zerbrochen.^^

Ich meine es liegt daran, dass du auch die Cells in Range noch einem Ort zuordnen musst. Also statt:

Range(Cells(5, 35), Cells(10, 35))

besser (Achtung, so liest es sich noch sehr blöd)
Workbooks(Projectfile(n)).Sheets(ProjectTab).Range(Workbooks(Projectfile(n)).Sheets(ProjectTab).Cells(5, 35), Workbooks(Projectfile(n)).Sheets(ProjectTab).Cells(10, 35))

Wenn du den Blätter mit denen du arbeitest einfach ein Kürzel gibts, dann geht das auch immer recht schnell.

Etwa
dim wsPf as Worksheet
dim wsTf as Worksheet
Set wsPF = Sheets(ProjectTab)
Set wsTf = Sheets(TargetfileTab)

dann kannste entsprechend:

wsPF.Range(wsPF.Cells(5, 35), wsPF.Cells(10, 35))

schreiben. Das Workbook wird (soweit ich weiß) automatisch mit-hinterlegt, wenn du ein Worksheet so definierst. Musste also nicht noch extra davorschreiben.

Bin selbst noch relativer Anfänger, aber ich denke das sollte dein Problem beheben.

Grüße Christoph


  

Betrifft: AW: Copieren mit Range funktioniert nicht
von: Daniel
Geschrieben am: 18.12.2018 15:48:01

Hi
wenn du eine Range mit (Cells(), Cells()) beschreibst, muss die Definition von Workbook und Worksheet vor den beiden Cells innerhalb von Range() stehen und nicht nur vor der Range.
Vor der Range kann es sogar entfallen, außer der Code steht in einem Tabellenblattmodul, dann muss diese Angabe vor Range und vor den beiden Cells stehen !

daher sollte man das Konstrukt Range(Cells(), Cells()) vermeiden, wenn man mit mehreren Workbooks und Worksheets arbeitet, da die Ausdrücke sonst sehr lang werden, wenn "Workbooks(Projectfile(n)).Sheets(ProjectTab)." 3x in der Programmzeile aufgeführt werden muss

hierzu wurden ja schon Ansätze gezeigt:
- bei .PasteSpecial reicht es aus, die linke obere Zelle anzugeben, so dass folgendes ausreicht:

Workbooks(Targetfile).Sheets(TargetfileTab).Cells(5, 35).PasteSpecial xlpasteall
- musst du einen größeren Zellbereich angeben, dann besser wie gezeigt bei fixer größer über Range(Adressstring) oder mit Resize:
Workbooks(Projectfile(n)).Sheets(ProjectTab).Cells(5, 35).Resize(6, 1).Copy
möchte man bei Range(Cells, Cells) bleiben, kann man mit der WITH-Klammer arbeiten.
in der WITH-Klammer definiert man ein Objekt in der Kopfzeile, wenn man dieses Objekt verwenden will, stellt man einfach den Punkt an den Anfang
With Workbooks(Projectfile(n)).Sheets(ProjectTab)
    .Range(.Cells(5, 35), .Cells(10, 35)).Copy
    Workbooks(Targetfile).Sheets(TargetfileTab).Cells(5, 35).PasteSpecial xlPasteValues
End with
oder man arbeitet mit Variablen, um den Code übersichtlich zu halten:
dim shQuelle as Worksheet
dim shZiel as worksheet
set shQuelle = Workbooks(Projectfile(n)).Sheets(ProjectTab)
set shZiel = Workbooks(Targetfile).Sheets(TargetfileTab)
Range(shQuelle.Cells(5, 35), shQuelle.Cells(10, 35)).Copy
shZiel.Cells(5, 35).PasteSpecial xlpastevalues
Gruß Daniel