Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

UTF8Output / Typ unverträglich

Forumthread: UTF8Output / Typ unverträglich

UTF8Output / Typ unverträglich
24.11.2020 21:57:41
Selma
Hallo Leute,
ich habe seit diese Woche Office 365 im Einsatz. Ich bekomme diese Meldung in diesem Code:
"Typ unverträglich" in diesem Abschnitt StrPtr
Das hat bis letzte Woche alles funktioniert. Was muss ich bitte ändern?
Option Private Module
Option Explicit
Declare PtrSafe Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cbMultiByte As Long, _
ByVal lpDefaultChar As Long, _
ByVal lpUsedDefaultChar As Long) As  _
Long
Sub UTF8Output(Datei As String, t As String, Optional BOM As Boolean = False)
Dim tmp() As Byte, l As Long, FF As Integer
If Len(Datei) = 0 Or Len(t) = 0 Then Exit Sub
l = WideCharToMultiByte(65001, 0, StrPtr(t), Len(t), 0, 0, 0, 0)
ReDim tmp(0 To l - 1)
WideCharToMultiByte 65001, 0, StrPtr(t), Len(t), VarPtr(tmp(0)), l, 0, 0
FF = FreeFile
Open Datei For Output As #FF
Close #FF
FF = FreeFile
Open Datei For Binary As #FF
Put #FF, , tmp
Close #FF
End Sub
Beste Grüße,
Selma
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: UTF8Output / Typ unverträglich
24.11.2020 23:11:40
Yal
Hallo Selma,
Ist Office 365 64Bit? Dann wird vielleicht StrPtr 64bittig interpretiert und passt dann nicht zu Kernel32.dll.
siehe (habe selber nicht im Detail gelesen):
https://docs.microsoft.com/de-de/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office
"VBA hatte zuvor keinen pointer-Datentyp, sodass Sie 32-Bit-Variablen zum Speichern von Zeigern und Handles verwenden mussten. Mit diesen Variablen werden nun die von API-Aufrufen zurückgegebenen 64-Bit-Werte abgeschnitten, wenn Sie Declare-Anweisungen verwenden."
oder den Passus "API-Kompatibilität" einige Hinweis uber "Declare"-Verhalten.
Viel Erfolg
Yal
Anzeige
AW: UTF8Output / Typ unverträglich
24.11.2020 23:16:13
volti
Hallo Selma,
mindestens der Declare stimmt nicht mehr ganz.
Versuche mal diesem Declare:
Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpWideCharStr As String, _
ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As String, _
ByVal cchMultiByte As Long, _
ByVal lpDefaultChar As String, _
ByVal lpUsedDefaultChar As LongPtr) As Long
viele Grüße
Karl-Heinz
Anzeige
AW: UTF8Output / Typ unverträglich
25.11.2020 11:37:33
Planlos
in der deklaration ersetz mal für alle schnittstellenvariablen die mit lp... beginnen den datentyp von long auf longptr.
AW: UTF8Output / Typ unverträglich
25.11.2020 13:06:40
volti
Hallo Planlos,
das funktioniert und ist auch logisch.
Da ist dann wohl ein Fehler in der API-Reference Windows64API_Declares.txt aus 2010.
Bei deren Anwendung kommt zwar kein Fehler, aber auch kein vernünftiges Ergebnis....
Ersetzt man spaßeshalber nur lpMultiByteStr as LongPtr werden bei meinem Testetext chinesische Zeichen zurückgeliefert.
VG KH
Anzeige
AW: UTF8Output / Typ unverträglich
25.11.2020 12:05:23
peterk
Hallo
Um eine UTF-8 Datei zu schreiben kannt Du auch ADO verwenden.

Sub DatenSchreiben(DateiName As String, MyTextLine As String)
' Konstanten für WriteText
Const adWriteChar = 0
Const adWriteLine = 1
' Konstanten für SaveToFile
Const adSaveCreateNotExist = 1
Const adSaveCreateOverwrite = 2
' Konstanten für LineSeparator
Const adCR = 13
Const adCRLF = -1
Const adLF = 10
Dim objStream As Object
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.LineSeparator = adCRLF
objStream.Open
objStream.writetext MyTextLine, adWriteLine
objStream.SaveToFile DateiName, adSaveCreateNotExist
Set objStream = Nothing
End Sub

Anzeige
AW: UTF8Output / Typ unverträglich
27.11.2020 12:18:48
Selma
Vielen Dank an Alle!
Beste Grüße,
Selma
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Umgang mit dem "Typ unverträglich"-Fehler in Excel VBA


Schritt-für-Schritt-Anleitung

