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

Semikolon als Trennzeichen beim CSV-Export in VBA

1,786 views
Skip to first unread message

Christoph Schneegans

unread,
Nov 26, 2007, 1:00:54 PM11/26/07
to
Hallo allerseits!

Manuelles Speichern im CSV-Format berücksichtigt meine Einstellung in der
Systemsteuerung bezüglich des Listentrennzeichens,

.SaveAs FileFormat:=Excel.xlCSV

in VBA verwendet hingegen stets ein Komma. Bei Google Groups fand ich viele
ältere Postings zu diesem Thema. Ich verwende hier Excel 2003 - ist das
Problem etwa immer noch nicht gelöst?

--
<http://schneegans.de/usenet/mid-schreibweisen/> · Postings richtig verlinken

Thomas Ramel

unread,
Nov 26, 2007, 1:23:14 PM11/26/07
to
Grüezi Christoph

Christoph Schneegans schrieb am 26.11.2007

> Manuelles Speichern im CSV-Format berücksichtigt meine Einstellung in der
> Systemsteuerung bezüglich des Listentrennzeichens,
>
> .SaveAs FileFormat:=Excel.xlCSV
>
> in VBA verwendet hingegen stets ein Komma. Bei Google Groups fand ich viele
> ältere Postings zu diesem Thema. Ich verwende hier Excel 2003 - ist das
> Problem etwa immer noch nicht gelöst?

Doch - seit xl2002 gibt es den Schalter 'Local:=True', der dann wieder die
lokal eingestellten Trennzeichen berücksichtigt. Näheres in der
Online-Hilfe mit: Cursor in den Begriff 'SaveAs' stellen und F1 drücken.

Excel-VBA 'spricht' ansonsten nur Englisch und nimmt daher auch diese
Trenn- und Dezimalzeichen - IMO logisch, richtig und vor allem auch überall
gleich.


Mit freundlichen Grüssen
Thomas Ramel

--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-2]
Microsoft Excel - Die ExpertenTipps

Christoph Schneegans

unread,
Nov 27, 2007, 4:38:51 AM11/27/07
to
Thomas Ramel schrieb:

> Doch - seit xl2002 gibt es den Schalter 'Local:=True', der dann wieder die
> lokal eingestellten Trennzeichen berücksichtigt.

Hm,

Dim sheet As Excel.Worksheet
Set sheet = Excel.ActiveSheet
sheet.SaveAs Filename:="c:\foo.csv", FileFormat:=Excel.xlCSV, Local:=True

liefert mir weiterhin Kommata als Trennzeichen. Nur

Dim wb As Excel.Workbook
Set wb = Excel.ActiveWorkbook
wb.SaveAs Filename:="c:\foo.csv", FileFormat:=Excel.xlCSV, Local:=True

funktioniert hingegen korrekt mit Semikolon. Seltsam.

--
<http://schneegans.de/usenet/webnews/> · Warum man mit TICKAW nicht posten will

Thomas Ramel

unread,
Nov 27, 2007, 5:56:02 AM11/27/07
to
Grüezi Christoph

"Christoph Schneegans" schrieb:

> > Doch - seit xl2002 gibt es den Schalter 'Local:=True', der dann wieder die
> > lokal eingestellten Trennzeichen berücksichtigt.
>
> Hm,
>
> Dim sheet As Excel.Worksheet
> Set sheet = Excel.ActiveSheet
> sheet.SaveAs Filename:="c:\foo.csv", FileFormat:=Excel.xlCSV, Local:=True
>
> liefert mir weiterhin Kommata als Trennzeichen. Nur
>
> Dim wb As Excel.Workbook
> Set wb = Excel.ActiveWorkbook
> wb.SaveAs Filename:="c:\foo.csv", FileFormat:=Excel.xlCSV, Local:=True
>
> funktioniert hingegen korrekt mit Semikolon. Seltsam.

Interessant!

Auf die Idee, ein Worksheet direkt mit SaveAs zu speichern bin ich noch nie
gekommen. ;-)
Vermutlich deshalb weil eine .CSV-Datei eh nicht mehr als ein 'Blatt' haben
kann.

Kopiere das Sheet zuerst - es wird dann gelich eine neue Mappe erstellt -
und speichere diese Mappe dann als .CSV ab.

Oder nutze ansonsten VBA:

Sub SaveCSV_a()
Dim A As Variant
Dim B() As String
Dim D() As String
Dim Z As Long
Dim s As Byte
Dim r As Long
Dim C As Byte

