Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

CSV mit UTF-8 Codierung exportieren per VBA


Betrifft: CSV mit UTF-8 Codierung exportieren per VBA von: Oliver
Geschrieben am: 13.07.2018 08:46:53

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

  

Betrifft: AW: link von: Fennek
Geschrieben am: 13.07.2018 08:57:13

Hallo,

vielleicht hilft das:

http://www.office-loesung.de/p/viewtopic.php?f=166&t=771503

mfg


  

Betrifft: AW: link von: Oliver
Geschrieben am: 13.07.2018 09:28:55

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.


  

Betrifft: AW: link von: Oliver
Geschrieben am: 13.07.2018 10:54:12

Habe vergessen den Haken zu setzen, Frage ist noch nicht beantwortet.


  

Betrifft: AW: link von: Robert Werner
Geschrieben am: 13.07.2018 11:01:20

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


  

Betrifft: AW: link von: Oliver
Geschrieben am: 13.07.2018 12:55:30

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


  

Betrifft: AW: link von: Robert Werner
Geschrieben am: 13.07.2018 14:24:43

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


  

Betrifft: AW: link von: Oliver
Geschrieben am: 16.07.2018 10:23:04

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


  

Betrifft: AW: link von: Oliver
Geschrieben am: 16.07.2018 10:54:00

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


  

Betrifft: AW: feedback von: UTF
Geschrieben am: 16.07.2018 11:38:25

https://gist.github.com/dogancelik/2a88c81d309a753cecd8b8460d3098bc


  

Betrifft: AW: feedback (Nodepad++) von: UTF
Geschrieben am: 16.07.2018 11:43:37

https://stackoverflow.com/questions/8432584/how-to-make-notepad-to-save-text-in-utf-8-without-bom


  

Betrifft: AW: link von: Robert Werner
Geschrieben am: 16.07.2018 13:02:46

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


  

Betrifft: AW: link von: Oliver
Geschrieben am: 17.07.2018 14:19:35

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


  

Betrifft: Gerne und Danke für die Rückmeldung (owT) von: Robert Werner
Geschrieben am: 17.07.2018 16:53:19




Beiträge aus dem Excel-Forum zum Thema "CSV mit UTF-8 Codierung exportieren per VBA"