在Excel 2003 PtrSafe给我的问题

我目前正在做一些适用于新的win7机器的VBA代码。 这意味着许多function必须添加新的64位兼容性。 我目前正在遵循这个主页的指导方针。 我发现他们非常有用,并执行以下内容:

#If VBA7 Then Declare PtrSafe Function CreateProcess Lib "kernel32" 'More code, see below. #Else Declare Function CreateProcess Lib "kernel32" 'More code, see below. #EndIf 

不过,当我保存我的代码时,VBA正在给我下面的错误消息:

这个错误代码

注意:上面的代码包含上述链接中描述的代码: 来自jkp-ads 。 该错误出现在Declare PtrSafe Function CreateProcess Lib "kernel32" Alias "CreateProcessA" 。 完整的代码可以在这里find。

我在这里错过了什么? 谢谢!

更新我的完整代码:

 Option Explicit Const INFINITE = &HFFFF Const STARTF_USESHOWWINDOW = &H1 Private Enum enSW SW_HIDE = 0 SW_NORMAL = 1 SW_MAXIMIZE = 3 SW_MINIMIZE = 6 End Enum Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Byte hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Private Enum enPriority_Class NORMAL_PRIORITY_CLASS = &H20 IDLE_PRIORITY_CLASS = &H40 HIGH_PRIORITY_CLASS = &H80 End Enum #If VBA7 Then private Declare PtrSafe Function CreateProcess Lib "kernel32" _ Alias "CreateProcessA" (ByVal lpApplicationName As String, _ ByVal lpCommandLine As String, _ lpProcessAttributes As SECURITY_ATTRIBUTES, _ lpThreadAttributes As SECURITY_ATTRIBUTES, _ ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, _ lpEnvironment As Any, _ ByVal lpCurrentDriectory As String, _ lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As LongPtr #Else Declare Function CreateProcess Lib "kernel32" _ Alias "CreateProcessA" (ByVal lpApplicationName As String, _ ByVal lpCommandLine As String, _ lpProcessAttributes As SECURITY_ATTRIBUTES, _ lpThreadAttributes As SECURITY_ATTRIBUTES, _ ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, _ lpEnvironment As Any, _ ByVal lpCurrentDriectory As String, _ lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As Long #End If 

现在,我想强调一些事情。 首先,我正在运行Excel 2003和Windows XP 32位。 除此之外, 我还没有试图运行代码 。 为什么你可能会问。 原因很简单。 编辑器在我能够做任何事情之前出现编译错误。 这个编译错误可以在这段代码上面的图片中看到。 我截取了一些代码的截图,尤其是编译错误发生的地方。 这是它的样子:

错误

UpdateUpdate:刚刚从MS支持中find这篇文章。 看来解决方法如下: “要解决此问题,请忽略”编译错误“并在Office 2010程序的64位版本中运行VBA代码。 我仍然希望有一些解决scheme。

进一步我的意见下面你的问题(你忽略了…我错误地猜到了吗?)我相信你会得到这个错误,因为你没有正确指定所有的参数。

试试这个,它会编译得很好。

 Const INFINITE = &HFFFF Const STARTF_USESHOWWINDOW = &H1 Private Enum enSW SW_HIDE = 0 SW_NORMAL = 1 SW_MAXIMIZE = 3 SW_MINIMIZE = 6 End Enum Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Byte hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Private Enum enPriority_Class NORMAL_PRIORITY_CLASS = &H20 IDLE_PRIORITY_CLASS = &H40 HIGH_PRIORITY_CLASS = &H80 End Enum #If VBA7 Then Declare PtrSafe Function CreateProcess Lib "kernel32" _ Alias "CreateProcessA" (ByVal lpApplicationName As String, _ ByVal lpCommandLine As String, _ lpProcessAttributes As SECURITY_ATTRIBUTES, _ lpThreadAttributes As SECURITY_ATTRIBUTES, _ ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, _ lpEnvironment As Any, _ ByVal lpCurrentDriectory As String, _ lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As LongPtr #Else Declare Function CreateProcess Lib "kernel32" _ Alias "CreateProcessA" (ByVal lpApplicationName As String, _ ByVal lpCommandLine As String, _ lpProcessAttributes As SECURITY_ATTRIBUTES, _ lpThreadAttributes As SECURITY_ATTRIBUTES, _ ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, _ lpEnvironment As Any, _ ByVal lpCurrentDriectory As String, _ lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As Long #End If 

这不是一个解决办法,而是一个调查的途径。

看起来好像编译器正在查看#If VBA7 Then下面的东西。 但是这不应该在Excel 2003中发生。

尝试replace# #If VBA7 Then用垃圾,并在#Else部分添加一个声明,例如

 #If VBA7 Then ksjdhfg lkjsdh fgkjh,dlgf sldjkgflsd g 'obvious syntax error #Else Const vOlder As String = "older VBA" Declare Function CreateProcess Lib "kernel32" '... keep this part as it was #End If 

然后尝试运行这个来看看它是否编译:

 Sub tester() Debug.Print vOlder End Sub 

这应该在Excel 2003中编译并运行良好,因为它具有比7.0更早的VBA版本。 下面的东西# #If VBA7 Then应该被完全忽略(不pipe任何语法错误或其他任何东西)和#Else下的东西,例如vOlder ,应该是可访问的。

让我们知道这是否有助于您追踪错误。