Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 2016 32位宏在Excel 2016 64位PtrSafe上抛出宏错误(两个代码如下)_Excel_Vba_64 Bit_32 Bit - Fatal编程技术网

Excel 2016 32位宏在Excel 2016 64位PtrSafe上抛出宏错误(两个代码如下)

Excel 2016 32位宏在Excel 2016 64位PtrSafe上抛出宏错误(两个代码如下),excel,vba,64-bit,32-bit,Excel,Vba,64 Bit,32 Bit,在尝试社区解决方案之后,它仍然会在64位上抛出错误,或者我将其破坏到完全无法正常工作的程度 这将对工作产生巨大影响,我正在努力让它快速工作,因此非常感谢你们所有人和你们在这方面的帮助 另外,我只有32位Excel,因此不得不麻烦其他团队成员进行验证,这会进一步延迟 实际代码: Option Explicit Private Declare PtrSafe Function FindWindow Lib "User32" _ Alias "FindWindowA" ( _ ByVal lpClas

在尝试社区解决方案之后,它仍然会在64位上抛出错误,或者我将其破坏到完全无法正常工作的程度

这将对工作产生巨大影响,我正在努力让它快速工作,因此非常感谢你们所有人和你们在这方面的帮助

另外,我只有32位Excel,因此不得不麻烦其他团队成员进行验证,这会进一步延迟

实际代码:

Option Explicit
Private Declare PtrSafe Function FindWindow Lib "User32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "User32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "User32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "User32" ( _
ByVal hwnd As Long) As Long
Sub RemoveCaption(objForm As Object)
    Dim lStyle          As Long
    Dim hMenu           As Long
    Dim mhWndForm       As Long
    If Val(Application.Version) < 9 Then
        mhWndForm = FindWindow("ThunderXFrame", objForm.Caption) 'XL97
    Else
        mhWndForm = FindWindow("ThunderDFrame", objForm.Caption) 'XL2000+
    End If
    lStyle = GetWindowLong(mhWndForm, -16)
    lStyle = lStyle And Not &HC00000
    SetWindowLong mhWndForm, -16, lStyle
    DrawMenuBar mhWndForm
End Sub
选项显式
私有声明PtrSafe函数FindWindow Lib“User32”_
别名“FindWindowA”(_
ByVal lpClassName作为字符串_
ByVal lpWindowName(作为字符串)长度相同
私有声明函数GetWindowLong Lib“User32”_
别名“GetWindowLongA”(_
再见,只要_
ByVal nIndex As Long)As Long
私有声明函数SetWindowLong Lib“User32”_
别名“SetWindowLongA”(ByVal hwnd为Long_
ByVal nIndex只要_
ByVal dwNewLong As Long)As Long
私有声明函数DrawMenuBar Lib“User32”(_
ByVal hwnd As Long)一样长
子RemoveCaption(对象为objForm)
暗色和长的一样
朦胧的花木如长
暗mhWndForm与长
如果Val(Application.Version)<9,则
mhWndForm=FindWindow(“ThunderXFrame”,objForm.Caption)”XL97
其他的
mhWndForm=FindWindow(“ThunderDFrame”,objForm.Caption)”XL2000+
如果结束
lStyle=GetWindowLong(mhWndForm,-16)
lStyle=lStyle而非&HC00000
SetWindowLong mhWndForm,-16,L样式
DrawMenuBar mhWndForm
端接头
我对PtrSafe的尝试:

Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "User32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function GetWindowLong Lib "User32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "User32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "User32" ( _
ByVal hwnd As Long) As Long
#Else
Private Declare PtrSafe Function FindWindow Lib "User32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "User32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "User32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "User32" ( _
ByVal hwnd As Long) As Long
#End If
Sub RemoveCaption(objForm As Object)
    Dim lStyle          As Long
    Dim hMenu           As Long
    Dim mhWndForm       As Long
    If Val(Application.Version) < 9 Then
        mhWndForm = FindWindow("ThunderXFrame", objForm.Caption) 'XL97
    Else
        mhWndForm = FindWindow("ThunderDFrame", objForm.Caption) 'XL2000+
    End If
    lStyle = GetWindowLong(mhWndForm, -16)
    lStyle = lStyle And Not &HC00000
    SetWindowLong mhWndForm, -16, lStyle
    DrawMenuBar mhWndForm
