Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1836to1840
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

per Makro UTF-8 codiert speichern

per Makro UTF-8 codiert speichern
23.06.2021 18:12:40
Ingo
Hallo
Ich habe hier ein VBA-Makro. Das liest bestimmte Werte aus einer Tabelle aus und schreibt diese in eine Datei test.txt.
Diese Text-Datei ist dann in ANSI codiert. Lässt es sich mit der aktuellen Version von Excel in Office 365 auch machen, dass die Text-Date in UTF-8 codiert ist? Ich habe schon versucht, mir das anzulesen per Google-Suche. Aber so richtig werde ich daraus leider nicht schlau. Da finde ich immer nur Lösungen, die recht kompliziert zu sein scheinen.
Kann Excel nicht mit einem Makro auch so einfach UTF-8 codiert speichern, wie es ja auch über "speichern unter" geht?
Gruß
Ingo

Sub Test()
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
strPath = "E:\" 'Speicherpfad eintragen
strDateiname = "test.txt" 'Dateinamen mit Dateiendung eintragen
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
Open strPath & strDateiname For Output As #1
For i = 1 To lngZeile
If Range("spalte1").Cells(i) = "x" Then
Print #1, Cells(i, Range("spalte-a").Column).Value & vbTab & Cells(i, Range("spalte-b").Column).Value & vbTab & Cells(i, Range("spalte-c").Column).Value
Next i
Close #1
End Sub

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: per Makro UTF-8 codiert speichern
23.06.2021 18:48:55
Nepumuk
Hallo Ingo,
teste mal:
Code:

[Cc][+][-]

Option Explicit Public Sub Test() Const DRIVE As String = "G:\" ' Speicherpfad eintragen Const FILE As String = "test.txt" ' Dateinamen mit Dateiendung eintragen Dim lngRow As Long Dim objFileSystemObject As Object, objTextStream As Object Set objFileSystemObject = CreateObject(Class:="Scripting.FileSystemObject") Set objTextStream = objFileSystemObject.CreateTextFile( _ Filename:=DRIVE & FILE, Overwrite:=True, Unicode:=True) For lngRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Range("spalte1").Cells(lngRow).Value = "x" Then _ Call objTextStream.WriteLine( _ Cells(lngRow, Range("spalte-a").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-b").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-c").Column).Value) Next lngRow Call objTextStream.Close Set objTextStream = Nothing Set objFileSystemObject = Nothing End Sub

Gruß
Nepumuk
Anzeige
AW: per Makro UTF-8 codiert speichern
23.06.2021 19:18:55
Ingo
Hallo Nepumuk
Hab es gleich mal probiert. Die Text-Datei ist dann in UTF-16 LE kodiert. Kann das sein. Geht das auch als UTF-8?
Gruß
Ingo
AW: per Makro UTF-8 codiert speichern
23.06.2021 20:10:52
Nepumuk
Hallo Ingo,
teste das mal:
Code:

[Cc][+][-]

