web-dev-qa-db-fra.com

Comment utiliser des couleurs personnalisées dans l'éditeur Microsoft VBA?

Je travaille sur quelques projets utilisant Excel et VBA. Je n'ai donc pas d'autre choix que d'utiliser l'éditeur Microsoft Visual Basic. Cela ne me dérangerait normalement pas, mais je ne vois pas comment définir une couleur personnalisée pour l'éditeur (je ne peux choisir que dans la palette par défaut).

Pour changer la couleur actuellement, je vais à Tools -> Options -> Editor Format... Cependant, vos choix sont limités aux 16 couleurs par défaut (et de base) - et quand je dis basique, je veux dire basique , comme le rose, le bleu, le noir, le blanc, etc ...

Quelqu'un sait-il comment spécifier une couleur personnalisée ou, à tout le moins, modifier certaines des couleurs affichées dans la palette par défaut?

30
Breakthrough

VBA lit les paramètres des couleurs à partir de ces clés de registre:

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

Chacune de ces clés contient une liste de valeurs (séparées par un espace) pour chaque entrée dans Outils -> Options -> Format de l'éditeur. Par exemple, la première valeur à l'intérieur CodeBackColors est la couleur d'arrière-plan et la première valeur à l'intérieur CodeForeColors est la couleur de premier plan du texte normal. Les valeurs sont l'identifiant interne de la couleur, 0 signifie la coloration AUTO, 11 le cyan, 5 le rouge, etc.

Pour essayer: Fermez Excel, remplacez la première valeur de CodeBackColors par 5 et redémarrez Excel. Le fond de l'éditeur de code sera maintenant rouge.

Le problème est que l'éditeur VBA ne prend en charge que ces valeurs internes et que le nombre le plus élevé qu'il comprend est 16. Aucune autre valeur ne sera acceptée et la valeur par défaut sera de nouveau définie sur AUTO.

J'ai essayé plusieurs options pour entrer des valeurs différentes (par exemple, 128255128, 16777215, #aaffee, 255 ou "170,255,238") et aucune d'entre elles n'a fonctionné.

Par conséquent, je pense qu'il n'est techniquement pas possible d'attribuer d'autres couleurs.

18
Tex Hex

J'ai créé une application basée sur les informations trouvées ici: https://github.com/dimitropoulos/VBECustomColors

Fondamentalement, il sauvegarde le fichier .dll VBE6/VBE7 et permet l’utilisation de couleurs personnalisées sans avoir à utiliser un éditeur hexadécimal.

ss

Vous pouvez le télécharger ici: https://github.com/gallaux/VBEThemeColorEditor

Prendre plaisir

Edit: Le code source est maintenant disponible!

14
gallaux

TeX HeX est sur place. Cependant, il est IS possible de modifier les 16 couleurs intégrées avec les vôtres. Cela nécessite juste un peu d'édition hexadécimale. Voici un guide étape par étape. (Remarque: il s’agit de VB6 SP6, version 6.0.97.82 du fichier).

  1. Sauvegardez votre fichier VB6.EXE dans votre dossier de programme VB98. (Facultatif, mais recommandé).

  2. Lancez votre éditeur hexadécimal préféré (criez HxD) et ouvrez VB6.EXE.

  3. Passez à l'adresse 0xE22F4. C'est le début de la table des couleurs.

Vous devriez voir quatre zéros. Cela représente la couleur noire au format RRGGBBAA (l'alpha n'est pas pris en charge, il s'agit donc uniquement du format RRGGBB00). Les quatre octets suivants spécifient la couleur suivante et ainsi de suite jusqu'à atteindre FFFFFF00 (blanc) se terminant à l'offset 0xE2333.

  1. Modifiez l'une de ces valeurs à quatre octets selon vos préférences. Utilisez simplement les valeurs hexadécimales appropriées au format RVB, suivies d'un octet nul. Par exemple, RVB (64, 128, 192) correspond à 40 80 C0 00.

  2. Enregistrez vos modifications dans le fichier EXE et démarrez VB6. Vous devriez voir vos nouvelles couleurs dans les emplacements précédemment occupés par les couleurs intégrées VB.

7
Bond

Comme beaucoup l'ont noté, la solution de Bond (édition hexagonale de la table de couleurs dans VB6.exe) fonctionnera, mais vous devrez redéfinir vos couleurs dans la boîte de dialogue des options à chaque démarrage de VB6. J'ai créé un script AutoIt qui effectuera tout le travail à votre place. Il vous suffit de le modifier si nécessaire, là où tous les appels à SetSyntaxColoring () se font. fabriqué:

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

Je le garde juste sur mon bureau et maintenant, chaque fois que je dois ouvrir vb6, je double-clique dessus et tout comme cette coloration de syntaxe est sous mon contrôle.

Edit 1: Optimisé un peu le script pour le rendre plus rapide. Je songe à créer un programme qui modifiera automatiquement VB6.EXE afin de faciliter la sélection des couleurs. Je me demande s’il est possible de laisser tomber le script AutoIt en créant un plugin pour VS?

Edit 2: Créé un utilitaire permettant d’éditer les couleurs dans le fichier exe sans avoir à utiliser un éditeur hexadécimal: VbClassicColorEditor . Ce lien va au référentiel public sur bitbucket.

5
Dylan Nissley

Je voulais juste poster un résumé des réponses précédentes car il n'est pas tout à fait clair ce qui doit être fait pour changer les couleurs dans l'éditeur VBA Excel

Dans l'exemple ci-dessous, j'ajoute le jeu de couleurs pour Solarized et je suppose l'utilisation d'Office 2010.

Étape 0: Faites une sauvegarde du fichier VBE7.dll avant de le modifier - vous avez été averti !!!

Étape 1: Dans un éditeur Hex, ouvrez le fichier VBE7.dll situé @

"C:\Program Files\Common Files\Microsoft shared\VBA\VBA7\VBE7.DLL" pour 64bit

ou

"C:\Program Files( x86)\Common Files\Microsoft shared\VBA\VBA7\VBE7.DLL" pour 32bit

Étape 2: Trouvez la 1ère occurrence 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`

et remplacer par

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

Étape 3: Trouvez la 2e occurrence de celle-ci (assurez-vous que vous effectuez une recherche en haut du fichier).

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

et remplacer par

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

Étape 4: Enregistrez le fichier dll puis ouvrez Excel> Editeur VBA> Outils> Options> Format de l'éditeur et définissez les couleurs du code.

Il est nécessaire de changer les deux chaînes car cela permet aux couleurs d’être correctement sauvegardées à l’arrêt et permet à l’éditeur de couleurs de s’ouvrir sans plantage d’Excel.

Merci à tous les précédents intervenants pour avoir mis le temps de comprendre cela!

3
Steven Martin

J'ai créé un programme qui automatise tout cela, qui a passé beaucoup trop de temps dessus et qui s'est amusé à créer un sélecteur de couleur. Fabriqué en VB6 car pourquoi pas. Programme compilé et code source disponible ici . Testé sur mes versions de DLL et de VB6 uniquement, veuillez effectuer des sauvegardes avant de modifier quoi que ce soit - les emplacements sont corrigés dans le code.



C'est une très vieille question mais je voudrais peser pour être complet

Pour les couleurs VS2012 dans VBA ou VB6 IDE: Ouvrez VBE6.DLL/VBE7.DLL ou VBA6.DLL dans

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

avec votre éditeur hexadécimal

Remplacer la première occurrence 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

Avec

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

Revenez ensuite en haut et remplacez la deuxième occurrence 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

avec

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

Puis modifiez ce qui suit dans le registre

(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 vous modifiez pour VBA vous avez terminé, pour VB6, ouvrez maintenant 'VB6.exe' dans votre éditeur Hex et modifiez la première occurrence 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

avec

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

Ceci corrige la couleur affichée dans l'interface de VB6 afin que vous puissiez, si vous souhaitez apporter d'autres modifications aux couleurs.

Merci à toutes les autres réponses, je ne l'ai pas inventé moi-même, je pensais qu'il était utile de disposer de toutes les informations requises dans un seul post (nulle part je n'ai vu modifier VB6.exe et VBA6.dll ensemble). En utilisant cette méthode, vous devriez pouvoir choisir librement parmi les couleurs disponibles.

J'ai également réorganisé les couleurs de certaines des autres réponses afin de ne pas changer vbRed, vbBlue, vbWhite, etc., vous devriez donc toujours obtenir le résultat souhaité dans le code. Cela n’a pas été complètement testé, donc modifiez toujours les programmes à vos risques et périls.

Ce serait bien de mettre sur pied un petit programme qui le fera pour vous (comme le faisait Gallaux). J'avais des problèmes pour écrire dans le registre et le VB6 IDE en utilisant ce programme, et une sorte de fenêtre d'aperçu serait bien.

Limites que j'ai trouvées: cela ne change pas la couleur des icônes d'indicateur, vous devez le faire vous-même.

3
Sam

Voici l'astuce pour garder votre sélection de couleur permanente. Un peu plus d'édition hexadécimale. Si vous avez effectué le remplacement suggéré par Bond , vous devez avoir les éléments suivants à portée de main: valeurs RGBA pour 16 couleurs de base (classiques) indexées de 0 à 15, et Les valeurs RGBA de vos couleurs personnalisées sont indexées de la même manière. Maintenant, recherchez dans VBEx.DLL la séquence d'octets construite à partir de valeurs RGBA "classiques" ordonnées dans la séquence d'index suivante: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (c'est-à-dire blanc, gris, gris foncé, noir, rouge, rouge foncé, etc.). Le modèle n'est pas aléatoire, il est dérivé de valeurs, stockées dans le registre, voir la publication de Tex Hex . La chaîne hexadécimale pour la recherche doit ressembler à 'FFFFFF00C0C0C0008080800000000000FF000000 ...', etc. 64 octets au total. Remplacez la séquence d'octets trouvés par des valeurs RGBA de couleurs "personnalisées" ordonnées de la même manière, par ex. 15, 7, 8, etc. Toutes les couleurs que vous choisissez dans l'interface utilisateur de VS seront stockées dans le registre et appliquées après le redémarrage de l'application. Eh bien, tous, sauf les couleurs "indicatrices". Ceux-ci réinitialisent toujours les valeurs par défaut. Remarques:

  1. Dans VBE7.DLL (MSO2010), je n’ai trouvé qu’une séquence d’octets ainsi ordonnée à l’offset 0x15A98C.
  2. Comme mentionné dans , le post de Bond contient plusieurs séquences d'octets pour le premier remplacement (valeurs de base RGBA ordonnées directement de 0 à 15). J'ai changé un seul, le plus proche du décalage de la note précédente (trouvé à 0x15A5AC).
  3. Tout cela, vous le faites à vos risques et périls :) Et n'oubliez pas de sauvegarder.

Merci à Tex Hex et Bond pour la recherche initiale.

UPD: testé avec MSO2007 (VBE6.DLL) et MSO2013 (VBE7.DLL). Travailler comme un charme.

2
dias

La solution de Bond (édition de la table de couleurs dans VB6.exe) fonctionne parfaitement pour modifier la table de couleurs dans l'EDI VB6. Cependant, j'ai constaté que lorsqu'une couleur modifiée est sélectionnée et que VB6 est arrêté, VB6 n'est pas en mesure d'enregistrer correctement la couleur modifiée dans le registre.

Normalement, VB6 écrit un index dans la table des couleurs à 16 valeurs pour chaque élément de texte dont la couleur peut être modifiée.

Les indices de couleur sont écrits dans le registre ici:

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

Par exemple, la valeur CodeForeColors ressemblera à ceci:

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

Les valeurs comprises entre 1 et 16 représentent une couleur dans la table des couleurs et 0 signifie "Auto".

Toutefois, lorsqu'une couleur modifiée est sélectionnée, VB6 écrit dans le registre un nombre situé hors de la plage d'index et la valeur CodeForeColors ressemble à ceci:

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

Au prochain démarrage de VB6, il ne sera pas en mesure de définir la couleur correcte pour l'élément qui avait été défini sur la couleur modifiée.

J'essaie toujours de trouver une solution, mais je voulais publier ce que j'ai trouvé jusqu'à présent.

2
ravanbak