Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

PasteSpecial





Frage

Hi, ich versuche von access aus eine excel datei zu bearbeiten. hierfür möchte ich die pasteSpecial-methode verwenden, diese funktioniert jedoch nicht. kann mir jemand sagen, woran das liegt? hier mein code: '// Zugriff auf Excel-Instanz On Error Resume Next Set AppXL = GetObject(, "Excel.Application") If Err.Number = 429 Then Set AppXL = CreateObject("Excel.Application") End If On Error GoTo 0 '// Arbeitsmappe oeffnen Datei = InputBox$("Geben Sie den Dateinamen an, aus der sie die Standby Werte auslesen wollen!", "Standbytabelle") Set WkbXL = AppXL.Workbooks.Open(Datei, Hide, False) Set WksXL = WkbXL.Sheets(1) 'AppXL.CutCopyMode = False WksXL.Range("A13:B175").Copy WksXL.Range("C13").PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True WkbXL.Save WkbXL.Close Set WksXL = Nothing Set WkbXL = Nothing Set AppXL = Nothing würde mich freuen, wenn mir jemand helfen könnte

Antwort 1 von Coolpix

hi Ecardo,

also ich hab das auch schon ein paarmal gemacht, ich glaube mich zu errinnern, daß es manchmal zu Fehlern kommt, wenn man das Blatt nicht vorher selektiert..
Der Set-Befehl alleine reicht da nicht immer.


Feedback fänd ich Klasse !!!

Greetings ;-)

Antwort 2 von Ecardo

erstmal danke für die antwort.

wenn ich den ausschnitt vorher selektiere, erhalte ich die gleiche fehlermeldung.
Aber wie kann ich denn das arbeitsblatt selektieren?





Antwort 3 von Coolpix

hallo nochmal,

das Blatt selektierst du mit:

sheets(1).select

vielleicht könnte ich dir besser helfen, wenn du mir die DB und das Excel-File mailst.
So aus dem Zusammenhang gerissen lässt sich nur schwer 'ne Diagnose treffen.

Feedback fänd ich Klasse !!!

Greetings ;-)

Antwort 4 von Ecardo

vielen dank für das angebot.
die datenbank ist leider etwas groß (24,7MB) aber ich kann mal eben eine kleine Testdatenbank bauen und sie dir schicken.

Antwort 5 von Coolpix

ok,

vielen Dank für dein Vertrauen !
ich melde mich dann wieder sobald ich was gefunden habe :)


Greetings ;-)

Antwort 6 von Ecardo

super! danke

hoffe, dass die mail angekommen ist

Antwort 7 von El Bobbele

Moin Eckard!

Ich vermute, dass sich bei dir folgendes Szenario abspielt:

- Du verwendest eine späte Bindung der Excel Objekt-Bibliothek:
Set AppXL = CreateObject("Excel.Application")

- Du verwendest in deinem Modul kein "Option Explicit", um Variablendeklarationen zu erzwingen. Siehe die ersten zwei Zeilen ganz oben im Modul:
Falsch:
Option Compare Database

Richtig:
Option Compare Database
Option Explicit


- Du hast die beiden Parameter xlAll und xlNone nicht ausdrücklich als Konstante deklariert.

- Es tritt der Laufzeitfehler "Die PasteSpecial-Methode konnte nicht ausgeführt werden." auf.

Wenn das alles stimmt, dann ist das eine Verkettung ungünstiger Umstände:

Bei einer späten Bibliotheksbindung über GetObject/CreateObject kennt Access gar nichts vom Excel-Objektmodell, d.h. alle Methoden, Eigenschaften und Konstanten sind namentlich unbekannt. Stattdessen verlässt Access sich vielmehr darauf, dass Excel etwas mit den reservierten Namen anfangen kann, wenn sie übergeben werden. Dagegen beherrscht Access bei einer frühen Bindung über den Verweise-Dialog schlagartig das gesamte Objektmodell von Excel, womit Fehler schon bei der Eingabe entlarvt werden können.

In deinem Codeauszug sind keine Variablen deklariert. Wenn du tatsächlich keine Variablen deklariert hast ("Dim MeineVariable As Datentyp"), dann wird erst im Moment der Nutzung jede aufgeführte Objektvariable (AppXL, WksXL usw.) erzeugt. Prinzipiell ist sowas schon lauffähig, aber bei der PasteSpecial-Methode verwendest du Konstanten namens xlAll und xlNone und das ist bei der hiesigen Konstellation kritisch.

Anstelle der echten Excel-Konstanten erzeugt Access direkt vor der Verwendung zwei Variablen des Datentyps Variant, die natürlich völlig leer sind. Und bei der Übergabe von zwei leeren Variablen an eine Methode, die nur echte Zahlenwerte entgegennimmt, entsteht eben ein Laufzeitfehler.

Falls ich richtig liege, dann gibt es zwei Möglichkeiten:

1. Du deklarierst die nicht erreichbaren Excel-Konstanten selbst in einem Access-Modul:
Public Const xlAll = &HFFFFEFF8
Public Const xlNone = &HFFFFEFD2


2. Statt der späten Bindung verwendest du einen richtigen Verweis auf die Excel-Bibliothek:
Im VBA-Editor Menü Extras, Verweise, "Microsoft Excel x.0 Object Library" aktivieren. Damit steht Access dann sofort alles von Excel zur Verfügung, inkl. der beiden Konstanten.

Die betroffenen Code-Zeilen ändern sich dann wie folgt:
Alte Version:
On Error Resume Next
Set AppXL = GetObject(, "Excel.Application")
If Err.Number = 429 Then
Set AppXL = CreateObject("Excel.Application")
End If
On Error GoTo 0

Neue Version:
Dim AppXL As Excel.Appliation
Set AppXL = New Excel.Appliation


Sodele, das war mein Senf zum Thema. Hoffentlich war es die Tipperei wert. :-)

Gruss
El Bobbele

Antwort 8 von Coolpix

hallo nochmal
bis jetzt is noch nochts angekommen :(


Greetings ;-)

Antwort 9 von Ecardo

@coolpix:
So, hab die mail nochmal verschickt

@El Bobbele:
danke für dein engagement
hab mal ne test datenbank gebaut und alles so gemacht, wie du beschrieben hast (hoffe ich zumindest) dann erhalte ich den fehler: "Typen unverträglich" es wird aber nicht gesagt, an welcher stelle dieser fehler auftritt.
wäre echt nett, wenn du mir nochmal helfen könntest
hier ist der Code:


Option Compare Database
Option Explicit

Private Sub tabelleEinlesen_Click()
On Error GoTo Err_tabelleEinlesen_Click

Dim AppXL As Excel.Application
Dim WkbXL As Excel.Workbook
Dim WksXL As Excel.Sheets
Set AppXL = New Excel.Application
'// Arbeitsmappe oeffnen

Set WkbXL = AppXL.Workbooks.Open("TestXL", False)
Set WksXL = WkbXL.Sheets(1)

AppXL.CutCopyMode = False
WkbXL.Range("A1:B7").Cut
WkbXL.Range("C1").PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
WkbXL.Save
WkbXL.Close
Set WksXL = Nothing
Set WkbXL = Nothing
Set AppXL = Nothing
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "completeStandby", "Test", True
Requery


Exit_tabelleEinlesen_Click:
Exit Sub

Err_tabelleEinlesen_Click:
MsgBox Err.Description
Resume Exit_tabelleEinlesen_Click

End Sub

Antwort 10 von Ecardo

Super! es klappt alles wie ich will!
vielen Dank!!!

Antwort 11 von Coolpix

hallo zammenand,

hier noch der Vollständigkeit halber der geänderte Code, der bei gesetztem Verweis auf die 'Microsoft Excel 10 Object Library'
zum gewünschten Ergebnis führt.



Private Sub tabelleEinlesen_Click()
On Error GoTo Err_tabelleEinlesen_Click
Dim Datei As String

On Error Resume Next
Set AppXL = GetObject(, "Excel.Application")
If Err.Number = 429 Then
    Set AppXL = CreateObject("Excel.Application")
End If

On Error GoTo 0
'// Arbeitsmappe oeffnen
Datei = Application.CurrentProject.Path & "\Test.xls"
Set WkbXL = AppXL.Workbooks.Open(Datei, Hide, False) 'Hab ich etwas abgeändert
Set WksXL = WkbXL.sheets(1)
'AppXL.Visible = True 'Nur zum Testen
AppXL.CutCopyMode = True 'wenn das auf False steht kann man nix Kopieren
WksXL.Range("A1:B7").Copy
WksXL.Range("C1").PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
WkbXL.Save
WkbXL.Close
Set WksXL = Nothing
Set WkbXL = Nothing
Set AppXL = Nothing
DoCmd.TransferSpreadsheet import, acSpreadsheetTypeExcel8, "completeStandby", Datei, True 'Datei = Variable siehe oben
Requery


Exit_tabelleEinlesen_Click:
    Exit Sub

Err_tabelleEinlesen_Click:
    MsgBox Err.Description
    Resume Exit_tabelleEinlesen_Click
    
End Sub




Greetings ;-)

Antwort 12 von El Bobbele

Moin Ecardo!

In deiner Deklaration ist noch ein Fehler enthalten.

Falsch:
Dim AppXL As Excel.Application
Dim WkbXL As Excel.Workbook
Dim WksXL As Excel.Sheets

Richtig:
Dim AppXL As Excel.Application
Dim WkbXL As Excel.Workbook
Dim WksXL As Excel.Worksheet

Die Sheets-Auflistung enthält Worksheet-Objekte, keine Sheets-Objekte. :-)

Ich habe das mal zwischenzeitlich durchgespielt und musste zu meiner Überraschung feststellen, dass die PasteSpecial-Methode nicht funktioniert, wenn man vorher mit Cut ausgeschnitten hat. Nur mit der Copy-Methode haut das hin (siehe Coolpix' Code). Da ich mit der Excel-Programmierung nicht sonderlich vertraut bin, würde es mich schon mal interessieren, wie man etwas ausschneidet um es woanders wieder einzufügen. Oder muss man tatsächlich erst kopieren und dann die Quelle löschen? :-/

Gruss
El Bobbele

Antwort 13 von Armin

@El Bobbele:
danke für die Erklärung weiter oben. Hatte mal ein ähnliches Problem (sah wenigstens laut den fehlermeldungen so aus) und verstehe jetzt warum.

... war also die Tipperei wert.

gruesse armin

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: