Код не работает на 64-битном Office

Я должен решить проблему с совместимостью с кодом VBA на 64-битных системах. Я не использую язык VB и код ниже, но не мой, но я должен решить эту проблему.

Код Excel VB:

Option Explicit Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Byte, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByRef lpUsedDefaultChar As Long) As Long Private Const CP_UTF8 As Long = 65001 Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122& Public Function ToUTF8(s As String) As Byte() If Len(s) = 0 Then Exit Function Dim ccb As Long ccb = WideCharToMultiByte(CP_UTF8, 0, StrPtr(s), Len(s), ByVal 0&, 0, vbNullString, ByVal 0&) If ccb = 0 Then Err.Raise 5, , "Internal error." End If Dim b() As Byte ReDim b(1 To ccb) If WideCharToMultiByte(CP_UTF8, 0, StrPtr(s), Len(s), b(LBound(b)), ccb, vbNullString, ByVal 0&) = 0 Then Err.Raise 5, , "Internal error." Else ToUTF8 = b End If End Function 

Я попытался добавить условия #If VBA7 и PtrSave повсюду, но рабочий лист все еще не работает.

Это код, который я пытался использовать в Office 64 Bit

  Option Explicit #If VBA7 Then Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Integer, ByVal dwFlags As Long, ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As LongPtr, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As LongPtr #Else Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Byte, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByRef lpUsedDefaultChar As Long) As Long #EndIf Private Const CP_UTF8 As Long = 65001 Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122& Public Function ToUTF8(s As String) As Byte() If Len(s) = 0 Then Exit Function Dim ccb As LongPtr ccb = WideCharToMultiByte(CP_UTF8, 0, StrPtr(s), Len(s), ByVal 0&, 0, vbNullString, ByVal 0&) If ccb = 0 Then Err.Raise 5, , "Internal error." End If Dim b() As Byte ReDim b(1 To ccb) // ERROR TYPE MISMATCH on ccb If WideCharToMultiByte(CP_UTF8, 0, StrPtr(s), Len(s), b(LBound(b)), ccb, vbNullString, ByVal 0&) = 0 Then Err.Raise 5, , "Internal error." Else ToUTF8 = b End If End Function 

Спасибо за помощь.

(Непроверенные)

+ Изменить


Эта

 Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" _ (ByVal CodePage As Integer, ByVal dwFlags As Long, ByVal lpWideCharStr _ As LongPtr, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, _ ByVal cchMultiByte As LongPtr, ByVal lpDefaultChar As Long, _ ByVal lpUsedDefaultChar As Long) As LongPtr 

к

 Private Declare PtrSafe Function WideCharToMultiByte Lib "Kernel32" ( _ ByVal CodePage As LongPtr, ByVal dwflags As LongPtr, _ ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As LongPtr, _ ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As LongPtr, _ ByVal lpDefaultChar As LongPtr, ByVal lpUsedDefaultChar As LongPtr) As LongPtr 

Эта

 Private Const CP_UTF8 As Long = 65001 

к

 Private Const CP_UTF8 = 65001 

Эта

 Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122& 

к

 Private Const ERROR_INSUFFICIENT_BUFFER = 122& 

Эта

 Dim ccb As LongPtr 

к

 Dim ccb As Variant 

В последних трех chnages, которые я предложил, мы объявляем их как Варианты, потому что мы не знаем, какой тип будет в разных системах. Это будет либо Long либо LongPtr

Interesting Posts

Могу ли я написать массив в диапазон и только пересчитать измененные ячейки?

Java – Apache POI HSSF / XSSF – ячейка для чтения неисправностей с форматом данных XX: XX

Могу ли я использовать функцию COUNTIF с помощью или в GETPIVOTDATA?

Изменение размера таблицы динамически

Как программно изменить URL-адрес источника данных в Excel 2016 Open XML-файл с помощью python

Понимание формулы поиска, используемой для расчета остатков на основе транзакций

Удалить содержимое ячейки, если «0»

Подсчитайте количество экземпляров цифры в диапазоне ячеек

Как динамически удалять данные на основе минимального значения отсечки

VBA – получение значения из уникального диапазона

Экспорт DataTable в Excel удаляет разрывы строк

Subject = LARGE к условию

Программирование Windows: как сделать масштабирование окон возможным?

Использование разных параметров в одной и той же рабочей книге Excel для SQL

SQL Server и Excel для преобразования числа дают разницу

Давайте будем гением компьютера.