您好我正在努力为Excel 2010 64位更新VBA代码。我已经检查了所有,包括在StackOverflow上的信息性帖子:StackOverflow Question我明白我必须声明PtrSafe并在适用的地方创建LongPtr和LongLong,但我得到“编译错误。类型不匹配”的“.rgbResult”部分私人功能代码。任何和所有的帮助将不胜感激。我的代码如下:
Option Explicit
#If VBA7 Then
#If Win64 Then
Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As LongPtr
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Type ChooseColor
lStructSize As LongPtr
hwndOwner As LongPtr
hInstance As LongPtr
rgbResult As LongPtr
lpCustColors As String
flags As LongPtr
lCustData As LongPtr
lpfnHook As LongPtr
lpTemplateName As String
End Type
#Else
'{{{This Section of Code works ok so i have excluded it to save space as its the same as above without the ptr}}}}}
#End If
#Else
'{{{This Section of Code works ok so i have excluded it to save space}}}}}
#End If
#If VBA7 Then
#If Win64 Then
Private Declare PtrSafe Function ShowColor Lib "comdlg32.dll" Alias "ShowColorA" (pShowColor As ShowColor) As LongPtr
Dim ChooseColorStructure As ChooseColor
Dim Custcolor(16) As LongPtr
Dim lReturn As LongPtr
On Error GoTo ErrEnd:
ChooseColorStructure.lStructSize = LenB(ChooseColorStructure)
ChooseColorStructure.hwndOwner = FindWindow("XLMAIN", Application.Caption)
ChooseColorStructure.hInstance = 0
ChooseColorStructure.lpCustColors = StrConv(Custcolor(16), vbUnicode)
ChooseColorStructure.flags = 0
If ChooseColor(ChooseColorStructure) <> 0 Then
ShowColor = ChooseColorStructure.rgbResult
Custcolor(16) = StrConv(ChooseColorStructure.lpCustColors, vbFromUnicode)
On Error GoTo 0
Else
ShowColor = -1
End If
ErrEnd:
End Function
#Else
'{{{This Section of Code works ok so i have excluded it to save space}}}}}
#End If
#Else
'{{{This Section of Code works ok so i have excluded it to save space}}}}}
End Function
lStructSize As LongPtr
你要过分声明成员LongPtr而不是Long。仅当成员是指针或句柄类型时才应使用LongPtr,lStructSize不是指针。其他几个成员也是如此,包括rgbResult。它需要看起来像这样:
Private Type ChooseColor
lStructSize As Long
hwndOwner As LongPtr
hInstance As LongPtr
rgbResult As Long
lpCustColors As LongPtr
flags As Long
lCustData As LongPtr
lpfnHook As LongPtr
lpTemplateName As String
End Type
在搜索了一些之后,我很确定ChooseColor实际上应该是as Long
而不是as LongPtr
我做了一个谷歌搜索引用声明:“Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As LongPtr
”
我只得到了2个结果:这个问题,以及其他一些网站上的帖子,但是我读不懂,因为它是法语,我一直想要学习但却没有。
我做了一个搜索:“Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As Long
”,我得到了更多的结果,所以我认为它应该被声明为long而不是longPtr。即使在64中,仍然需要返回long而不是longPtr
这个页面:http://www.jkp-ads.com/articles/apideclarations.asp?AllComments=True在评论中提到chooseColor函数,并且它们用As Long
而不是longPtr声明它。以防万一你想参考:)