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

VBA Makro für 32bit und 64bit VBA7

VBA Makro für 32bit und 64bit VBA7
28.05.2021 15:28:45
GuideThomas
Hallo!
Ich bin mit Excel von der 32bit Version auf die 64bit Version umgestiegen. Jetzt läuft ein für mich wichtiges Makro leider nicht mehr, welches nun bei mir auf der 64bit Version als auch weiterhin auf einem Rechner mit Excel 32bit laufen sollte.
Es geht in diesem Makro darum Unicode bzw. UTF8 Sonderzeichen in einen sauberen String umzuwandeln.
Ich bin mit der Ergänzung von PtrSafe und dem Definieren von LongPtr anstelle von Long im VBA7 Code schon ein Stück weit gekommen ... dennoch steht der Ablauf (u.a. bei 1NC = 1Bytes) immer wieder aufgrund unverträglicher Typen im Block für VBA7.
Findet zufällig jemand auf den ersten Blick den Fehler?

Option Explicit
Private Const CP_UTF8 = 65001
#If VBA7 Then
Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, ByVal dwFlags As Long, _
ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As LongPtr, _
ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As LongPtr) As LongPtr
Public Function getTranslation(ByVal url As String) As String
Dim sResponse As String
With CreateObject("MSXML2.ServerXMLHTTP.6.0")
.Open "GET", url, False: .Send
sResponse = StrConv(.responseBody, vbUnicode)
getTranslation = sUTF8ToUni(StrConv(sResponse, vbFromUnicode))
End With
End Function
Public Function sUTF8ToUni(bySrc() As Byte) As String
' Converts a UTF-8 byte array to a Unicode string
Dim lBytes As LongPtr, lNC As Long, lRet As LongPtr
lBytes = UBound(bySrc) - LBound(bySrc) + 1
lNC = lBytes
sUTF8ToUni = String$(lNC, Chr(0))
lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC)
sUTF8ToUni = Left$(sUTF8ToUni, lRet)
End Function
#Else
Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, ByVal dwFlags As Long, _
ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Public Function getTranslation(ByVal url As String) As String
Dim sResponse As String
With CreateObject("MSXML2.ServerXMLHTTP.6.0")
.Open "GET", url, False: .Send
sResponse = StrConv(.responseBody, vbUnicode)
getTranslation = sUTF8ToUni(StrConv(sResponse, vbFromUnicode))
End With
End Function
Public Function sUTF8ToUni(bySrc() As Byte) As String
' Converts a UTF-8 byte array to a Unicode string
Dim lBytes As Long, lNC As Long, lRet As Long
lBytes = UBound(bySrc) - LBound(bySrc) + 1
lNC = lBytes
sUTF8ToUni = String$(lNC, Chr(0))
lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC)
sUTF8ToUni = Left$(sUTF8ToUni, lRet)
End Function
#End If

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

Betreff
Datum
Anwender
Anzeige
AW: VBA Makro für 32bit und 64bit VBA7
28.05.2021 16:05:27
Nepumuk
Hallo Thomas,
teste mal:
Code:

[Cc][+][-]

Option Explicit #If Win64 Then Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpMultiByteStr As String, _ ByVal cchMultiByte As Long, _ ByVal lpWideCharStr As String, _ ByVal cchWideChar As Long) As Long #Else Private Declare Function MultiByteToWideChar Lib "kernel32.dll" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpMultiByteStr As String, _ ByVal cchMultiByte As Long, _ ByVal lpWideCharStr As String, _ ByVal cchWideChar As Long) As Long #End If Private Const CP_UTF8 As Long = 65001 Public Function getTranslation(ByVal url As String) As String Dim sResponse As String With CreateObject("MSXML2.ServerXMLHTTP.6.0") .Open "GET", url, False: .Send sResponse = StrConv(.responseBody, vbUnicode) getTranslation = sUTF8ToUni(StrConv(sResponse, vbFromUnicode)) End With End Function Public Function sUTF8ToUni(bySrc() As Byte) As String ' Converts a UTF-8 byte array to a Unicode string Dim lBytes As Long, lNC As Long, lRet As Long lBytes = UBound(bySrc) - LBound(bySrc) + 1 lNC = lBytes sUTF8ToUni = String$(lNC, Chr(0)) lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC) _ sUTF8ToUni = Left$(sUTF8ToUni, lRet) End Function

Gruß
Nepumuk
Anzeige
VarPtr wird in 64Bit Office nicht mehr unterstützt
29.05.2021 00:09:40
GuideThomas
Hallo Nepumuk und danke für dein Feedback.
Ich frage deshalb nur VBA7 und nicht Win64 ab, da grundsätzlich bei uns im Unternehmen Win64 genutzt wird jedoch mit einer Office 32 Bit Installation - Der Grund dafür ist, dass es SAP Business One anscheinend nur in 32 Bit gibt und somit auch nur mit Office 32 Bit nahtlos zusammenarbeitet ...
Ich habe bei weiterer Recherche einen Beitrag von dir aus dem Jahr 2018 im ActiveVB Forum entdeckt. In diesem schreibst du:
VarPtr, StrPtr und ObjPtr werden im 64Bit-Office nicht mehr unterstützt. Microsoft selbst rät von der Verwendung der 64Bit-Version ab.
Und genau beim Block VarPtr bleibt er hängen im Makro mit der Meldung "Typen unverträglich". Das bedeutet es gibt hier in diesem Fall wohl keine Lösung?

Option Explicit
Private Const CP_UTF8 = 65001
#If VBA7 Then
Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long) As Long
#Else
Private Declare Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long) As Long
#End If
Public Function sUTF8ToUni(bySrc() As Byte) As String
' Converts a UTF-8 byte array to a Unicode string
Dim lBytes As Long, lNC As Long, lRet As Long
lBytes = UBound(bySrc) - LBound(bySrc) + 1
lNC = lBytes
sUTF8ToUni = String$(lNC, Chr(0))
lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC)
sUTF8ToUni = Left$(sUTF8ToUni, lRet)
End Function
Public Function getTranslation(ByVal url As String) As String
Dim sResponse As String
With CreateObject("MSXML2.ServerXMLHTTP.6.0")
.Open "GET", url, False: .Send
sResponse = StrConv(.responseBody, vbUnicode)
getTranslation = sUTF8ToUni(StrConv(sResponse, vbFromUnicode))
End With
End Function

Anzeige
AW: VarPtr wird in 64Bit Office nicht mehr unterstützt
29.05.2021 07:07:17
Nepumuk
Hallo,
teste mal:

Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpMultiByteStr As LongPtr, _
ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As LongPtr, _
ByVal cchWideChar As Long) As Long
Gruß
Nepumuk
AW: VarPtr wird in 64Bit Office nicht mehr unterstützt
29.05.2021 08:01:03
GuideThomas
Hallo Nepumuk,
fantastisch, das hat nun so funktioniert. Vielen Dank!
AW: VBA Makro für 32bit und 64bit VBA7
28.05.2021 16:07:00
Herbert_Grom
Hallo Thomas,
probiers mal damit als erster Zeile:

'#If VBA7 Or Win64 Then
Servus
AW: VBA Makro für 32bit und 64bit VBA7
28.05.2021 16:09:23
Herbert_Grom
genau und das wollte ich auch noch sagen, die "Public Functions" musst du außerhalb der "#If VBA7 Or Win64 Then" setzen.
Anzeige

12 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige