Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Abfrage mit VBA-Funktion und langem Text (>256) nach Excel exportieren

1,120 views
Skip to first unread message

Konrad Hammerer

unread,
Jun 8, 2010, 3:09:57 AM6/8/10
to
Hallo,

ich habe folgendes Problem:

Ich habe eine Abfrage, innerhalb der eine Spalte von einer VBA-Abfrage
gefüllt wird, die einen sehr langen Text als String zurück liefert. Kann
durchaus auch mal größer als 256 Zeichen sein. Wenn ich diese Abfrage in
Access öffne, dann wird der Inhalt vollständig angezeigt, wenn ich sie
allerdings nach Excel exportiere, dann wird der Inhalt bei 256 Zeichen
abgeschnitten. Das liegt wohl daran, dass der Datentyp der dynamischen
VBA-Spalte "Text" und nicht Memo ist. Wenn ich die Abfrage in eine
Tabelle zwischenspeichere, bei der für diese Spalte eben Memo
eingestellt ist und diese Tabelle dann nach Excel exportiere, dann geht es.

Gibt es dafür eine elegantere Lösung als über eine extra Tabelle zu
gehen, nur um die Daten nach Excel zu bekommen?

Vielen Dank und viele Grüße,
Konrad

Lutz Uhlmann

unread,
Jun 8, 2010, 5:21:04 AM6/8/10
to

Wie exportierst du denn die Abfrage?
Nutzt du DoCmd.TransferSpreadsheet? Wenn nicht probier es mal. Achte
auch drauf, daß du die Version nimmst (acSpreadsheetTypeExcel9). Excel
5.0/95 beschneidet glaub ich auf 255 zeichen.

Ansonsten teste mal .TransferText mit der passenden Export-Spezifikation
kannst du dir ja auch ne .csv ausgeben lassen und die in Excel verwenden.

Ansonsten würde ich mal probieren die Spalte als Variant zu casten,
vielleicht hilft das.
Die letzte Lösung könnte sein, für die Abfrage das Feld in 255er Spalten
zu splitten.

Kannst dier mal auch noch folgende Seiten reinzihen. Da scheint man sich
schonmal damit beschäftigt zu haben:
http://allenbrowne.com/ser-63.html
http://support.microsoft.com/kb/294286/de

Lutz

Karl Donaubauer

unread,
Jun 8, 2010, 12:17:18 PM6/8/10
to

Kontrolliere mal, wieviel Text deine Abfrage enthält.
Wenn dort schon nur 255 Zeichen zu sehen sind, dann lies:
www.donkarl.com?FAQ5.18

Wenn nicht, solltest du die Export-Methode nennen,
wie schon von Lutz angefordert, und die Access-Version.

--
Servus
Karl
****************
Access-FAQ: http://www.donkarl.com


Konrad Hammerer

unread,
Jun 11, 2010, 7:48:09 AM6/11/10
to
Hallo!

Hier nochmal mehr Eckdaten meines Systems:

Windows XP SP3
Access 2003 mit Datenbankformat 2000 (auch 2002-2003 bringt keine ᅵnderung)
Exportiertes Excel-Format: 97-2003

Mein Problem tritt bei jeder Exportmethode auf und es kann ganz einfach
nachvollzogen werden:

1)
Man erstellt eine VBA-Funktion wie diese hier:

Public Function test1() As String
test1 =
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789asdfghjklᅵᅵ"
End Function

2)
Man erstellt eine Abfrage fᅵr eine Tabelle wie diese hier:

SELECT Tabelle1.*, test1() AS Ausdr1
FROM Tabelle1;


Wenn man diese Abfrage ᅵffnet, dann wird der ganze String angezeigt.
Aber exportieren lassen sich eben nur 256 Zeichen davon.

Bin fᅵr jeden Tipp dankbar!

Grᅵᅵe,
Konrad


Am 08.06.2010 18:17, schrieb Karl Donaubauer:
> Konrad Hammerer wrote:
>> Ich habe eine Abfrage, innerhalb der eine Spalte von einer VBA-Abfrage

>> gefᅵllt wird, die einen sehr langen Text als String zurᅵck liefert.
>> Kann durchaus auch mal grᅵᅵer als 256 Zeichen sein. Wenn ich diese
>> Abfrage in Access ᅵffne, dann wird der Inhalt vollstᅵndig angezeigt,


>> wenn ich sie allerdings nach Excel exportiere, dann wird der Inhalt
>> bei 256 Zeichen abgeschnitten. Das liegt wohl daran, dass der
>> Datentyp der dynamischen VBA-Spalte "Text" und nicht Memo ist. Wenn

>> ich die Abfrage in eine Tabelle zwischenspeichere, bei der fᅵr diese


>> Spalte eben Memo
>> eingestellt ist und diese Tabelle dann nach Excel exportiere, dann
>> geht es.

>> Gibt es dafᅵr eine elegantere Lᅵsung als ᅵber eine extra Tabelle zu


>> gehen, nur um die Daten nach Excel zu bekommen?
>

> Kontrolliere mal, wieviel Text deine Abfrage enthᅵlt.

Konrad Hammerer

unread,
Jun 11, 2010, 7:49:39 AM6/11/10
to
Danke für deine Antwort. Siehe anderes Posting...

Grüße,
Konrad

Josef Poetzl

unread,
Jun 11, 2010, 8:44:22 AM6/11/10
to
Hallo!

Konrad Hammerer schrieb:


> Mein Problem tritt bei jeder Exportmethode auf

Auch bei Excel-Automation mit CopyFromRecordset?

BTW: ich probierte unter Ac2010 die Export-Methoden über die
Access-Oberfläche aus: dabei wurde sogar beim Export der Tabelle bei
255 Zeichen abgeschnitten.

mfg
Josef

Konrad Hammerer

unread,
Jun 11, 2010, 2:53:19 PM6/11/10
to
> Auch bei Excel-Automation mit CopyFromRecordset?

was verbirgt sich denn dahinter?

> BTW: ich probierte unter Ac2010 die Export-Methoden über die
> Access-Oberfläche aus: dabei wurde sogar beim Export der Tabelle bei
> 255 Zeichen abgeschnitten.

Wenn ich bei einer Tabelle auf die rechte Maustaste klicke und dann
"Exportieren" auswähle, dann geht es bei mir wunderbar. Nur bei besagter
Abfrage nicht :-(

Viele Grüße,
Konrad

>
> mfg
> Josef

Josef Poetzl

unread,
Jun 11, 2010, 3:08:31 PM6/11/10
to
Hallo!

Konrad Hammerer schrieb:


>> Auch bei Excel-Automation mit CopyFromRecordset?
>
> was verbirgt sich denn dahinter?

CopyFromRecordset ist eine Methode von der Excel-Bibliothek.
Nachteil dieser Variante: du musst Excel installiert haben.


Test-Code:

' Excel öffnen:
Dim excelApp As Excel.Application

Set excelApp = New Excel.Application
excelApp.visible = True

' Eine neue Excel-Datei erzeugen:
Dim excelBook As Excel.Workbook
Set excelBook = excelApp.Workbooks.Add

'Auf das 1. Tabellenblatt verweisen:
Dim excelSheet As Excel.Worksheet
Set excelSheet = excelBook.Worksheets(1)

'Die Abfrage in einem Recordset öffnen:
Dim rstDAO As DAO.Recordset
set rstDAO = currentdb.Openrecordset("DeineAbfrage")

'und nun exportieren:
excelSheet.Range("A1").CopyFromRecordset rstDAO


Anm.: Der Export mit dem DAO-Recordset erzeugte bei mir nach den
ersten 255 Zeichen ein paar "chinesische Zeichen".

=> mit einem ADODB-Recordset hat es dann wie gewünscht funktioniert.
Set rstAdo = New ADODB.Recordset
rstAdo.Open "select * from DeineAbfrage", CurrentProject.Connection
excelSheet.Range("A1").CopyFromRecordset rstAdo

Der obige Code benötigt einen Verweis auf Excel, falls du später ohne
diesen Verweis arbeiten willst, kannst du auf Late binding umstellen.

Dim excelApp As Object
Set excelApp = CreateObject("Excel.Application")
...
Dim excelBook As Object
... usw.


mfg
Josef

Konrad Hammerer

unread,
Jun 14, 2010, 4:15:33 AM6/14/10
to
Danke für die ausführlichen Antwort. Werde das testen und dann Bescheid
geben...

Grüße,
Konrad

Karl Donaubauer

unread,
Jun 16, 2010, 4:54:39 PM6/16/10
to
Konrad Hammerer wrote:
> Hier nochmal mehr Eckdaten meines Systems:
>
> Windows XP SP3
> Access 2003 mit Datenbankformat 2000 (auch 2002-2003 bringt keine
> Änderung) Exportiertes Excel-Format: 97-2003

>
> Mein Problem tritt bei jeder Exportmethode auf und es kann ganz
> einfach nachvollzogen werden:
>
> 1)
> Man erstellt eine VBA-Funktion wie diese hier:
>
> Public Function test1() As String
> test1 =
> "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789asdfghjklöä"
> End Function
>
> 2)
> Man erstellt eine Abfrage für eine Tabelle wie diese hier:

>
> SELECT Tabelle1.*, test1() AS Ausdr1
> FROM Tabelle1;
>
>
> Wenn man diese Abfrage öffnet, dann wird der ganze String angezeigt.

> Aber exportieren lassen sich eben nur 256 Zeichen davon.
>
> Bin für jeden Tipp dankbar!
> ...

Das mit dem Rückgabewert einer Funktion ist halt ein
Spezialfall, bei dem Access auf Textlänge "optimiert".
Mit einem Memofeld in einer Tabelle sollte das nicht passieren.

Falls du den String per Code erzeugen musst, kannst du ihn nicht
vor dem Export in Tabelle1 schreiben oder notfalls in eine
Dummytabelle, die du in die Abfrage reinnimmst?

--
Servus
Karl
****************
http://www.donkarl.com Access-FAQ
http://www.donkarl.com/?aek 13. Access-Entwickler-Konferenz
25./26.09.2010 in Nürnberg, 16./17.10.2010 in Hannover

Konrad Hammerer

unread,
Jun 18, 2010, 8:35:19 AM6/18/10
to
Hallo!

> Das mit dem Rückgabewert einer Funktion ist halt ein
> Spezialfall, bei dem Access auf Textlänge "optimiert".
> Mit einem Memofeld in einer Tabelle sollte das nicht passieren.
>
> Falls du den String per Code erzeugen musst, kannst du ihn nicht
> vor dem Export in Tabelle1 schreiben oder notfalls in eine
> Dummytabelle, die du in die Abfrage reinnimmst?

Wie sollte das denn gehen?

Ich habe die VBA-Funkion innerhalb meiner Abfrage und diese bekommt die
ID des aktuellen Datensatzes übergeben und liefert aufgrund dieser ID
den langen Wert zurück. Wie könnte ich diesen denn in eine Tabelle mit
Memofeld zwischenspeichern und dann ID bezogen wieder in die eigentliche
Abfrage einbinden?

Danke,
Konrad

Karl Donaubauer

unread,
Jun 18, 2010, 9:04:12 AM6/18/10
to
Konrad Hammerer wrote:
>> Das mit dem R�ckgabewert einer Funktion ist halt ein
>> Spezialfall, bei dem Access auf Textl�nge "optimiert".

>> Mit einem Memofeld in einer Tabelle sollte das nicht passieren.
>>
>> Falls du den String per Code erzeugen musst, kannst du ihn nicht
>> vor dem Export in Tabelle1 schreiben oder notfalls in eine
>> Dummytabelle, die du in die Abfrage reinnimmst?
> ...

> Ich habe die VBA-Funkion innerhalb meiner Abfrage und diese bekommt
> die ID des aktuellen Datensatzes �bergeben und liefert aufgrund
> dieser ID den langen Wert zur�ck. Wie k�nnte ich diesen denn in eine

> Tabelle mit Memofeld zwischenspeichern und dann ID bezogen wieder
> in die eigentliche Abfrage einbinden?

Wie geschrieben: "vor dem Export" d.h. vor der Abfrage

F�hre den Code vorher separat aus (Recordset etc.) und schreibe
die Texte in die Tabelle oder in eine Hilfstabelle nur mit ID und Memo.

Danach erst f�hrst du die Abfrage aus.

--
Servus
Karl
****************
http://www.donkarl.com Access-FAQ
http://www.donkarl.com/?aek 13. Access-Entwickler-Konferenz

25./26.09.2010 in N�rnberg, 16./17.10.2010 in Hannover


Konrad Hammerer

unread,
Jun 18, 2010, 10:06:18 AM6/18/10
to
Jetzt weiᅵ ich, was du meinst! Ja, dass wᅵre auch eine Idee, man muss
halt immer dran denken, erst die eine Abfrage laufen zu lassen, die die
Tabelle befᅵllt, bevor man die eigentliche Abfrage laufen lᅵsst, die
dann die Memowerte aus der Tabelle entnehmen kann.

Danke,
Konrad

> Fᅵhre den Code vorher separat aus (Recordset etc.) und schreibe


> die Texte in die Tabelle oder in eine Hilfstabelle nur mit ID und Memo.
>

> Danach erst fᅵhrst du die Abfrage aus.
>

0 new messages