for - vba excel pdf
Colores personalizados Excel 64-bit y comdlg32.dll (2)
Estoy intentando adaptar el código aquí o aquí para abrir la paleta de colores personalizada en Excel 2010 de 64 bits pero no puedo hacer que funcione. El código en ambos sitios funciona bien en Excel 2003
Un intento
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
Esto funciona bien pero no muestra el diálogo. También intenté cambiar algunos tipos LONG a LONGPTR sin éxito. ¿Alguien sabe cómo hacerlo funcionar en una máquina de 64 bits? o si es posible? Tal vez hay una nueva biblioteca?
Gracias
Editar: Reformulación leve con oferta de recompensa ... ¿Cómo accedo y uso este selector de color personalizado (imagen a continuación) en Excel 2010 de 64 bits (DEBE trabajar en 64 bits) para establecer celdas en Excel 2010 con el color elegido y almacenar el color? La imagen está tomada de Excel 2010 de 64 bits seleccionando el botón de relleno> más colores> Personalizado
XHTML válido http://img851.imageshack.us/img851/2057/unlednvn.png
Los archivos dll AFAIK de 32 bits no pueden ser utilizados por una aplicación de 64 bits.
Use comdlg64.dll en su lugar (si existe tal dll).
El uso de google revela que hay una gran cantidad de virus flotando en la red con ese nombre.
Entonces, si comdlg64.dll
no está en su máquina, ¡no lo descargue de la red!
(A menos que quieras experimentar zombieness).
Dos cosas que probaría. Primero, reemplace cada uso de Long
con LongPtr
.
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
Segundo, reemplace el uso de Len
con LenB
.
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
Más información