Wenn du mit Office 365 arbeitest und auf den "Typ unverträglich"-Fehler stößt, während du die StrPtr-Funktion in deinem VBA-Code verwendest, folge diesen Schritten, um das Problem zu beheben:

  1. Prüfe, ob du die 64-Bit-Version von Office 365 verwendest.

    • Wenn ja, musst du sicherstellen, dass deine Declare-Anweisungen die 64-Bit-Variablen korrekt nutzen.
  2. Aktualisiere die Declare-Anweisung für die WideCharToMultiByte-Funktion:

    Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" ( _
       ByVal CodePage As Long, _
       ByVal dwFlags As Long, _
       ByVal lpWideCharStr As String, _
       ByVal cchWideChar As Long, _
       ByVal lpMultiByteStr As String, _
       ByVal cchMultiByte As Long, _
       ByVal lpDefaultChar As String, _
       ByVal lpUsedDefaultChar As LongPtr) As Long
  3. Ändere die Datentypen für alle Variablen, die mit lp beginnen, von Long auf LongPtr.

  4. Teste den aktualisierten Code, um sicherzustellen, dass der Fehler behoben ist.


Häufige Fehler und Lösungen

  • Fehler: "Typ unverträglich" bei StrPtr

    • Lösung: Stelle sicher, dass du die StrPtr-Funktion mit dem richtigen Datentyp verwendest. In 64-Bit-Versionen von VBA sollte StrPtr richtig definiert sein.
  • Fehler: Problem mit VarPtr

    • Lösung: Überprüfe, ob du VarPtr auch auf LongPtr umgestellt hast, um die 64-Bit-Kompatibilität sicherzustellen.
  • Fehler bei der API-Kompatibilität

    • Lösung: Achte darauf, dass alle API-Funktionen, die du verwendest, die richtige Syntax für 64-Bit haben. Informationen dazu findest du in der offiziellen Microsoft-Dokumentation.

Alternative Methoden

Wenn du Schwierigkeiten mit der StrPtr-Funktion in deinem VBA-Projekt hast, kannst du auch die ADO-Objekte verwenden, um UTF-8-Dateien zu schreiben. Hier ist ein Beispiel:

Sub DatenSchreiben(DateiName As String, MyTextLine As String)
    Const adWriteLine = 1
    Const adSaveCreateNotExist = 1
    Const adCRLF = -1

    Dim objStream As Object
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Charset = "utf-8"
    objStream.LineSeparator = adCRLF
    objStream.Open
    objStream.writetext MyTextLine, adWriteLine
    objStream.SaveToFile DateiName, adSaveCreateNotExist
    Set objStream = Nothing
End Sub

Diese Methode nutzt LineSeparator in VBA und ist eine alternative Möglichkeit, um Textdateien im UTF-8-Format zu erstellen.


Praktische Beispiele

Hier sind einige praktische Anwendungen der StrPtr-Funktion in deinem Excel VBA-Code:

  1. UTF-8 Ausgabe in eine Datei:

    Sub UTF8Output(Datei As String, t As String, Optional BOM As Boolean = False)
       Dim tmp() As Byte, l As Long, FF As Integer
       If Len(Datei) = 0 Or Len(t) = 0 Then Exit Sub
       l = WideCharToMultiByte(65001, 0, StrPtr(t), Len(t), 0, 0, 0, 0)
       ReDim tmp(0 To l - 1)
       WideCharToMultiByte 65001, 0, StrPtr(t), Len(t), VarPtr(tmp(0)), l, 0, 0
       FF = FreeFile
       Open Datei For Binary As #FF
       Put #FF, , tmp
       Close #FF
    End Sub
  2. Schreiben von mehrzeiligem Text in eine Datei mit ADO:

    Sub MultiLineDatenSchreiben(DateiName As String, MyTextLines As Variant)
       Dim line As Variant
       For Each line In MyTextLines
           DatenSchreiben DateiName, line
       Next line
    End Sub

Tipps für Profis

  • Nutze LongPtr für 64-Bit VBA-Projekte: Wenn du mit Zeigern und Handles arbeitest, verwende immer LongPtr, um sicherzustellen, dass dein Code sowohl in 32-Bit als auch in 64-Bit funktioniert.

  • Testen der Codekompatibilität: Überprüfe regelmäßig die Dokumentation von Microsoft zur API-Kompatibilität, insbesondere wenn du auf neue Versionen von Office umsteigst.

  • Verwendung von ADODB.Stream: Diese Methode ist nicht nur einfacher, sondern auch flexibler, wenn es darum geht, verschiedene Zeichencodierungen zu verwenden.


FAQ: Häufige Fragen

1. Was ist StrPtr in VBA? StrPtr ist eine Funktion, die die Adresse eines Strings zurückgibt. Sie wird häufig in API-Aufrufen verwendet.

2. Warum funktioniert mein VBA-Code nicht mehr nach dem Upgrade auf Office 365? Möglicherweise liegt es daran, dass VBA in der 64-Bit-Version von Office 365 anders behandelt wird. Überprüfe deine Declare-Anweisungen und stelle sicher, dass du LongPtr verwendest.

3. Wie kann ich UTF-8-Daten in Excel speichern? Du kannst entweder die StrPtr-Methode verwenden, um direkt in eine Datei zu schreiben, oder die ADO-Methode, die einfacher und flexibler ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige