【问题标题】:Cannot get the Color Picker to work in Excel 2010 64 Bit无法让拾色器在 Excel 2010 64 位中工作
【发布时间】:2025-11-27 14:30:02
【问题描述】:

您好,我正在努力为 Excel 2010 64 位更新 VBA 代码。我已经检查了所有内容,包括 * 上的一篇信息性帖子:* 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

【问题讨论】:

  • 不知道这是否会做很多事情,但我很确定 findwindow 函数需要用As LongPtr 声明,而你用as Long 来声明它
  • 另外,在发布的问题中,选择颜色功能是:ChooseColorAPI 而不是你的:ChooseColor
  • 啊,我明白了。好的,我会进行更新。如果您或任何人看到其他任何东西,我真的很感激。我一直在使用客户机器进行测试,所以我现在无法检查。谢谢ssssss
  • 是的,在其他帖子中,它们是不同的。我试图尽可能多地从那个中获取,但是我的代码仍然完全不同。

标签: vba excel 64-bit color-picker


【解决方案1】:

在搜索了更多之后,我很确定 ChooseColor 实际上应该是 as Long 而不是 as LongPtr

我在 Google 上搜索了声明的引号:“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 中,有些仍然需要返回 longs 而不是 longPtr

编辑

这个页面:http://www.jkp-ads.com/articles/apideclarations.asp?AllComments=True 在 cmets 中提到了 chooseColor 函数,他们用 As Long 声明了它,而不是那里的 longPtr。以防万一您需要参考:)

【讨论】:

  • 好吧,我肯定会尝试一下。解释是有道理的。我是一个比较业余的 VBA 程序员,很少使用 Functions,这个 64 位真的让我陷入了循环
  • 哈,没有问题,我也是,但我在 2 个月前被扔进了一个大型 VBA 项目,所以它现在对我来说要么飞要么死 XP 我什至不知道 @987654327 是什么@ 是,或者类似的 API 调用存在于 VBA 中。花了一整天的时间来弄清楚如何使用findwindowsendmessage 关闭 Windows 资源管理器窗口,然后我在 64 位机器上对其进行了测试,那是半天的时间来弄清楚该怎么处理那个.. . 感谢上帝为我链接的网站,它救了我的培根
【解决方案2】:
   lStructSize As LongPtr

您过分声明成员 LongPtr 而不是 Long。 LongPtr 应该只在成员是 pointerhandle 类型时使用,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

【讨论】:

  • 那是否意味着 longPtr 代表 Long Pointer 那么?
  • 是的,“Ptr”表示指针。
  • 谢谢,我也没有。我真的需要快速学习这些东西,因为越来越多的人采用 64 位。我觉得我在这里落后了。 (今晚将在我的客户机器上测试此代码,以便获得适当的反馈)我非常感谢您的帮助。 (然后这个周末去买一台新的 64 位机器)
  • 非常感谢您的帮助。我能够通过删除不必要的 Ptr 来使其工作。我还必须确保我的副本包含“BLen”而不是 Len。非常感谢。