Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

PasteSpecial funktioniert nicht

Forumthread: PasteSpecial funktioniert nicht

PasteSpecial funktioniert nicht
Chritian
Ich habe ein altes Makro, welches "FileSearch" enthielt erfolgreich an Excel 2007 angepasst.
Leider hat das Makro einen kleinen Schönheitsfehler: Von den Werten, welche aus den externen Excel-Dateien in die eigene Tabelle kopiert werden, kann keine Summe gebildet werden.
Das Problem lässt sich lösen, wenn statt einem gewöhnlichen Paste ein PasteSpecial Paste:=xlPasteValues verwendet wird.
Offenbar kann ich aber nicht die Worksheet.PasteSpecial-Methode verwenden, sondern muss auf die Range.PasteSpecial-Methode ausweichen.
Ich habe alles mögliche versucht und das Script verschiedentlich angepasst, aber habe es einfach nicht hingekriegt. Ein Problem scheint zu sein, dass beim Wechsel von einer Datei zur anderen, wo einfegügt werden soll, das Clipboard seinen Inhalt verliert... oder so ähnlich.
Hat jemand einen Tipp, wie ich da hinkriegen könnte.

Option Explicit
Option Compare Text
Sub zusammensetzen()
Dim i
Dim myfolder
Dim mytabelle
Dim myrange
Dim mylines
Dim offset
Dim myfilename
Dim fso As Object
Dim fol As Object
Dim fil As Object
'Where you define what to "zusammensetzen"
myfolder = Range("D4")              'Pfad zu den Arbeitsrapporten
mytabelle = Range("D6")             'Name der zu bearbeitenden Tabelle
myrange = Range("D9")               'Bereich in der Tabelle, welcher kopiert werden soll ( _
Feldwert(e)):
mylines = Range(myrange).Rows.Count 'zum Berechnen der Zeile zum nächsten Einfügen
offset = Range("D11")               'Position, bei welcher mit Einfügen begonnen werden soll
i = 0
Set fso = CreateObject("Scripting.FileSystemObject")
Set fol = fso.GetFolder(myfolder)
For Each fil In fol.Files
i = i + 1
Workbooks.Open Filename:=fil
myfilename = Right(fil, Len(fil) - Len(myfolder))
Sheets(mytabelle).Activate
Range(myrange).Copy
ActiveWorkbook.Close False
ActiveSheet.Paste Destination:=Worksheets("Auswertung").Range(offset).offset(i * mylines -  _
mylines, 1)
Worksheets("Auswertung").Range(offset).offset(i * mylines - mylines).Value = myfilename
Next fil

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: PasteSpecial funktioniert nicht
22.11.2009 18:43:37
Daniel
Hi
es kann durchaus sein, daß Excel beim Schließen der Datei seine interne Zwischenablage löscht.
Daraus folgt, daß du die Daten erst einfügen musst, bevor du die Quelldatei schließt.
Dh. .PASTE (bzw .PASTESPECIAL) muss vor ActiveWorkbook.Close erfolgen.
allerdings musst du dann bei .PASTE vollständig referenzieren, da Workbook und Sheet mit angeben.
Gruß, Daniel
Anzeige
AW: PasteSpecial funktioniert nicht
22.11.2009 19:40:04
Chritian
Danke für den enorm schnellen Hinweis!
Wie kann ich den auf die Arbeitsmappe in welcher das Makro enthalten ist zugreifen?

DieseArbeitsmappe.Worksheets("Auswertung").Range(offset).offset(i * mylines - mylines, 1). _
PasteSpecial Paste:=xlPasteValues

funktioniert nicht.
Mit ActiveWorkbook.Close False dachte ich, sollte verhindert werden, dass die Zwischeablage geleert wird, aber offenbar funktioniert das nicht. Es genügt das Arbeitsmappe zu wechseln, um die Daten zu verlieren.
Falls es wirklich das wäre. Tatsächlich kann ich aber nach der Fehlermeldung auf die Arbeitsmappe wechseln eine Position selektieren und mit Ctrl (Strg) + V den aktuellen und richtigen Inhalt vom Clipboard einfügen.
Anzeige
AW: ThisWorkbook
22.11.2009 21:18:27
Daniel
referenziert die Arbeitsmappe, in der der Code steht.
Gruß, Daniel
AW: ThisWorkbook
22.11.2009 22:39:24
Chritian
Danke!
ActiveWorkbook.Close False macht wohl genau das Gegenteil von dem was ich erwartet habe:
Es schliesst die Aktive Arbeitsmappe
Ich habe den Code hingekriegt.
Nun wäre es noch schön am Schluss direkt die Summe auszugeben.
Das habe ich versucht mit: .FormulaR1C1 = "=SUM(R[-i]C:R[-1]C)
aber dieser Teil des Makros führt nur zu einer Fehlermeldung: Anwendungs- oder objektdefinierter Fehler.
Naja. Ich werde mich vielleicht später noch einmal damit auseinandersetzen. Jetzt ist Zeit zum Schlafen.
Hier noch der funktionierende Code (ausser den letzten 3 Zeilen):
Hinweise, wie ich die Summe hinkriegen kann oder über anderweitige Verbesserungen nehme ich dankbar entgegen.

Option Explicit
Option Compare Text
Sub zusammensetzen()
Dim i
Dim myfolder
Dim mytabelle
Dim myrange
Dim mylines
Dim offset
Dim myfilename
Dim fso As Object
Dim fol As Object
Dim fil As Object
'Where you define what to "zusammensetzen"
myfolder = Range("D4")              'Pfad zu den Arbeitsrapporten
mytabelle = Range("D6")             'Name der zu bearbeitenden Tabelle
myrange = Range("D9")               'Bereich in der Tabelle, welcher kopiert werden soll ( _
Feldwert(e)):
mylines = Range(myrange).Rows.Count 'zum Berechnen der Zeile zum nächsten Einfügen
offset = Range("D11")               'Position, bei welcher mit Einfügen begonnen werden soll
i = 0
Set fso = CreateObject("Scripting.FileSystemObject")
Set fol = fso.GetFolder(myfolder)
For Each fil In fol.Files
i = i + 1
Workbooks.Open Filename:=fil
myfilename = Right(fil, Len(fil) - Len(myfolder))
Sheets(mytabelle).Activate
Range(myrange).Copy
ThisWorkbook.Worksheets("Auswertung").Range(offset).offset(rowOffset:=(i * mylines -  _
mylines), columnOffset:=1).PasteSpecial Paste:=xlPasteValues
ThisWorkbook.Worksheets("Auswertung").Range(offset).offset(i * mylines - mylines).Value =  _
myfilename
ActiveWorkbook.Close False
Next fil
ThisWorkbook.Worksheets("Auswertung").Activate
ThisWorkbook.Worksheets("Auswertung").Range(offset).offset(rowOffset:=(i * mylines -  _
mylines + 2), columnOffset:=1).FormulaR1C1 = "=SUM(R[-i]C:R[-1]C)"
End Sub

Anzeige
AW: ThisWorkbook
23.11.2009 00:20:38
Daniel
HI
1. es ist in der Regel keine gute Idee, einer Variablen den die gleiche Benennung zu geben wie einer VBA-Funktion (hier "offset")
2. wenn man den Wert einer Variablen in einen String einfügen will, dann muss man das so machen
Dim i as long
dim txt as string
i = 100
txt = "Hier soll jetzt der Wert der Variablen i stehen: " & i & " dh die Zahl einhundert"

dies hätte als Ergebnis Hier soll jetzt der Wert der Variablen i stehen: 100 dh die Zahl _
einhundert

dieser Code

Dim i as long
dim txt as string
i = 100
txt = "Hier soll jetzt der Wert der Variablen i stehen:  i  dh die Zahl einhundert"

hätte als Ergebnis: Hier soll jetzt der Wert der Variablen i stehen: i dh die Zahl einhundert
ich hoffe es ist klar, das die Formel mit dem i nicht funktioniert, sondern nur mit dem Zahlenwert der Variablen i
Gruß, Daniel
Anzeige
AW: ThisWorkbook
23.11.2009 10:31:59
Christian
Danke Daniel
zu 1) Du hast vollkommen Recht. Keine Ahnung wie ich auf diesen Namen kam, der ist noch nicht einmal besonders selbsterklärend. Habe ihn geändert.
zu 2.)
Super und einleuchtend.
Ich habe einen String schon versucht mit "." zusammenzusetzen, aber das war PHP Code und nicht VBA.
Nun funktionierts. Cool!
Danke vielmals für dein Antworten. Das hat mir sehr geholfen.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

PasteSpecial in Excel VBA: So funktioniert's richtig


Schritt-für-Schritt-Anleitung

Um die PasteSpecial-Methode in Excel VBA korrekt anzuwenden, folge diesen Schritten:

  1. Daten kopieren: Nutze Range.Copy, um die gewünschten Daten in die Zwischenablage zu kopieren.

    Range("A1:A10").Copy
  2. Daten einfügen: Verwende die PasteSpecial-Methode, um die Daten als Werte einzufügen.

    Range("B1").PasteSpecial Paste:=xlPasteValues
  3. Zwischenablage leeren (optional): Du kannst die Zwischenablage leeren, um Speicher zu sparen.

    Application.CutCopyMode = False
  4. Korrekte Verwendung in einer Schleife: Stelle sicher, dass du die PasteSpecial-Methode vor dem Schließen der Quelldatei aufrufst.

    ActiveWorkbook.Close False

Häufige Fehler und Lösungen

  • Fehler: Excel copy paste funktioniert nicht
    Ursache: Die Zwischenablage könnte durch das Schließen der Datei geleert werden. Lösung: Füge die Daten vor dem Schließen der Quelldatei ein.

  • Fehler: Anwendungs- oder objektdefinierter Fehler
    Ursache: Falsche Referenzierung der Arbeitsmappe oder des Arbeitsblatts. Lösung: Verwende ThisWorkbook für die Arbeitsmappe, in der das Makro enthalten ist.


Alternative Methoden

Wenn die PasteSpecial-Methode nicht funktioniert, kannst du alternative Ansätze ausprobieren:

  • Direktes Zuweisen von Werten: Anstatt die Zwischenablage zu verwenden, kannst du die Werte direkt zuweisen.

    Worksheets("Zielblatt").Range("B1").Value = Worksheets("Quellblatt").Range("A1").Value
  • Copy und Paste ohne Zwischenablage:

    Worksheets("Quellblatt").Range("A1:A10").Copy Destination:=Worksheets("Zielblatt").Range("B1")

Praktische Beispiele

Hier ist ein Beispiel, wie du mit PasteSpecial die Werte von einer Tabelle in eine andere überträgst:

Sub BeispielPasteSpecial()
    Dim myfolder As String
    Dim myfile As String
    Dim ws As Worksheet

    myfolder = "C:\DeinPfad\"
    myfile = "Daten.xlsx"

    ' Arbeitsmappe öffnen
    Workbooks.Open Filename:=myfolder & myfile

    ' Daten kopieren
    ActiveSheet.Range("A1:A10").Copy

    ' Werte einfügen
    ThisWorkbook.Worksheets("Zielblatt").Range("B1").PasteSpecial Paste:=xlPasteValues

    ' Arbeitsmappe schließen
    ActiveWorkbook.Close False
End Sub

Tipps für Profis

  • Verwende xlPasteValues: Um sicherzustellen, dass nur die Werte und nicht die Formate eingefügt werden, benutze immer Paste:=xlPasteValues.

  • Vermeide die Verwendung von ActiveWorkbook: Referenziere spezifische Arbeitsmappen oder Blätter, um Fehler zu vermeiden.

  • Debugging: Nutze Debug.Print oder MsgBox, um den Status deiner Variablen während der Ausführung zu überwachen.


FAQ: Häufige Fragen

1. Wie kann ich die PasteSpecial-Methode in einer Schleife verwenden?
Du kannst die PasteSpecial-Methode innerhalb einer Schleife aufrufen, um Daten aus mehreren Dateien zu verarbeiten, wie im oben genannten Beispiel.

2. Was ist der Unterschied zwischen Paste und PasteSpecial?
Paste fügt die Daten genau so ein, wie sie in der Zwischenablage sind, während PasteSpecial dir erlaubt, spezifische Aspekte wie nur Werte, Formate oder Formeln auszuwählen.

3. Wie kann ich Fehler beim Einfügen von Werten beheben?
Überprüfe deine Referenzen auf die Arbeitsblätter und stelle sicher, dass die Quelldatei geöffnet ist und die Daten in der Zwischenablage sind, bevor du sie einfügst.

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