Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1632to1636
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

CSV mit UTF-8 Codierung exportieren per VBA

CSV mit UTF-8 Codierung exportieren per VBA
13.07.2018 08:46:53
Oliver
Hallo Zusammen,
ich habe mit Makrorekorder und etwas selbst angeeignetem VBA Wissen schon einige Makro´s für mich erfolgreich erstellt.
Habe nun aber eine Anwendung, die deutlich über meine Kenntnisse hinaus geht.
Auch intensive Recherche im Netz bringt mich nicht zum gewünschten Ziel.
Hoffe hier etwas Hilfe zu finden, die ich dann auch selbst so in meinen Code einbinden kann. Habe schon Tips bekommen wie: "da musst du in den Stream schreiben" usw.
Allerdings ist das leider schon zu schwierig für mich.
Ich habe eine XLS-Datei, die ich per Code zu CSV mit Hochkomma als Texttrenner wandle.
Ziel war eigentlich, die CSV dann auch gleich mit Kodierung UTF-8 ohne BOM zu exportieren.
Leider klappt das nicht. Die CSV liegt nach dem Export nur im ANSI Format vor.
Kann mir jemand einen direkt umsetzbaren Tip geben ?
Vielen, vielen Dank im Voraus.
Gruß Oliver
Hier mein momentaner Code:

Sub Excel_Zu_UTF8()
Call ÜbersetzungslisteÖffnen
Call ZeichenErsetzen
Call CSV_Speichern
End Sub

Sub ÜbersetzungslisteÖffnen()
On Error GoTo ErrorÖffnen
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Übersetzungsliste auswählen !"
.InitialFileName = "R:\0_Projekte_TID\Übersetzungsliste"
' .AllowMultiSelect = True
.Filters.Clear
.Filters.Add "Excel files", "*.xls"
If .Show = -1 Then
For Each Ordnerpfad In .SelectedItems
fname1 = Ordnerpfad 'Zur weiteren verwendung
Next Ordnerpfad
End If
End With
Workbooks.Open Filename:=fname1
fname1 = ActiveWorkbook.Name
' Sheets("Maschinen Stückliste").Select
GoTo Ende
ErrorÖffnen: MsgBox ("Fehler: kann Datei nicht öffnen"), vbMsgBoxSetForeground
End
Ende:
End Sub

Sub ZeichenErsetzen()
Cells.Select
Range("A1003").Activate
Cells.Replace What:="''", Replacement:="", LookAt:=xlPart, SearchOrder _
:=xlByColumns, MatchCase:=False, SearchFormat:=False, ReplaceFormat:= _
False
Range("A1").Select
End Sub

Sub CSV_Speichern()
Dim SrcRg As Range
Dim CurrRow As Range
Dim CurrCell As Range
Dim CurrTextStr As String
Dim ListSep As String
Dim FName As Variant
FName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
ListSep = Application.International(xlListSeparator)
If Selection.Cells.Count > 1 Then
Set SrcRg = Selection
Else
Set SrcRg = ActiveSheet.UsedRange
End If
Open FName For Output As #1
For Each CurrRow In SrcRg.Rows
CurrTextStr = ìî
For Each CurrCell In CurrRow.Cells
' CurrTextStr = CurrTextStr & """" & CurrCell.Value & """" & ListSep
CurrTextStr = CurrTextStr & """" & CurrCell.Text & """" & ListSep
Next
While Right(CurrTextStr, 1) = ListSep
CurrTextStr = Left(CurrTextStr, Len(CurrTextStr) - 1)
Wend
Print #1, CurrTextStr
Next
Close #1
Windows("Übersetzungsliste.xls").Close False
End Sub

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: link
13.07.2018 09:28:55
Oliver
Nein, leider nicht. Daa ist meine selbe Anfrage im anderen Forum.
Die Antworten dort brachten mich wie schon erwähnt überhaupt nicht weiter...
Trotzdem Danke.
AW: link
13.07.2018 10:54:12
Oliver
Habe vergessen den Haken zu setzen, Frage ist noch nicht beantwortet.
AW: link
13.07.2018 11:01:20
Robert
Hallo Oliver,
ich habe hier ein Makro, dass eine UTF-8-Datei erstellt. Ich habe mal versucht, die Anweisungen aus Deinem Makro dort einzubauen. Das Makro speichert die markierten Zellen (wenn nur eine markiert ist den benutzten Zellbereich) der aktiven Tabelle als CSV-Datei im UTF-8-Format. Als Zell-Trennzeichen wird der Strichpunkt (;) genommen und die Zellen werden in Anführungszeichen (") eingeschlossen. Was Deine Zeile
CurrTextStr = ìî
machen soll, erschließt sich mir nicht. Normalerweise gibt das eine Fehlermeldung, weil man einer Textvariablen Text zuweisen will, ohne diesen in Anführungszeichen zu setzen.
Schau Dir das Ergebnis mal an.
Sub Erstelle_UTF8()
Dim fsT As Object, sFilename As Variant, tmpStr As String
Dim lS As Long, lZ As Long, l As Long
Dim SrcRg As Range
'Pfad und Name der zu erstellenden Datei
sFilename = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
If Selection.Cells.Count > 1 Then
Set SrcRg = Selection
Else
Set SrcRg = ActiveSheet.UsedRange
End If
With SrcRg
For lZ = 1 To .Rows.Count
For lS = 1 To .Columns.Count
tmpStr = tmpStr & """" & .Cells(lZ, lS) & """;"
Next lS
tmpStr = Left(tmpStr, Len(tmpStr) - 1) & vbCrLf
Next lZ
End With
Set fsT = CreateObject("ADODB.Stream")
fsT.Type = 2                'Stream-Typ: Text/String
fsT.Charset = "utf-8"       'Zeichensatz
fsT.Open                    'Stream öffnen
fsT.WriteText tmpStr        'Daten schreiben
fsT.SaveToFile sFilename, 2 'Datei speichern
Set fsT = Nothing
End Sub

Gruß
Robert
Anzeige
AW: link
13.07.2018 12:55:30
Oliver
Hallo Robert,
erstmal vielen Dank für deine Mühe und den "einbaufertigen" Code.
Leider kommt bei mir eine Fehlermeldung. Fehler 13 Typen unevrträglich
in der Zeile tmpStr = tmpStr & """" & .Cells(lZ, lS) & """;"
Leider kann ich nicht zuordnen wo das Problem liegt.
Gruß Oliver
AW: link
13.07.2018 14:24:43
Robert
Hallo Oliver,
bei mir klappt es. Kannst Du Deine Datei, die den Fehler produziert hier mal einstellen. Kannst ja alle Daten, die uns nichts angehen löschen bzw. mit irgendwelchen Dummy-Einträgen überschreiben.
Falls nicht, was steht denn in der Zelle, die den Fehler produziert. Die entsprechende Zelle kannst Du ermitteln, indem Du wie folgt vorgehst:
Wenn die Fehlermeldung kommt, klickst Du auf "Debuggen". Dann wird die entsprechende Zeile im Code gelb markiert. Wenn Du dann die Maus in dieser Zeile über die Variablen lS bzw. lZ hälst, wird die Spalten- bzw. die Zeilen-Nr. der entsprechenden Zelle angezeigt.
Gruß
Robert
Anzeige
AW: link
16.07.2018 10:23:04
Oliver
Hallo Werner,
bin erst heute dazu gekommen, mich nochmal damit zu beschäftigen.
Deine Erklärung war sehr verständlich und hilfreich.
Habe somit auch den Fehler gefunden.
Durch ein für unser ERP nicht druckbares Zeichen, war in einer Zelle der Eintrag "#Name?".
Dieser hatte den Fehler Verursacht.
Das Ergebnis sieht schon mal gut aus.
Noch eine letzte Frage: Was müsste ich tun, um die Codierung UTF-8 ohne BOM zu exportieren ?
Vielen Danke nochmal. Du hast mir wirklich sehr geholfen.
Gruß Oliver
AW: link
16.07.2018 10:54:00
Oliver
Und wieder den Haken vergessen................
Hallo Robert,
bin erst heute dazu gekommen, mich nochmal damit zu beschäftigen.
Deine Erklärung war sehr verständlich und hilfreich.
Habe somit auch den Fehler gefunden.
Durch ein für unser ERP nicht druckbares Zeichen, war in einer Zelle der Eintrag "#Name?".
Dieser hatte den Fehler Verursacht.
Das Ergebnis sieht schon mal gut aus.
Noch eine letzte Frage: Was müsste ich tun, um die Codierung UTF-8 ohne BOM zu exportieren ?
Vielen Danke nochmal. Du hast mir wirklich sehr geholfen.
Gruß Oliver
Anzeige
AW: feedback
16.07.2018 11:38:25
UTF
https://gist.github.com/dogancelik/2a88c81d309a753cecd8b8460d3098bc
AW: feedback (Nodepad++)
16.07.2018 11:43:37
UTF
https://stackoverflow.com/questions/8432584/how-to-make-notepad-to-save-text-in-utf-8-without-bom
AW: link
16.07.2018 13:02:46
Robert
Sorry, das verstehe ich nicht ganz.
Du schreibst "Was müsste ich tun, um die Codierung UTF-8 ohne BOM zu exportieren ?". Wenn in der zu erstellenden Datei die BOM (Byte Order Mark), also bei UTF-8 die ersten 3 Zeichen der Datei, hexadezimal: EF BB BF, fehlen, ist die Datei nicht mehr im UTF-8-Format. Du hast dann wahrscheinlich einen UTF-8-String in einer ANSI-Datei. Falls es das ist, was Du möchtest, habe ich auch keine Lösung. Du könntest Dir höchstens mal die StrConv-Funktion anschauen.
Gruß
Robert
Anzeige
AW: link
17.07.2018 14:19:35
Oliver
Ja, du hast natürlich recht. Die CSV wird als UTF-8 ohne BOM aus unserem ERP System exportiert.
Diese dient mir in einer anderen Datenbank zur Erstellung von Ersatzteilkatalogen.
Ich war daher zuerst bemüht, das ursprüngliche Format beizubehalten.
Habe jetzt aber bemerkt, daß UTF-8 mit BOM ebnso funktioniert.
Von daher ist meine Anfrage geklärt und ich bedanke mich für die Hilfestellung.
Gruß Oliver
Gerne und Danke für die Rückmeldung (owT)
17.07.2018 16:53:19
Robert

76 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige