ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 60259|回复: 17

如果想在64位系统上使用,请检查更新declare语句,用ptrsafe属性标记它们

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-2-24 19:30 | 显示全部楼层 |阅读模式
user32.jpg
  1. Public Type POINTAPI
  2.     X As Long
  3.     Y As Long
  4. End Type
  5. Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  6. Public Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
  7. Public Popup_Menu       As CommandBar       '指定弹出式菜单
  8. Public LastSelect_Menu  As MSForms.Image    '最后选择的菜单
  9. Public MenuCount        As Integer          '子菜单数量
  10. Public hForm            As Long             '窗口句柄
  11. Public intLevel         As Integer          '级别标识,用于设置Radio菜单(游戏菜单中:初级,中级,高级)
  12. Public bAbortEnabled    As Boolean          '标识放弃菜单项是否可用
  13. Public bItemCheck       As Boolean          '标识音效菜单是否CheckOn
  14. Public bMenuSelected    As Boolean          '标识菜单是否点击
  15. Public pt               As POINTAPI         '定义点
  16. Public faceid As Integer                    '图标ID
  17. Public faceidselect As Integer              '选择的图标
  18. Public fistid As Integer                    '第一个图标号
  19. Public lastid As Integer                    '最后一个图标号
  20. Public selectrow, selectcol As Integer
  21. Public Mcro(50) As String
  22. Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
  23. Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  24. Public Const GWL_STYLE = (-16)
  25. Public Const WS_THICKFRAME As Long = &H40000     '(回復大小)
  26. Public Const WS_MINIMIZEBOX As Long = &H20000    '(最小化)
  27. Public Const WS_MAXIMIZEBOX As Long = &H10000    '(最大化)
复制代码
如何调整成支持64位系统?
如果需要32,64都支持怎么弄?

TA的精华主题

TA的得分主题

发表于 2014-2-24 19:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请参考VBA帮助
Declare 语句 PtrSafe 关键字
带有 PtrSafe 关键字的 Declare 语句为建议的语法。要使包括 PtrSafe 的 Declare 语句能同时在 32 位和 64 位平台上的 VBA7 开发环境中正确运行,必须先将 Declare 语句中所有需要存储 64 位数的数据类型(参数和返回值)更新为使用 LongLong(对于 64 位整数)或 LongPtr(对于指针和句柄)。为确保与 VBA 版本 6 和更早版本的向后兼容性,请使用下面的构造:

#If Vba7 Then
Declare PtrSafe Sub...
#Else
Declare Sub...
#EndIf

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-24 20:46 | 显示全部楼层
zhaogang1960 发表于 2014-2-24 19:35
请参考VBA帮助
Declare 语句 PtrSafe 关键字
带有 PtrSafe 关键字的 Declare 语句为建议的语法。要使包括 ...
  1. If VBA7Then
  2.     Public Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongLong
  3.     Public Declare PtrSafe Function ClientToScreen Lib "user32" (ByVal hWnd As LongLong, lpPoint As POINTAPI) As LongLong
  4.     Public Popup_Menu       As CommandBar       '指定弹出式菜单
  5.     Public LastSelect_Menu  As MSForms.Image    '最后选择的菜单
  6.     Public MenuCount        As Integer          '子菜单数量
  7.     Public hForm            As Long             '窗口句柄
  8.     Public intLevel         As Integer          '级别标识,用于设置Radio菜单(游戏菜单中:初级,中级,高级)
  9.     Public bAbortEnabled    As Boolean          '标识放弃菜单项是否可用
  10.     Public bItemCheck       As Boolean          '标识音效菜单是否CheckOn
  11.     Public bMenuSelected    As Boolean          '标识菜单是否点击
  12.     Public pt               As POINTAPI         '定义点
  13.     Public faceid As Integer                    '图标ID
  14.     Public faceidselect As Integer              '选择的图标
  15.     Public fistid As Integer                    '第一个图标号
  16.     Public lastid As Integer                    '最后一个图标号
  17.     Public selectrow, selectcol As Integer
  18.     Public Mcro(50) As String
  19.     Public Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongLong, ByVal nIndex As LongLong) As LongLong
  20.     Public Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongLong, ByVal nIndex As LongLong, ByVal dwNewLong As LongLong) As LongLong
  21.     Public Const GWL_STYLE = (-16)
  22.     Public Const WS_THICKFRAME As Long = &H40000     '(回復大小)
  23.     Public Const WS_MINIMIZEBOX As Long = &H20000    '(最小化)
  24.     Public Const WS_MAXIMIZEBOX As Long = &H10000    '(最大化)
  25. Else
  26.     Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  27.     Public Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
  28.     Public Popup_Menu       As CommandBar       '指定弹出式菜单
  29.     Public LastSelect_Menu  As MSForms.Image    '最后选择的菜单
  30.     Public MenuCount        As Integer          '子菜单数量
  31.     Public hForm            As Long             '窗口句柄
  32.     Public intLevel         As Integer          '级别标识,用于设置Radio菜单(游戏菜单中:初级,中级,高级)
  33.     Public bAbortEnabled    As Boolean          '标识放弃菜单项是否可用
  34.     Public bItemCheck       As Boolean          '标识音效菜单是否CheckOn
  35.     Public bMenuSelected    As Boolean          '标识菜单是否点击
  36.     Public pt               As POINTAPI         '定义点
  37.     Public faceid As Integer                    '图标ID
  38.     Public faceidselect As Integer              '选择的图标
  39.     Public fistid As Integer                    '第一个图标号
  40.     Public lastid As Integer                    '最后一个图标号
  41.     Public selectrow, selectcol As Integer
  42.     Public Mcro(50) As String
  43.     Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
  44.     Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  45.     Public Const GWL_STYLE = (-16)
  46.     Public Const WS_THICKFRAME As Long = &H40000     '(回復大小)
  47.     Public Const WS_MINIMIZEBOX As Long = &H20000    '(最小化)
  48.     Public Const WS_MAXIMIZEBOX As Long = &H10000    '(最大化)
  49. End If
复制代码
VBA7为无效外部引用, win7 64位系统

TA的精华主题

TA的得分主题

发表于 2014-2-24 20:50 | 显示全部楼层
wsunday 发表于 2014-2-24 20:46
VBA7为无效外部引用, win7 64位系统
  1. #If Win64 Then
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-25 09:21 | 显示全部楼层
zhaogang1960 发表于 2014-2-24 20:50

顺便问一句if前  加  # 跟不加  #号的主要区别是啥?

TA的精华主题

TA的得分主题

发表于 2014-2-25 10:40 | 显示全部楼层
wsunday 发表于 2014-2-25 09:21
顺便问一句if前  加  # 跟不加  #号的主要区别是啥?

#If...Then...#Else 条件编译指令
条件编译已选择的 Visual Basic 代码块。
简单的说就是若条件成立就编译。是编译而不是执行。

TA的精华主题

TA的得分主题

发表于 2014-2-25 12:05 | 显示全部楼层
wsunday 发表于 2014-2-25 09:21
顺便问一句if前  加  # 跟不加  #号的主要区别是啥?

举例(请注意:PtrSafe不是Excel2003的语句,不能用在2003):
  1. #If Win64 Then
  2.     Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  3. #Else
  4.     Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  5. #End If
复制代码

TA的精华主题

TA的得分主题

发表于 2014-2-25 12:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-2-25 13:33 | 显示全部楼层
所以说  啊,,,要想用64位  win8的系统,,要修改不少东西啊,,

TA的精华主题

TA的得分主题

发表于 2015-3-29 15:50 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-29 22:28 , Processed in 0.041848 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表