¿Cómo puedo usar colores personalizados en el editor de Microsoft VBA?

33

Estoy trabajando en algunos proyectos para trabajar con Excel y VBA, así que no tengo más remedio que usar el editor de Microsoft Visual Basic. Normalmente no me importaría, pero no puedo entender cómo configurar un color personalizado para el editor (solo puedo elegir de la paleta predeterminada).

Para cambiar el color actualmente, voy a Tools -> Options -> Editor Format... Sin embargo, sus opciones solo se limitan a los 16 colores predeterminados (y básicos), y cuando digo básico, me refiero a básico , como rosa, azul, negro, blanco, etc. ..

¿Alguien sabe cómo especificar un color personalizado o, como mínimo, cambiar algunos de los colores que aparecen en la paleta predeterminada?

Penetración
fuente
Creo que lo que Microsoft está tratando de decirnos es que no quieren que las personas programen en VBA. O tal vez Bill Gates es un gran productor de analgésicos.
Holene

Respuestas:

19

VBA lee la configuración de los colores de estas claves de registro:

HKEY_CURRENT_USER \ Software \ Microsoft \ VBA \ 6.0 \ Common \ CodeForeColors HKEY_CURRENT_USER \ Software \ Microsoft \ VBA \ 6.0 \ Common \ CodeBackColors

Cada una de estas claves contiene una lista de valores (separados por espacio) para cada entrada dentro de Herramientas -> Opciones -> Formato del editor. Por ejemplo, el primer valor dentro de CodeBackColors es el color de fondo y el primer valor dentro de CodeForeColors es el color de primer plano para el texto normal. Los valores son la identificación interna del color, 0 significa coloración AUTO, 11 muestra cian, 5 rojo, etc.

Para intentarlo: cierre Excel, cambie el primer valor de CodeBackColors a 5 y reinicie Excel. El fondo del editor de código ahora será rojo.

El problema es que el Editor de VBA solo admite estos valores internos y el número más alto que entiende es 16. Cualquier otro valor no será aceptado y su valor predeterminado es AUTO.

He intentado varias opciones para ingresar valores diferentes (por ejemplo, 128255128, 16777215, #aaffee, 255 o "170,255,238") y ninguna de ellas funcionó.

Por lo tanto, creo que técnicamente no es posible asignar otros colores.

Tex Hex
fuente
1
Gracias por la respuesta. IIRC, no puede retirar una recompensa, pero si literalmente no puede hacer esto, entonces se la otorgaré por la respuesta más correcta. Quiero esperar un poco más para ver si hay más respuestas publicadas, pero gracias por su respuesta, +1.
Avance el
1
Tengo que admitir que eso suena aún mejor :)
Tex Hex
"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) de FMS tiene una herramienta "VBE Color Scheme manager para ver y configurar fácilmente los colores para su editor". Si descarga el manual del usuario (un PDF), muestra capturas de pantalla que, si bien facilita la configuración de los colores, todavía se limita a una paleta de 16 colores. Pensaría que si hubiera una forma directa de usar colores personalizados, la habrían incluido en esta herramienta. Parece que Tex Hex es correcto.
Brian
Como ahora se ha demostrado con las respuestas a continuación que es posible, esta respuesta debería modificarse. Es posible cambiar de manera confiable los colores en el Editor VBA usando un editor HEX.
Steven Martin
16

Creé una aplicación basada en la información que se encuentra aquí: https://github.com/dimitropoulos/VBECustomColors

Básicamente hace una copia de seguridad del archivo .dll VBE6 / VBE7 y permite el uso de colores personalizados sin tener que usar un editor hexadecimal.

ss

Puede descargarlo aquí: https://github.com/gallaux/VBEThemeColorEditor

Disfrutar

Editar: ¡El código fuente ya está disponible!

gallaux
fuente
Wow super genial, gracias por compartir @gallaux - Definitivamente voy a ver esto ¿Estás planeando lanzar el código fuente por curiosidad?
Avance el
Sí, lo haré pronto, solo necesito limpiarlo un poco;)
gallaux
Gracias Gallaux, tenía la intención de hacer lo mismo, pero una vez que obtuve mi editor de vba para el esquema de color que me gustaba, ¡perdí esa motivación porque ya no estaba tan "frustrado por la fatiga visual de 16 colores"!
Steven Martin
1
Lo siento, cómo aplicar esto, necesito ayuda
Pedro Miguel Pimienta Morales
1
@YouCrackedMeUp necesita actualizar la clave de registro usando regedit (basado en github.com/dimitropoulos/VBECustomColors ): [1] Navegue en regedit a HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] El cambio CodeBackColorsa: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] El cambio CodeForeColorsa: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] El cambio FontFacea: Consolas.
Tigregalis
7

TeX HeX es perfecto. Sin embargo, ES posible cambiar los 16 colores incorporados con los suyos. Solo requiere un poco de edición hexadecimal. Aquí hay una guía paso a paso. (Nota: Esto es para VB6 SP6, versión de archivo 6.0.97.82).

  1. Haga una copia de seguridad de su archivo VB6.EXE en su carpeta de programa VB98. (Opcional, pero recomendado).

  2. Encienda su editor hexadecimal favorito (grite a HxD) y abra VB6.EXE.

  3. Salte a la dirección 0xE22F4. Este es el comienzo de la tabla de colores.

Deberías ver cuatro ceros. Esto representa el color negro en formato RRGGBBAA (alfa no es compatible, por lo que en realidad es solo formato RRGGBB00). Los siguientes cuatro bytes especifican el siguiente color y así sucesivamente hasta llegar a FFFFFF00 (blanco) que termina en el desplazamiento 0xE2333.

  1. Edite cualquiera de estos valores de cuatro bytes a su elección. Simplemente use los valores hexadecimales apropiados en formato RGB, seguidos de un byte cero. Por ejemplo, RGB (64, 128, 192) sería 40 80 C0 00.

  2. Guarde sus cambios en el EXE y encienda VB6. Debería ver sus nuevos colores en las ranuras ocupadas anteriormente por los colores VB incorporados.

Enlace
fuente
1
Hmm, busqué con la herramienta todo en un sistema con Office 2003 y no encuentra ningún archivo llamado VB6.exe o una carpeta VB98. ¿Es esta respuesta solo para Office 2007 como la OP? Sin embargo, la versión 6.0.97.82 es más antigua que la mía con Office 2003.
nixda
1
@nixda Nada en mi sistema tampoco: creo que Bond se refiere a la aplicación VB6 en su sistema, no al VBA integrado en Excel. Voy a echar un vistazo a través del ejecutable de Excel y algunas de las DLL de VBA, y ver si puedo encontrar alguna tabla de colores.
Avance
1
Tengo Office 2010 en mi PC, así que tengo VBE7.DLL, no VBE6.DLL, pero debería ser el mismo proceso. Los colores son iguales. Si observa los colores en el orden en que se muestran, deberían ser: Negro = 00 00 00 00 Azul marino = 00 00 80 00 Verde = 00 80 00 00 Turquesa = 00 80 80 00 Magenta = 80 00 00 00 Violeta = 80 00 80 00 Oliva = 80 80 00 00 Gris Lgt = C0 C0 C0 00 Gris Drk = 80 80 80 00 ... He agregado los códigos de color hexadecimales al lado de cada uno. Tan solo abra VBE6.DLL en un editor hexadecimal y busque la siguiente cadena hexadecimal:
Bono
1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Puede ocurrir varias veces, pero he descubierto que la primera tabla de colores es todo lo que necesita ser modificado. Mira si eso te funciona.
Bond
1
Impresionante respuesta, Bond. Para los futuros lectores, la clave que necesitaba cambiar era la segunda (Office 2013, Windows 8.1), ubicada en '12 50B4' usando Hex Edit (Byte No. 1,200,308)
Andy Terra
5

Como muchos han notado, la solución de Bond (edición hexadecimal de la tabla de colores en VB6.exe) funcionará, pero deberá ingresar y restablecer sus colores en el cuadro de diálogo de opciones cada vez que inicie VB6. He creado un script AutoIt que hará todo el trabajo por usted, solo edítelo según sea necesario donde se realicen todas las llamadas a SetSyntaxColoring ():

Opt("WinTitleMatchMode", 2)
Opt("MouseClickDelay", 1)
Opt("MouseClickDownDelay", 1)
Opt("MouseClickDragDelay", 1)
Opt("SendKeyDelay", 1)
Opt("SendKeyDownDelay", 1)

Const $NORMALTEXT = 0
Const $SELECTIONTEXT = 1
Const $SYNTAXERRORTEXT = 2
Const $EXECUTIONPOINTTEXT = 3
Const $BREAKPOINTTEXT = 4
Const $COMMENTTEXT = 5
Const $KEYWORDTEXT = 6
Const $IDENTIFIERTEXT = 7
Const $BOOKMARKTEXT = 8
Const $CALLRETURNTEXT = 9

Const $AUTO = 0
Const $BLACK = 1
Const $DARKBLUE = 2
Const $DARKGREEN = 3
Const $DARKRED = 4
Const $DARKBABYBLUE = 5
Const $DARKPINK = 6
Const $DARKYELLOW = 7
Const $LIGHTGRAY = 8
Const $DARKGRAY = 9
Const $BLUE = 10
Const $GREEN = 11
Const $BABYBLUE = 12
Const $RED = 13
Const $PINK = 14
Const $YELLOW = 15
Const $WHITE = 16

If WinExists( "Microsoft Visual Basic" ) Then
   WinActivate("Microsoft Visual Basic") ; activates the visual basic window
   Send("!+to") ; opens the options menu
   Sleep(10)
   WinMove("Options", "", 0, 0) ; moves the options menu to the upper left corner of the screen
   MouseClick("primary", 100, 50, 1, 0) ; clicks the editor tab

   SetSyntaxColoring($NORMALTEXT, $WHITE, $BLACK)
   SetSyntaxColoring($SELECTIONTEXT, $AUTO, $AUTO)
   SetSyntaxColoring($SYNTAXERRORTEXT, $BLACK, $YELLOW)
   SetSyntaxColoring($EXECUTIONPOINTTEXT, $AUTO, $YELLOW)
   SetSyntaxColoring($BREAKPOINTTEXT, $WHITE, $DARKRED)
   SetSyntaxColoring($COMMENTTEXT, $DARKGREEN, $BLACK)
   SetSyntaxColoring($KEYWORDTEXT, $GREEN, $BLACK)
   SetSyntaxColoring($IDENTIFIERTEXT, $WHITE, $BLACK)
   SetSyntaxColoring($BOOKMARKTEXT, $WHITE, $BLACK)
   SetSyntaxColoring($CALLRETURNTEXT, $WHITE, $GREEN)

   MouseClick("primary", 210, 340, 1, 0) ; hit the ok button to apply the changes
EndIf

Func SetSyntaxColoring($syntax, $forecolor, $backcolor)
   SelectSyntax($syntax)
   SelectForecolor($forecolor)
   SelectBackcolor($backcolor)
EndFunc

Func SelectSyntax($syntax)
   ResetSyntaxList()
   RptSend("{DOWN}", $syntax)
EndFunc

Func SelectForecolor($color)
   ResetForecolorCbo()
   RptSend("{DOWN}", $color)
EndFunc

Func SelectBackcolor($color)
   ResetBackcolorCbo()
   RptSend("{DOWN}", $color)
EndFunc

Func ResetSyntaxList()
   MouseClick("primary", 50, 95, 1, 0)
   RptSend("{UP}", 9)
EndFunc

Func ResetForecolorCbo()
   MouseClick("primary", 50, 235, 1, 0)
   MouseClick("primary", 50, 235, 1, 0)
   RptSend("{UP}", 16)
EndFunc

Func ResetBackcolorCbo()
   MouseClick("primary", 125, 235, 1, 0)
   MouseClick("primary", 125, 235, 1, 0)
   RptSend("{UP}", 16)
EndFunc

Func RptSend($text, $rpt)
   For $i = 1 To $rpt
      Send($text)
   Next
EndFunc

Simplemente lo mantengo en mi escritorio y ahora, cuando tengo que abrir vb6, simplemente hago doble clic en él y, al igual que ese color de sintaxis, está bajo mi control.

Edición 1: Optimicé un poco el script para que se ejecute más rápido. Estoy pensando en crear un programa que edite VB6.EXE automáticamente para que pueda facilitar la selección de color. Me pregunto si hay una manera de deshacerse del script AutoIt creando un complemento para VS.

Edición 2: creó una utilidad que le permite editar los colores en el exe sin tener que usar un editor hexadecimal: VbClassicColorEditor . Ese enlace va al repositorio público en bitbucket.

Dylan Nissley
fuente
¡Gracias por el guión y contribución! ¿Hay alguna posibilidad de que podamos obtener un enlace actualizado en VbClassicColorEditor? El que publicaste tiene 404d ...
Andy Terra
3

Solo quería publicar un resumen de las respuestas anteriores, ya que no está del todo claro qué se debe hacer para cambiar los colores en el Editor de Excel VBA

En el ejemplo a continuación, agrego el esquema de color para Solarized y supongo el uso de Office 2010

Paso 0: Realice una copia de seguridad del VBE7.dll antes de modificarlo: ¡se le ha advertido!

Paso 1: en un editor hexadecimal, abra el VBE7.dll ubicado @

"C:\Program Files\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" para 64 bits

o

"C:\Program Files( x86)\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" para 32 bits

Paso 2: Encuentra la primera aparición de

ff ff ff 00 c0 c0 c0 00 80 80 80 00 00 00 00 00
ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00 00
00 ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00
00 00 ff 00 00 00 80 00 ff 00 ff 00 80 00 80 00`

y reemplazar con

00 2b 36 00 07 36 42 00 58 6e 75 00 65 7b 83 00
83 94 96 00 93 a1 a1 00 ee e8 d5 00 fd f6 e3 00
b5 89 00 00 cb 4b 16 00 dc 32 2f 00 d3 36 82 00
6c 71 c4 00 26 8b d2 00 2a a1 98 00 85 99 00 00

Paso 3: encuentre la segunda aparición de esto (asegúrese de buscar desde la parte superior del archivo)

00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00
80 00 00 00 80 00 80 00 80 80 00 00 c0 c0 c0 00
80 80 80 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

y reemplazar con

00 2b 36 00 07 36 42 00 58 6e 75 00 65 7b 83 00
83 94 96 00 93 a1 a1 00 ee e8 d5 00 fd f6 e3 00
b5 89 00 00 cb 4b 16 00 dc 32 2f 00 d3 36 82 00
6c 71 c4 00 26 8b d2 00 2a a1 98 00 85 99 00 00

Paso 4: guarde el archivo dll y luego abra Excel> Editor VBA> Herramientas> Opciones> Formato del editor y configure los colores del código.

El cambio de ambas cadenas es muy complejo, ya que permite que los colores se guarden correctamente al apagar y permite que el editor de colores se abra sin sobresalir.

¡Gracias a todos los respondedores anteriores por dedicar tiempo a resolver esto!

Steven Martin
fuente
3

Creé un programa que automatiza todo esto, pasé demasiado tiempo en él, me divertí creando un selector de color. Hecho en VB6 porque por qué no. Programa compilado y código fuente disponible aquí . Probado solo en mis versiones de las DLL y VB6, haga copias de seguridad antes de cambiar cualquier cosa: las ubicaciones están fijadas en el código.



Esta es una pregunta muy antigua, pero me gustaría evaluar la integridad

Para colores VS2012 en VBA o VB6 IDE: Abra VBE6.DLL / VBE7.DLL o VBA6.DLL en

C:\Program Files (x86)\Common Files\microsoft shared\VBA\
or
C:\Program Files (x86)\VB98\ (Your VB6 install location)

con tu editor hexadecimal

Reemplazar la primera aparición de

ff ff ff 00 c0 c0 c0 00 80 80 80 00 00 00 00 00
ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00 00
00 ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00
00 00 ff 00 00 00 80 00 ff 00 ff 00 80 00 80 00

Con

ff ff ff 00 1e 1e 1e 00 d4 d4 d4 00 00 00 00 00
ff 00 00 00 26 4f 78 00 ff ff 00 00 d6 9d 85 00
00 ff 00 00 60 8b 4e 00 00 ff ff 00 00 80 80 00
00 00 ff 00 56 9c d6 00 ff 00 ff 00 9f 74 b1 00

Luego regrese a la parte superior y reemplace la segunda aparición de

00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00
80 00 00 00 80 00 80 00 80 80 00 00 c0 c0 c0 00
80 80 80 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

con

00 00 00 00 56 9c d6 00 60 8b 4e 00 d6 9d 85 00
26 4f 78 00 9f 74 b1 00 d6 9d 85 00 1e 1e 1e 00
d4 d4 d4 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

Luego modifique lo siguiente en el registro

(For VBA)
HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common    
HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common

(For VB6)
HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic 

FontFace = 'Consolas'
CodeForeColors = '8 3 5 4 1 10 14 3 4 4 0 0 0 0 0 0 '
CodeBackColors = '2 6 4 8 10 2 2 2 16 10 11 12 13 14 15 0 '

Si está modificando para VBA ya está hecho, para VB6 ahora abra 'VB6.exe' en su editor Hex y modifique la primera aparición de

00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00
80 00 00 00 80 00 80 00 80 80 00 00 c0 c0 c0 00
80 80 80 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

con

00 00 00 00 56 9c d6 00 60 8b 4e 00 d6 9d 85 00
26 4f 78 00 9f 74 b1 00 d6 9d 85 00 1e 1e 1e 00
d4 d4 d4 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

Esto corrige el color que se muestra en la interfaz de VB6, de modo que si desea realizar otros cambios en los colores, puede hacerlo.

Gracias a todas las otras respuestas, no se me ocurrió esto solo, pensé que era útil tener toda la información requerida en una sola publicación (en ninguna parte vi modificar VB6.exe y VBA6.dll juntos). Con este método, debería poder seleccionar libremente entre los colores disponibles.

También reordené los colores de algunas de las otras respuestas para no cambiar vbRed, vbBlue, vbWhite, etc., por lo que aún debería obtener el resultado deseado en el código. Esto no se ha probado completamente, por lo que siempre debe modificar los programas bajo su propio riesgo.

Sería bueno armar un pequeño programa que haga esto por usted (como lo hizo gallaux), tuve problemas para escribir en el registro y el IDE de VB6 usando ese programa, y ​​aparecería una especie de ventana de vista previa sería bueno.

Limitaciones que he encontrado: esto no cambia el color de los íconos indicadores, debe hacerlo usted mismo.

Sam
fuente
2

Tomando el anzuelo de la respuesta de dnissley (donde pregunta si alguien podría hacer un complemento), hice un complemento para VB6. Es un poco crudo (y explicaré por qué en breve), pero hace el trabajo.

Creé un nuevo proyecto de Complemento en VB6 que me dio la forma predeterminada "frmAddin" (que no uso) y el diseñador "Connect". Yo mismo agregué una clase de Color que contiene lo siguiente:

Opción explícita

Dim m_iForeColour As Integer
Dim m_iBackColour As Integer
Dim m_iIndicatorColour As Integer

Propiedad pública Let ForeColour (ByVal iID As Integer)
    m_iForeColour = iID
Terminar propiedad
Propiedad pública Obtenga ForeColour () como entero
    ForeColour = m_iForeColour
Terminar propiedad

Propiedad pública Let BackColour (ByVal iID As Integer)
    m_iBackColour = iID
Terminar propiedad
Propiedad pública Get BackColour () como entero
    Color de fondo = m_iBackColour
Terminar propiedad

Propiedad pública Let IndicaColour (ByVal iID As Integer)
    m_iIndicatorColour = iID
Terminar propiedad
Propiedad pública Obtener IndicatorColour () como entero
    IndicatorColour = m_iIndicatorColour
Terminar propiedad

Y luego modifiqué el código en el Diseñador "Connect" para que sea el siguiente:

Opción explícita

Formulario público Se muestra como booleano
VBInstance público como VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
Dim mfrmAddIn como nuevo frmAddIn
Public WithEvents MenuHandler como controlador de eventos de la barra de comandos de CommandBarEvents

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 As CommandBarEvents

Dim codeColours () As Color

'************************************************* ****************************
'RunScript Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Ejecuta el código que establece los colores requeridos para la ventana de código en el
'IDE activo.
'*** UN PROYECTO DEBE SER CARGADO ANTES DE QUE REALMENTE FUNCIONE ***
'************************************************* ****************************
Sub RunScript ()
    ReadColoursFile

    'Seleccione Herramientas> Opciones
    SendKeys "% to", 5
    'Vaya a pestañas, seleccione "Opciones"
    SendKeys "+ {TAB}"
    SendKeys "{DERECHA}"

    'Seleccionar cuadro de lista
    SendKeys "{TAB}"

    Color tenue Configuración como color
    Dim iColour como entero

    Para iColour = 0 a 9
        SetColours iColour, codeColours (iColour)
    Siguiente iColour

    SendKeys "~"
End Sub

'************************************************* ****************************
'ReadColoursFile Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Lee el archivo de color del disco y llena la matriz codeColours que
'es utilizado por los métodos SetColour * para seleccionar los colores correctos de
'la pantalla de opciones.
'************************************************* ****************************
Sub ReadColoursFile ()
    Color tenue Línea como cuerda
    Dim colourArray () como cadena
    Color tenue Configuración como color
    Dim oFSO como FileSystemObject

    Establecer oFSO = New FileSystemObject

    Si no es oFSO.FileExists (App.Path & "\ VB6CodeColours.dat") Entonces
        MsgBox "VB6CodeColours.dat no encontrado en" & App.Path, vbOKOnly, "¡No se encontró el archivo de configuración VB6CodeColours!
        Salir Sub
    Terminara si

    Establecer oFSO = Nada

    Abra App.Path y "\ VB6CodeColours.dat" para la entrada como # 1
    ReDim codeColours (9) como color

    Aunque no es EOF (1)
        Entrada de línea n. ° 1, colorLínea
        colourArray = Split (colourLine, ",")

        If IsNumeric (colourArray (0)) Entonces
            Si codeColours (colourArray (0)) no es nada entonces
                Establecer colourSetting = Nuevo color

                If IsNumeric (colourArray (1)) Entonces
                    colourSetting.ForeColour = CInt (colourArray (1))
                Terminara si

                If IsNumeric (colourArray (2)) Entonces
                    colourSetting.BackColour = CInt (colourArray (2))
                Terminara si

                If IsNumeric (colourArray (3)) Entonces
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                Terminara si

                Establecer codeColours (colourArray (0)) = colourSetting
            Terminara si
        Terminara si
    Encaminarse a

    Cerrar # 1

    Establecer colourSetting = Nada
End Sub

'************************************************* ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Selecciona el elemento de color de la lista y luego itera el selector de color
'controles asociados con ese elemento y los establece de acuerdo con los valores
'establecido en el archivo VB6CodeColours.dat.
'************************************************* ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colourSetting As Color)
    Dim iKey como entero

    SendKeys "{HOME}"

    Para iKey = 1 a iColour
        SendKeys "{DOWN}"
    Siguiente iKey

    SetColourSelector colourSetting.ForeColour
    SetColourSelector colourSetting.BackColour
    SetColourSelector colourSetting.IndicatorColour

    SendKeys "+ {TAB}"
    SendKeys "+ {TAB}"
    SendKeys "+ {TAB}"
End Sub

'************************************************* ****************************
'SetColourSelector Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Establece el color en el combo selector. Asume que el foco está en el
'precede al control antes de ejecutar el código (pestañas de primera línea para
'control asumido).
'************************************************* ****************************
Sub SetColourSelector (ByVal iColour As Integer)
    Dim iKey como entero

    SendKeys "{TAB}"
    SendKeys "{HOME}"

    Para iKey = 1 a iColour
        SendKeys "{DOWN}"
    Siguiente iKey
End Sub

'************************************************* ****************************
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Este método se ejecuta cuando el complemento es cargado por el IDE
'************************************************* ****************************
Private Sub AddinInstance_OnConnection (aplicación ByVal como objeto, ByVal ConnectMode como AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst como objeto, personalizado () como variante)
    En error GoTo ErrorHandler

    'guardar la instancia de vb
    Establecer VBInstance = Aplicación

    Si ConnectMode ext_cm_External entonces
        Establecer mcbMenuCommandBar = AddToAddInCommandBar ("Coloración de código VB6")
        'hundir el evento
        Establecer Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

        Dim oStdToolbar As Office.CommandBar
        Dim oStdToolbarItem As Office.CommandBarControl

        Establecer oStdToolbar = VBInstance.CommandBars ("Estándar")
        Establecer oStdToolbarItem = oStdToolbar.Controls.Add (Tipo: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Establecer colores IDE"
        oStdToolbarItem.BeginGroup = True
        Establecer Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    Terminara si

    Salir Sub
ErrorHandler:
    MsgBox Err.Description
End Sub

'************************************************* ****************************
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Este método se ejecuta cuando el complemento es eliminado por el IDE y limpia cualquier
'referencias etc.
'************************************************* ****************************
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom () Como Variante)
    En error Reanudar a continuación

    'eliminar la entrada de la barra de comandos
    mcbMenuCommandBar.Delete

    'apague el complemento
    Si se muestra el formulario entonces
        SaveSetting App.Title, "Configuración", "DisplayOnConnect", "1"
        FormDisplayed = False
    Más
        SaveSetting App.Title, "Configuración", "DisplayOnConnect", "0"
    Terminara si

    Descargar mfrmAddIn
    Establecer mfrmAddIn = Nada

    Establecer MenuHandler = Nada
    Establecer MenuHandler2 = Nada
End Sub

'************************************************* ****************************
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Este método realiza las tareas necesarias cuando se hace clic en el elemento del menú.
'************************************************* ****************************
Private Sub MenuHandler_Click (ByVal CommandBarControl As Object, manejado como Boolean, CancelDefault As Boolean)
    Ejecutar guión
End Sub

'************************************************* ****************************
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Este método realiza las tareas necesarias cuando se hace clic en el botón de la barra de herramientas.
'************************************************* ****************************
Private Sub MenuHandler2_Click (ByVal CommandBarControl As Object, manejado como Boolean, CancelDefault As Boolean)
    Ejecutar guión
End Sub

'************************************************* ****************************
'AddToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
'DESCRIPCIÓN:
'Agrega el elemento especificado a la lista del menú.
'************************************************* ****************************
Función AddToAddInCommandBar (sCaption As String) como Office.CommandBarControl
    Dim cbMenuCommandBar como objeto de barra de comandos de Office.CommandBarControl
    Dim cbMenu As Object

    En error Reanudar a continuación

    'ver si podemos encontrar el menú Complementos
    Establecer cbMenu = VBInstance.CommandBars ("Complementos")
    Si cbMenu no es nada entonces
        'no disponible así que fallamos
        Función de salida
    Terminara si

    En error GoTo ErrorHandler

    'agregarlo a la barra de comandos
    Establecer cbMenuCommandBar = cbMenu.Controls.Add (1)
    'establecer el título
    cbMenuCommandBar.Caption = sCaption

    Establecer AddToAddInCommandBar = cbMenuCommandBar

    Función de salida
ErrorHandler:
    'Salir con gracia
Función final

Este código permite que la aplicación lea los colores que quiero de un archivo que reside en el mismo directorio que el .dll (llamado VB6CodeColours.dat). Este archivo contiene lo siguiente (y variará según los colores que reemplace en el VB6.EXE, por lo que una copia y pegado directo probablemente no funcione.

0,14,12,0
1,0,0,0
2,16,13,0
3,0,15,15
4,16,5,5
5,7,12,0
6,11,12,0
7,8,12,0
8,16,10,10
9,16,3,3

Parece galimatías, pero te lo explicaré. Tiene el formato "Código de color", "Primer plano", "Fondo", Indicador ", por lo que la fila superior establecerá el" Texto normal "en el 14º elemento del combo para Primer plano, el 12º para Fondo y el 1º para el Indicador .

Por qué dije que es una solución bastante cruda: * Utiliza SendKeys. No necesito más explicaciones allí, estoy seguro :) * El usuario debe hacer clic en la opción del menú / barra de herramientas para que surta efecto. * El código no está mejor estructurado (en mi opinión) pero se basó en la cantidad de tiempo que podía dedicarle en ese momento. Mi objetivo es mejorarlo en el futuro, pero funciona bien para mí en el estado actual (¡así que probablemente lo dejaré!)

Quizás con una base, alguien puede ampliarlo aún más.

jonifen
fuente
2

Aquí está el truco de cómo mantener su selección de color permanente. Un poco más de edición hexadecimal. Si realizó el reemplazo sugerido por Bond , debe tener a mano lo siguiente: valores RGBA para 16 colores básicos (clásicos) indexados de 0 a 15, y valores RGBA para sus colores personalizados indexados de la misma manera. Ahora busque VBEx.DLL para la secuencia de bytes construida a partir de valores RGBA "clásicos" ordenados en la siguiente secuencia de índices: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (es decir, blanco, gris, gris oscuro, negro, rojo, rojo oscuro, etc.). El patrón no es aleatorio, se deriva de valores, almacenados en el registro, vea la publicación de Tex Hex. La cadena hexadecimal para la búsqueda debería verse como 'FFFFFF00C0C0C0008080800000000000FF000000 ...', etc. 64 bytes en total. Reemplace la secuencia de bytes encontrados con valores RGBA de colores "personalizados" ordenados de la misma manera, por ejemplo, 15, 7, 8, etc. Ahora todos los colores que elija en VS UI se almacenarán en el registro y se aplicarán después del reinicio de la aplicación. Bueno, todos, pero los colores "indicadores". Estos siempre se restablecen a los valores predeterminados. Notas:

  1. En VBE7.DLL (MSO2010) he encontrado solo una secuencia de bytes ordenados de esta manera en el desplazamiento 0x15A98C.
  2. Como se menciona en la publicación de Bond, hay varias secuencias de bytes para el primer reemplazo (valores básicos de RGBA ordenados directamente de 0 a 15). Solo he cambiado uno, el más cercano al desplazamiento de la nota anterior (que se encuentra en 0x15A5AC).
  3. Todo lo que está haciendo es bajo su propio riesgo :) Y no olvide hacer una copia de seguridad.

Gracias a Tex Hex y Bond por la investigación inicial.

UPD: Probado con MSO2007 (VBE6.DLL) y MSO2013 (VBE7.DLL). Trabajar como un encanto.

dias
fuente
2

La solución de Bond (editar la tabla de colores en VB6.exe) funciona perfectamente para modificar la tabla de colores en el IDE de VB6. Sin embargo, descubrí que cuando se selecciona un color modificado y se apaga VB6, VB6 no puede guardar correctamente el color modificado en el registro.

Normalmente, VB6 escribirá un índice en la tabla de colores de 16 valores para cada elemento de texto que pueda modificar su color.

Los índices de color se escriben en el registro aquí:

HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic\CodeForeColors
HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic\CodeBackColors

Por ejemplo, el valor de CodeForeColors se verá así:

6 14 5 0 1 3 13 4 15 0 0 0 0 0 0 0

Los valores del 1 al 16 representan un color en la tabla de colores y 0 significa 'Auto'.

Sin embargo, cuando se selecciona un color modificado, VB6 escribirá un número fuera del rango del índice en el registro y el valor de CodeForeColors se verá así:

5245006 14 5 0 1 3 13 4 15 0 0 0 0 0 0 0

La próxima vez que se inicie VB6, no podrá establecer el color correcto para el elemento que se había configurado con el color modificado.

Todavía estoy tratando de encontrar una solución, pero quería publicar lo que he encontrado hasta ahora.

ravanbak
fuente