Option Explicit Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As LongPtr, _ ByVal cchWideChar As Long, _ ByVal lpMultiByteStr As LongPtr, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As LongPtr, _ ByVal lpUsedDefaultChar As LongPtr) As Long Private Const CP_UTF8 As Long = 65001 Public Sub Test() Const DRIVE As String = "G:&bsol;" ' Speicherpfad eintragen Const FILE As String = "test.txt" ' Dateinamen mit Dateiendung eintragen Dim lngRow As Long Dim strText As String For lngRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Range("spalte1").Cells(lngRow).Value = "x" Then strText = strText & vbCrLf & _ Cells(lngRow, Range("spalte-a").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-b").Column).Value & vbTab & _ Cells(lngRow, Range("spalte-c").Column).Value Next lngRow If Create_UTF8_File(DRIVE & FILE, Mid$(strText, 2)) Then MsgBox "OK" End Sub Private Function Create_UTF8_File(strFileName As String, strText As String) As Boolean Dim intFileNumber As Integer Dim bytBuffer() As Byte Dim lngLength As Long, lngptrPointer As LongPtr, lngSize As Long On Error GoTo error_handler lngLength = Len(strText) lngptrPointer = StrPtr(strText) lngSize = WideCharToMultiByte(CP_UTF8, 0&, _ lngptrPointer, lngLength, 0&, 0&, 0&, 0&) ReDim bytBuffer(0 To lngSize - 1) Call WideCharToMultiByte(CP_UTF8, 0&, lngptrPointer, _ lngLength, VarPtr(bytBuffer(0)), lngSize, 0&, 0&) If Dir$(strFileName) <> vbNullString Then Call Kill(strFileName) Reset intFileNumber = FreeFile Open strFileName For Binary Access Write As #intFileNumber Put #intFileNumber, , bytBuffer Close #intFileNumber Create_UTF8_File = True Exit Function error_handler: MsgBox "Fehler: " & CStr(Err.Number) & vbLf & vbLf & _ Err.Description, vbCritical, "Fehler im Modul ' 'Create_UTF8_File''" End Function

Gruß
Nepumuk
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:33:25
Ingo
Moin Nepumuk
So, ich habe das jetzt probiert. Leider gibt es eine Fehlermeldung:
Fehler im Modul 'Create UTF8 Fil'
Fehler 52
Dateiname oder -nummer falsch
Gruß
Ingo
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:39:54
Nepumuk
Hallo Ingo,
hast du das hier:

Const DRIVE As String = "G:\"    ' Speicherpfad eintragen
Const FILE As String = "test.txt"    ' Dateinamen mit Dateiendung eintragen
angepasst?
Gruß
Nepumuk
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:45:37
Ingo
Hallo Nepumuk
Ja das habe ich. Ich wollte nicht so gerne hier im Forum den echten Pfad und den echten Dateinamen zeigen.
Muss ich dann noch was an anderer Stelle im Code passend dazu anpassen. Ich hatte diesbezüglich schon geschaut, aber nichts gefunden. Vielleicht habe ich nicht gründlich genug geschaut?
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:56:00
Nepumuk
Hallo Ingo,
ich habe das getestet, und bei mir hat es so funktioniert. Keine Ahnung was bei dir schief läuft.
Gruß
Nepumuk
AW: per Makro UTF-8 codiert speichern
24.06.2021 09:58:24
peterk
Hallo
Probier mal:

Sub Test()
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
strPath = "E:\" 'Speicherpfad eintragen
strDateiname = "test.txt" 'Dateinamen mit Dateiendung eintragen
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.LineSeparator = -1  '(CRLF)
objStream.Open
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
For i = 1 To lngZeile
If Range("spalte1").Cells(i) = "x" Then
myTextLine = Cells(i, Range("spalte-a").Column).Value & vbTab & _
Cells(i, Range("spalte-b").Column).Value & vbTab & _
Cells(i, Range("spalte-c").Column).Value
objStream.writetext myTextLine, 1
End If
Next i
objStream.SaveToFile strPath & strDateiname, 1
Set objStream = Nothing
End Sub

Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 10:09:43
Ingo
Moin peterk
Vielen Dank auch Dir für Deine nette Hilfe erstmal.
Ich habe es probiert, erhalte aber eine Fehlermeldung.
Laufzeitfehler 3004
Die Datei konnte nicht beschrieben werden
Gruß
Ingo
Funktioniert wohl doch
24.06.2021 10:14:49
Ingo
Hallo nochmal
Funktioniert wohl doch. Hatte einen Tippfehler gemacht. Ich werde das jetzt nochmal genauer testen und Dich dann informieren.
Gruß
Ingo
AW: per Makro UTF-8 codiert speichern
24.06.2021 10:19:39
Ingo
Hallo peterk
Ein kleines Hoppla gibt es noch.
Die Datei wird geschrieben und ist auch korrekt in UTF-8 kodiert. Soweit alles super.
Beim zweiten Ausführen des Makros kommt aber eine Fehlermeldung:
"Die Date konnte nicht beschrieben werden"
Ich nehme an, dass im Code nicht steht, dass die Datei dann einfach überschrieben werden soll. Kann das sein?
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 10:32:43
peterk
Hallo

objStream.SaveToFile strPath & strDateiname, 2
' 	1 	Default. Creates a new file if the file does not already exist
'       2 	Overwrites the file with the data from the currently open Stream object, if the file already exists

AW: per Makro UTF-8 codiert speichern
24.06.2021 10:48:26
Ingo
Hallo peterk
Ja ich danke Dir. Hatte es auch gerade schon ergooglen können.
Deine Lösung klappt also super. Und sie ist ja auch schon schmal.
Ganz vielen lieben Dank dafür.
Gruß
Ingo
AW: per Makro UTF-8 codiert speichern
24.06.2021 13:29:27
Ingo
Hallo peterk
Aktuell wird die Text-Datei ja folgendermaßen kodiert:
UTF-8 mit BOM
Geht das auch so?
UTF-8 ohne BOM
Gruß Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 14:00:38
peterk
Hallo Ingo
Ja, mit einem kleinen Trick
Geänderte Deklaration

Const NoBOM = True
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
 Dim objStreamNoBOM As Object
Nach der Schleife:

If NoBOM Then
Set objStreamNoBOM = CreateObject("ADODB.Stream")
objStreamNoBOM.Type = 1 ' adTypeBinary
objStreamNoBOM.Open
objStream.Position = 3
objStream.CopyTo objStreamNoBOM
objStreamNoBOM.SaveToFile strPath & strDateiname, 2
Set objStreamNoBOM = Nothing
Else
objStream.SaveToFile strPath & strDateiname, 2
End If
Set objStream = Nothing

Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 14:30:35
Ingo
Hallo peterk
Das gibt bei mir eine Fehlermeldung:
Laufzeitfehler *-2147024809 (80070057)':
Falscher Parameter
Der VBA-Debugger markiert mir dann die folgende Zeile in gelb.
objStream.Position = 3
Ich poste hier nochmal den ganzen Code mit den von Dir genannten Änderungen.

Sub xxx()
Const NoBOM = True
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
Dim objStreamNoBOM As Object
strPath = "C:\xxx\" 'Speicherpfad eintragen
strDateiname = "xxx.xml" 'Dateinamen mit Dateiendung eintragen
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.LineSeparator = -1  '(CRLF)
objStream.Open
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
myTextLine = myTextLine & "xxx" & vbCrLf
For i = 2 To 32
myTextLine = myTextLine & "xxx" & vbCrLf
Next i
myTextLine = myTextLine & "xxx" & vbCrLf
objStream.writetext myTextLine, 1
objStream.SaveToFile strPath & strDateiname, 2
Set objStream = Nothing
If NoBOM Then
Set objStreamNoBOM = CreateObject("ADODB.Stream")
objStreamNoBOM.Type = 1 ' adTypeBinary
objStreamNoBOM.Open
objStream.Position = 3
objStream.CopyTo objStreamNoBOM
objStreamNoBOM.SaveToFile strPath & strDateiname, 2
Set objStreamNoBOM = Nothing
Else
objStream.SaveToFile strPath & strDateiname, 2
End If
Set objStream = Nothing
End Sub
Habe ich da was falsch gemacht?
Gruß
Ingo
Anzeige
AW: per Makro UTF-8 codiert speichern
24.06.2021 14:58:39
peterk
Hallo Ingo

Sub xxx()
Const NoBOM = True
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
Dim myTextLine As String
Dim objStream As Object
Dim objStreamNoBOM As Object
strPath = "C:\xxx\" 'Speicherpfad eintragen
strDateiname = "xxx.xml" 'Dateinamen mit Dateiendung eintragen
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.LineSeparator = -1  '(CRLF)
objStream.Open
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
myTextLine = myTextLine & "xxx" & vbCrLf
For i = 2 To 32
myTextLine = myTextLine & "xxx" & vbCrLf
Next i
myTextLine = myTextLine & "xxx" & vbCrLf
objStream.writetext myTextLine, 1
If NoBOM Then
Set objStreamNoBOM = CreateObject("ADODB.Stream")
objStreamNoBOM.Type = 1 ' adTypeBinary
objStreamNoBOM.Open
objStream.Position = 3
objStream.CopyTo objStreamNoBOM
objStreamNoBOM.SaveToFile strPath & strDateiname, 2
Set objStreamNoBOM = Nothing
Else
objStream.SaveToFile strPath & strDateiname, 2
End If
Set objStream = Nothing
End Sub

Anzeige
Pizza?
24.06.2021 15:09:06
Ingo
Hallo peterk
Ah alles klar. Jetzt sehe ich meinen Fehler. Danke Dir nochmals.
Sag mal, darf ich Dir vielleicht einen Gutschein für ne leckere Pizza-Lieferung zukommen lassen?
Gruß
Ingo
AW: Pizza?
24.06.2021 15:13:20
peterk
Hallo Ingo
Danke für das Angebot, bleib aber lieber anonym ;-)
Peter
Habe es herausbekommen (2 statt 1) o.T.
24.06.2021 10:31:46
Ingo
o.T.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige