Excel 64位和comdlg32.dll自定义颜色

osk*_*ows 4 excel vba excel-vba

我正在尝试调整此处此处的代码以在Excel 2010 64位中打开自定义调色板但无法使其工作.两个站点上的代码在Excel 2003中运行良好

一次尝试

 Option Explicit

 Private Type CHOOSECOLOR
 lStructSize As Long
 hwndOwner As Long
 hInstance As Long
 rgbResult As Long
 lpCustColors As String
 flags As Long
 lCustData As Long
 lpfnHook As Long
 lpTemplateName As String
 End Type

 Private Declare PtrSafe Function ChooseColorAPI Lib "comdlg32.dll" Alias _
 "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long

 Dim CustomColors() As Byte

 Private Sub Command1_Click()
   Dim cc As CHOOSECOLOR
   Dim Custcolor(16) As Long
   Dim lReturn As Long
   cc.lStructSize = Len(cc)
   cc.hwndOwner = Application.Hwnd
   cc.hInstance = 0
   cc.lpCustColors = StrConv(CustomColors, vbUnicode)
   cc.flags = 0
   lReturn = ChooseColorAPI(cc)
   If lReturn <> 0 Then
       Application.Caption = "RGB Value User Chose: " & Str$(cc.rgbResult)
       Application.BackColor = cc.rgbResult            ' Visual Basic only ****
       Application.Section(0).BackColor = cc.rgbResult ' Access only **********
       CustomColors = StrConv(cc.lpCustColors, vbFromUnicode)
   Else
       MsgBox "User chose the Cancel Button"
   End If
   End Sub

   Private Sub Form_Load()
   ReDim CustomColors(0 To 16 * 4 - 1) As Byte
   Dim i As Integer

   For i = LBound(CustomColors) To UBound(CustomColors)
       CustomColors(i) = 0
   Next i
   End Sub
Run Code Online (Sandbox Code Playgroud)

这运行正常,但不显示对话框.我也尝试将一些LONG类型更改为LONGPTR但没有成功.有谁知道如何在64位机器上工作; 或者如果可能的话?也许有一个新的图书馆?

谢谢

编辑:稍微重新提供赏金...如何在Excel 2010 64位中使用此自定义颜色选择器(下图)(必须在64位上工作!)以选择颜色在Excel 2010中设置单元格并存储颜色?通过选择填充按钮>更多颜色>自定义,从Excel 2010 64位中获取图像

有效的XHTML http://img851.imageshack.us/img851/2057/unlednvn.png

Tho*_*mas 6

我会尝试两件事.首先,更换一个要使用LongLongPtr.

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

Private Declare PtrSafe Function ChooseColorAPI Lib "comdlg32.dll" Alias _
    "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongPtr
Run Code Online (Sandbox Code Playgroud)

二,更换使用的LenLenB.

Private Sub Command1_Click()
    Dim cc As CHOOSECOLOR
    Dim Custcolor(16) As LongPtr
    Dim lReturn As LongPtr

    cc.lStructSize = LenB(cc)
    cc.hwndOwner = Application.Hwnd
    cc.hInstance = 0
    cc.lpCustColors = StrConv(CustomColors, vbUnicode)
    cc.flags = 0
    lReturn = ChooseColorAPI(cc)

    If lReturn <> 0 Then
       Application.Caption = "RGB Value User Chose: " & Str$(cc.rgbResult)
       Application.BackColor = cc.rgbResult            ' Visual Basic only ****
       Application.Section(0).BackColor = cc.rgbResult ' Access only **********
       CustomColors = StrConv(cc.lpCustColors, vbFromUnicode)
    Else
       MsgBox "User chose the Cancel Button"

    End If
End Sub

Private Sub Form_Load()
    ReDim CustomColors(0 To 16 * 4 - 1) As Byte
    Dim i As Integer

    For i = LBound(CustomColors) To UBound(CustomColors)
       CustomColors(i) = 0
    Next i
End Sub
Run Code Online (Sandbox Code Playgroud)

更多信息

LongPtr数据类型

LenB功能