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?
microsoft-office
microsoft-excel-2007
text-editors
vba
Penetración
fuente
fuente

Respuestas:
VBA lee la configuración de los colores de estas claves de registro:
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.
fuente
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.
Puede descargarlo aquí: https://github.com/gallaux/VBEThemeColorEditor
Disfrutar
Editar: ¡El código fuente ya está disponible!
fuente
HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] El cambioCodeBackColorsa:2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] El cambioCodeForeColorsa:13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] El cambioFontFacea:Consolas.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).
Haga una copia de seguridad de su archivo VB6.EXE en su carpeta de programa VB98. (Opcional, pero recomendado).
Encienda su editor hexadecimal favorito (grite a HxD) y abra VB6.EXE.
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.
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.
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.
fuente
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 ():
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.
fuente
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 bitso
"C:\Program Files( x86)\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL"para 32 bitsPaso 2: Encuentra la primera aparición de
y reemplazar con
Paso 3: encuentre la segunda aparición de esto (asegúrese de buscar desde la parte superior del archivo)
y reemplazar con
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!
fuente
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
con tu editor hexadecimal
Reemplazar la primera aparición de
Con
Luego regrese a la parte superior y reemplace la segunda aparición de
con
Luego modifique lo siguiente en el registro
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
con
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.
fuente
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 propiedadY 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 finalEste 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.
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.
fuente
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:
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.
fuente
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í:
Por ejemplo, el valor de CodeForeColors se verá así:
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í:
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.
fuente