无法使颜色select器在Excel 2010 64位中工作

您好,我正在努力获取Excel 2010 64位更新的VBA代码。 我已经检查了所有,包括StackOverflow这里一个翔实的职位: StackOverflow问题我明白我必须声明PtrSafe并创buildLongPtr和LongLong适用,但我得到一个“编译错误。types不匹配”的“.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。 只有当成员是指针句柄types时,才应该使用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 

search一些之后,我很确定ChooseColor实际上应该as Long而不是as LongPtr

我做了一个谷歌search引号声明:“ Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As LongPtr

我只得到了2个结果:这个问题,并在其他网站上的post,但我不能读它,因为它是在法国,我一直有意义学习,但没有。

我做了一个search:“ Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As Long ”,我得到了更多的结果,所以我认为它应该被宣布为一个长longPtr在那一个上。 即使在64有些仍然需要返回longs而不是longPtr

编辑

这个页面: http ://www.jkp-ads.com/articles/apideclarations.asp?AllComments=True提到chooseColor函数的注释,他们用As Long而不是longPtr在那里声明。 以防万一如果你想参考:)