End Sub
选项显式
#如果是VBA7,则
私有声明PtrSafe函数FindWindow Lib“User32”_
别名“FindWindowA”(_
ByVal lpClassName作为字符串_
ByVal lpWindowName(作为字符串)长度相同
私有声明PtrSafe函数GetWindowLong Lib“User32”_
别名“GetWindowLongA”(_
再见,只要_
ByVal nIndex As Long)As Long
私有声明PtrSafe函数SetWindowLong Lib“User32”_
别名“SetWindowLongA”(ByVal hwnd为Long_
ByVal nIndex只要_
ByVal dwNewLong As Long)As Long
私有声明PtrSafe函数DrawMenuBar Lib“User32”(_
ByVal hwnd As Long)一样长
#否则
私有声明PtrSafe函数FindWindow Lib“User32”_
别名“FindWindowA”(_
ByVal lpClassName作为字符串_
ByVal lpWindowName(作为字符串)长度相同
私有声明函数GetWindowLong Lib“User32”_
别名“GetWindowLongA”(_
再见,只要_
ByVal nIndex As Long)As Long
私有声明函数SetWindowLong Lib“User32”_
别名“SetWindowLongA”(ByVal hwnd为Long_
ByVal nIndex只要_
ByVal dwNewLong As Long)As Long
私有声明函数DrawMenuBar Lib“User32”(_
ByVal hwnd As Long)一样长
#如果结束
子RemoveCaption(对象为objForm)
暗色和长的一样
朦胧的花木如长
暗mhWndForm与长
如果Val(Application.Version)<9,则
mhWndForm=FindWindow(“ThunderXFrame”,objForm.Caption)”XL97
其他的
mhWndForm=FindWindow(“ThunderDFrame”,objForm.Caption)”XL2000+
如果结束
lStyle=GetWindowLong(mhWndForm,-16)
lStyle=lStyle而非&HC00000
SetWindowLong mhWndForm,-16,L样式
DrawMenuBar mhWndForm
端接头

我相信您的部分问题将来自GetWindowLongA。从该功能的文档中:

注意:如果您正在检索指针或句柄,则此函数已被GetWindowLongPtr函数取代。(指针和句柄在32位Windows上是32位的,在64位Windows上是64位的。)要编写与32位和64位版本的Windows兼容的代码,请使用GetWindowLongPtr


据我所知,这将造成问题。还值得注意的是,函数返回的值是基于操作系统的变量。IE 64位操作系统返回QWORD指针和32,但操作系统返回DWORD。

Ed,感谢您对我的问题/问题的及时回复。我正在测试对GetWindowLongPtr的更改。修改后的“我的版本代码”不会在Excel 64位上引发任何错误,除非工作表上几乎所有的下拉列表都不起作用。也许你的解决方案能解决这个问题。幸运的是,所有系统都运行Win 10或Win 7 64位操作系统。与此不同的是微软的产品。讨论中的Excel表格分发给300多人,只有一人使用64位Excel。再次感谢。将尝试您建议的更改并更新。Ed,在实现后,它确实消除了错误,但是,下拉列表在64位上仍然不起作用。其他更改会引发编译错误,也会使32位工作版本崩溃。添加
PtrSafe
以使其与64位兼容是不可能的。一些但不是所有的
Long
也需要转换为
LongPtr
。再次检查以查找64位的正确语法。•确保在程序/子程序中也使用了正确的类型。如果函数等待
Long
则必须提交
Long
如果函数等待
LongPtr
则必须提交
LongPtr
如果未正确获取,则Excel很可能崩溃。