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 ;-)
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?
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 ;-)
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.
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 ;-)
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
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:
- 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:
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:
Sodele, das war mein Senf zum Thema. Hoffentlich war es die Tipperei wert. :-)
Gruss
El Bobbele
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 ;-)
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
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!!!
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.
Greetings ;-)
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.
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
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
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