Const Path As String = "C:\Test\"
Const Filename As String = "Test2"
Const Extension As String = ".CSV"
Const Separator As String = ";"
Const Wrapper As String = """"

'Here you can define your own Range, too
A = ActiveSheet.UsedRange

If Not IsEmpty(A) Then
Z = UBound(A, 1)
s = UBound(A, 2)
ReDim D(Z - 1)
For r = 1 To Z
ReDim B(s - 1)
For C = 1 To s
If InStr(1, A(r, C), Separator) > 0 Then
'Rows whith cells including the Separator
'put in Wrapper
B(C - 1) = Wrapper & A(r, C) & Wrapper
Else
B(C - 1) = A(r, C)
End If
Next C
D(r - 1) = Join(B(), Separator)
Next r
Open Path & Filename & Extension For Output As #1
Print #1, "sep=" & Separator & vbCrLf & Join(D(), vbCrLf)
Close #1
End If
End Sub


--
Mit freundlichen Grüssen

Thomas Ramel (@Web-Interface)


- MVP für Microsoft-Excel -

[Win XP Pro SP-2 / xl2003]

Christoph Schneegans

unread,
Nov 28, 2007, 5:29:07 AM11/28/07
to
Thomas Ramel schrieb:

>> Dim sheet As Excel.Worksheet
>> Set sheet = Excel.ActiveSheet
>> sheet.SaveAs Filename:="c:\foo.csv", FileFormat:=Excel.xlCSV, Local:=True
>>
>> liefert mir weiterhin Kommata als Trennzeichen. Nur
>>
>> Dim wb As Excel.Workbook
>> Set wb = Excel.ActiveWorkbook
>> wb.SaveAs Filename:="c:\foo.csv", FileFormat:=Excel.xlCSV, Local:=True
>>
>> funktioniert hingegen korrekt mit Semikolon. Seltsam.
>

> Kopiere das Sheet zuerst - es wird dann gelich eine neue Mappe erstellt -
> und speichere diese Mappe dann als .CSV ab.

Naja, so geht es auch:

Dim wb As Excel.Workbook
Set wb = xlApp.Workbooks.Open(XLS_PATH, UpdateLinks:=False, ReadOnly:=True)

Dim ws As Excel.Worksheet
Set ws = wb.Worksheets(SHEET_NAME)
ws.Activate

wb.SaveAs Filename:=csvPath, FileFormat:=Excel.xlCSV, Local:=True
wb.Close SaveChanges:=False

Das ist aber nicht besonders stabil. Ich habe mit einem Arbeitsblatt getestet,
das in zwei Zellen jeweils ein Anführungszeichen (U+0022) enthält, also etwa so:

" "

Die exportierte .csv-Datei sieht so aus:

sep=;
";"

Nach dem erneuten Import sehe ich in Excel eine völlig andere Datei:

;

Der Export mit "Speichern unter..." oder wb.SaveAs liefert hingegen:

"""";""""

Und aus dieser CSV-Datei kann Excel dann auch wieder exakt

" "

laden.

--
<http://schneegans.de/web/xhtml/> · Klare Antworten zu XHTML

Thomas Ramel

unread,
Nov 28, 2007, 9:42:01 AM11/28/07
to
Grüezi Christoph


"Christoph Schneegans" schrieb:

> Thomas Ramel schrieb:


> >
> > Kopiere das Sheet zuerst - es wird dann gelich eine neue Mappe erstellt -
> > und speichere diese Mappe dann als .CSV ab.
>
> Naja, so geht es auch:
>
> Dim wb As Excel.Workbook
> Set wb = xlApp.Workbooks.Open(XLS_PATH, UpdateLinks:=False, ReadOnly:=True)
>
> Dim ws As Excel.Worksheet
> Set ws = wb.Worksheets(SHEET_NAME)
> ws.Activate

Ja, hier ist das betreffende Tabellenblatt dann aktiv, und damit klappt es
wohl.

> wb.SaveAs Filename:=csvPath, FileFormat:=Excel.xlCSV, Local:=True
> wb.Close SaveChanges:=False

[Code gesnippt]

> Das ist aber nicht besonders stabil.

Starke Worte, Christoph!

> Ich habe mit einem Arbeitsblatt getestet,
> das in zwei Zellen jeweils ein Anführungszeichen (U+0022) enthält, also etwa so:
>
> " "

...denn deine Daten sind ja auch alles andere als konform und IMO recht
exotisch....

Aber eine funktionierene Lösung hast Du ja bereits gefunden.

0 new messages