У меня есть код, который отлично работал в 32-битном Excel. Код не работает на 64-битной версии Excel. При копировании деклараций вставки в 64-битном Excel ошибка не появляется. Объявления выделены КРАСНЫМ цветом и не распознаются.

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

Так, например, если я запустил: запустите Excel «C: \ GD \ Edu Recent \ ParametersProject.xlsm» /p/"kjh%dg.pdf », он вернет строку, которую я мог бы проанализировать и определить входные параметры:« C: \ GD \ Edu Recent \ ParametersProject.xlsm "/p/"kjh%dg.pdf"

Как бы я изменился?

Вот код:

'I declared this code in a module called Parameters:

Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long
Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long)


Public Function CmdLineToStr() As String

'
' Returns the command line in the call to Excel
'
Dim Buffer() As Byte
Dim StrLen As Long
Dim CmdPtr As Long

CmdPtr = Parameters.GetCommandLine()
If CmdPtr > 0 Then
  StrLen = lstrlenW(CmdPtr) * 2
  If StrLen > 0 Then
    ReDim Buffer(0 To (StrLen - 1)) As Byte
    CopyMemory Buffer(0), ByVal CmdPtr, StrLen
    CmdLineToStr = Buffer
  End If
End If

End Function

А также...

'I declared this code in the Workbook open:

Sub workBook_open()
    MsgBox Parameters.CmdLineToStr
End Sub
1
Heap of Pinto Beans 11 Дек 2017 в 18:29

1 ответ

Лучший ответ

Операторы Declare с ключевым словом PtrSafe - это рекомендуемый синтаксис. В примере 64-битного оператора Declare:

Declare PtrSafe Function GetActiveWindow Lib "User32" () As LongPtr 

Дополнительную информацию можно найти в этой документации:
https://msdn.microsoft.com/ en-us / vba / language-reference-vba / articles / declare-statement

0
dadler 11 Дек 2017 в 15:33