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

33

Je travaille sur quelques projets pour travailler avec Excel et VBA, donc je n'ai pas d'autre choix que d'utiliser l'éditeur Microsoft Visual Basic. Normalement, cela ne me dérangerait pas, mais je ne sais 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 ne sont limités qu'aux 16 couleurs par défaut (et basiques) - 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 qui apparaissent dans la palette par défaut?

Percée
la source
Je pense que Microsoft essaie de nous dire qu'ils ne veulent pas que les gens programment en VBA. Ou peut-être que Bill Gates est un gros producteur d'analgésiques.
Holene

Réponses:

19

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

HKEY_CURRENT_USER \ Software \ Microsoft \ VBA \ 6.0 \ Common \ CodeForeColors HKEY_CURRENT_USER \ Software \ 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 de CodeBackColors est la couleur d'arrière-plan et la première valeur à l'intérieur de CodeForeColors est la couleur de premier plan pour le texte normal. Les valeurs sont l'identifiant interne de la couleur, 0 signifie coloration AUTO, 11 montre cyan, 5 rouge etc.

Pour l'essayer: Fermez Excel, modifiez la première valeur de CodeBackColors à 5 et redémarrez Excel. L'arrière-plan de l'éditeur de code sera désormais rouge.

Le problème est que l'éditeur VBA ne prend en charge que ces valeurs internes et le nombre le plus élevé qu'il comprend est 16. Toute autre valeur ne sera pas acceptée et reviendra par défaut à AUTO.

J'ai essayé plusieurs options de saisie de valeurs différentes (par exemple 128255128, 16777215, #aaffee, 255 ou "170,255,238") et aucune n'a fonctionné.

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

Tex Hex
la source
1
Merci d'avoir répondu. IIRC, vous ne pouvez pas retirer une prime, mais si vous ne pouvez littéralement pas le faire, alors je vous l'attribuerai pour la réponse la plus correcte. Je veux attendre un peu plus pour voir si d'autres réponses sont publiées, mais merci pour votre réponse, +1.
Percée du
1
Je dois admettre que ça sonne encore mieux :)
Tex Hex
"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) de FMS a un outil "VBE Color Scheme manager pour voir et définir facilement les couleurs pour votre éditeur". Si vous téléchargez le manuel d'utilisation (un PDF), il montre des captures d'écran qui, tout en facilitant la définition des couleurs, sont toujours limitées à une palette de 16 couleurs. Je pense que s'il y avait un moyen direct d'utiliser des couleurs personnalisées, ils l'auraient inclus dans cet outil. On dirait que Tex Hex est correct.
Brian
Comme il a maintenant été démontré avec les réponses ci-dessous qu'il est possible, cette réponse doit être modifiée. Il est possible de modifier de manière fiable les couleurs dans l'éditeur VBA à l'aide d'un éditeur HEX.
Steven Martin
16

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

Il sauvegarde essentiellement 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!

gallaux
la source
Wow super cool, merci pour le partage @gallaux - je vais certainement vérifier cela. Envisagez-vous de publier le code source par curiosité?
Percée
Oui je le ferai bientôt, j'ai juste besoin de le nettoyer un peu;)
gallaux
Merci Gallaux, j'avais l'intention de faire la même chose, mais une fois que j'ai obtenu mon éditeur vba dans le schéma de couleurs que j'aimais, j'ai perdu cette motivation parce que je n'étais plus aussi "frustré par la fatigue oculaire de 16 couleurs"!
Steven Martin
1
Désolé comment appliquer cela, j'ai besoin d'aide
Pedro Miguel Pimienta Morales
1
@YouCrackedMeUp vous devez mettre à jour la clé de registre à l'aide de regedit (basé sur github.com/dimitropoulos/VBECustomColors ): [1] Naviguez dans regedit vers HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] changement CodeBackColorsà: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. Changement [3] CodeForeColorsà: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. Changement [4] FontFaceà: Consolas.
Tigregalis
7

TeX HeX est parfait. Cependant, il est possible de changer 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 du VB6 SP6, version de fichier 6.0.97.82).

  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 donc c'est vraiment juste le format RRGGBB00). Les quatre octets suivants spécifient la couleur suivante et ainsi de suite jusqu'à ce que vous arriviez à FFFFFF00 (blanc) se terminant à l'offset 0xE2333.

  1. Modifiez l'une de ces valeurs de quatre octets à votre choix. Utilisez simplement les valeurs hexadécimales appropriées au format RVB, suivies d'un octet zéro. Par exemple, RVB (64, 128, 192) serait 40 80 C0 00.

  2. Enregistrez vos modifications dans l'EXE et lancez VB6. Vous devriez voir vos nouvelles couleurs dans les emplacements précédemment occupés par les couleurs VB intégrées.

Liaison
la source
1
Hmm, j'ai cherché avec l'outil tout sur un système avec Office 2003 et il ne trouve aucun fichier nommé VB6.exe ou un dossier VB98. Cette réponse est-elle uniquement pour Office 2007 comme l'OP l'a? Cependant, la version 6.0.97.82 est plus ancienne que la mienne avec Office 2003.
nixda
1
@nixda Rien sur mon système non plus - je pense que Bond fait référence à l'application VB6 sur son système, pas au VBA intégré à Excel. Je vais jeter un œil à l'exécutable Excel et à certaines des DLL VBA, et voir si je peux trouver des tables de couleurs.
Percée du
1
J'ai Office 2010 sur mon PC, j'ai donc VBE7.DLL, pas VBE6.DLL, mais ce devrait être le même processus. Les couleurs sont les mêmes. Si vous regardez les couleurs dans l'ordre où elles sont affichées, elles doivent être: Noir = 00 00 00 00 Marine = 00 00 80 00 Vert = 00 80 00 00 Turqoise = 00 80 80 00 Magenta = 80 00 00 00 Violet = 80 00 80 00 Olive = 80 80 00 00 Lgt Grey = C0 C0 C0 00 Drk Grey = 80 80 80 00 ... J'ai ajouté les codes de couleur hexagonaux à côté de chacun. Il suffit donc d'ouvrir VBE6.DLL dans un éditeur hexadécimal et de rechercher la chaîne hexadécimale suivante:
Bond
1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Cela peut se produire plusieurs fois mais j'ai trouvé que la première table de couleurs est tout ce qui doit être modifié. Voyez si cela fonctionne pour vous.
Bond
1
Super réponse, Bond. Pour les futurs lecteurs, la clé que je devais changer était la deuxième (Office 2013, Windows 8.1), située à `12 50B4 'en utilisant Hex Edit (octet n ° 1200308)
Andy Terra
5

Comme beaucoup l'ont noté, la solution de Bond (édition hexadécimale de la table des couleurs dans VB6.exe) fonctionnera mais vous devrez entrer et réinitialiser vos couleurs dans la boîte de dialogue des options à chaque démarrage de VB6. J'ai créé un script AutoIt qui fera tout le travail pour vous, il suffit de le modifier si nécessaire où tous les appels à SetSyntaxColoring () sont effectués:

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 la coloration de la syntaxe est sous mon contrôle.

Edit 1: optimisé un peu le script pour le faire fonctionner plus rapidement. Je pense à mettre sur pied un programme qui éditera automatiquement VB6.EXE pour faciliter la sélection des couleurs. Je me demande s'il y a un moyen d'abandonner le script AutoIt en créant un plugin pour VS?

Edit 2: a créé un utilitaire qui vous permet d'éditer les couleurs dans l'exe sans avoir à utiliser un éditeur hexadécimal: VbClassicColorEditor . Ce lien va au dépôt public sur bitbucket.

Dylan Nissley
la source
Merci pour le script et la contribution! Toute chance que nous pourrions obtenir un lien mis à jour sur le VbClassicColorEditor? Celui que vous avez publié a 404d ...
Andy Terra
3

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

Dans l'exemple ci-dessous, j'ajoute le schéma de couleurs pour Solarized et je suppose que l'utilisation d'Office 2010

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

Étape 1: dans un éditeur hexadécimal, ouvrez le VBE7.dll situé @

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

ou

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

É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 deuxième occurrence de cela (assurez-vous de rechercher 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> Éditeur VBA> Outils> Options> Format de l'éditeur et définissez les couleurs du code.

La modification des deux chaînes est nécessaire car elle permet aux couleurs de s'enregistrer correctement à l'arrêt et permet à l'éditeur de couleurs de s'ouvrir sans se bloquer.

Merci à tous les répondeurs précédents d'avoir pris le temps de comprendre cela!

Steven Martin
la source
3

J'ai créé un programme qui automatise tout cela, j'ai passé trop de temps dessus, j'ai eu du plaisir à créer un sélecteur de couleurs. Fabriqué en VB6 car pourquoi pas. Programme compilé et code source disponibles ici . Testé sur mes versions de DLL et VB6 uniquement, veuillez faire des sauvegardes avant de changer quoi que ce soit - les emplacements sont fixes dans le code.



Ceci 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

Remplacez 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

Modifiez ensuite les éléments suivants 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 hexadécimal 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

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

Merci à toutes les autres réponses, je n'ai pas trouvé cela moi-même, je pensais simplement qu'il était utile d'avoir toutes les informations requises dans un seul post (je n'ai vu nulle part 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é entièrement testé afin de toujours modifier les programmes à vos risques et périls.

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

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

Sam
la source
2

En prenant l'appât de la réponse de dnissley (où il demande si quelqu'un pourrait faire un complément), j'ai fait un complément pour VB6. C'est un peu grossier (et je vais vous expliquer pourquoi sous peu), mais ça fait l'affaire.

J'ai créé un nouveau projet de complément dans VB6 qui m'a donné le formulaire par défaut "frmAddin" (que je n'utilise pas) et le concepteur "Connect". J'ai moi-même ajouté une classe Color qui contient les éléments suivants:

Option explicite

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

Propriété publique Let ForeColour (ByVal iID As Integer)
    m_iForeColour = iID
Propriété de fin
Propriété publique Get ForeColour () As Integer
    ForeColour = m_iForeColour
Propriété de fin

Propriété publique Let BackColour (ByVal iID As Integer)
    m_iBackColour = iID
Propriété de fin
Propriété publique Get BackColour () As Integer
    BackColour = m_iBackColour
Propriété de fin

Propriété publique Let IndicatorColour (ByVal iID As Integer)
    m_iIndicatorColour = iID
Propriété de fin
Propriété publique Get IndicatorColour () As Integer
    IndicatorColour = m_iIndicatorColour
Propriété de fin

Et puis j'ai modifié le code dans le concepteur "Connect" comme suit:

Option explicite

Formulaire public affiché comme booléen
VBInstance publique comme VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
Dim mfrmAddIn As New frmAddIn
Public WithEvents MenuHandler As CommandBarEvents: gestionnaire d'événements de la barre de commandes

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 As CommandBarEvents

Dim codeCouleurs () comme couleur

«************************************************* ****************************
«RunScript Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Exécute le code qui définit les couleurs requises pour la fenêtre de code dans le
'IDE actif.
'*** UN PROJET DOIT ÊTRE CHARGÉ AVANT QUE CELA FONCTIONNE RÉELLEMENT ***
«************************************************* ****************************
Sous RunScript ()
    ReadColoursFile

    'Sélectionnez Outils> Options
    SendKeys "% to", 5
    'Allez dans les onglets, sélectionnez "Options"
    SendKeys "+ {TAB}"
    SendKeys "{RIGHT}"

    'Sélectionner la zone de liste
    SendKeys "{TAB}"

    Couleur sombreDéfinir comme couleur
    Dim iColour As Integer

    Pour iColour = 0 à 9
        SetColours iColour, codeColours (iColour)
    Next iColour

    SendKeys "~"
End Sub

«************************************************* ****************************
'ReadColoursFile Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Lit le fichier couleur à partir du disque et remplit le tableau codeColours qui
'est utilisé par les méthodes SetColour * pour sélectionner les bonnes couleurs
'l'écran des options.
«************************************************* ****************************
Sub ReadColoursFile ()
    Dim colourLine As String
    Dim colourArray () As String
    Couleur sombreDéfinir comme couleur
    Dim oFSO As FileSystemObject

    Définir oFSO = New FileSystemObject

    Si non oFSO.FileExists (App.Path & "\ VB6CodeColours.dat") Alors
        MsgBox "VB6CodeColours.dat introuvable dans" & App.Path, vbOKOnly, "Fichier de paramètres VB6CodeColours introuvable!"
        Quitter sous
    Fin si

    Définir oFSO = rien

    Ouvrez App.Path & "\ VB6CodeColours.dat" pour l'entrée As # 1
    Code ReDim Couleurs (9) Comme couleur

    Bien que pas EOF (1)
        Entrée ligne # 1, colourLine
        colourArray = Split (colourLine, ",")

        Si IsNumeric (colourArray (0)) Then
            Si codeColours (colourArray (0)) n'est rien alors
                Définir colourSetting = Nouvelle couleur

                Si IsNumeric (colourArray (1)) Alors
                    colourSetting.ForeColour = CInt (colourArray (1))
                Fin si

                Si IsNumeric (colourArray (2)) Alors
                    colourSetting.BackColour = CInt (colourArray (2))
                Fin si

                Si IsNumeric (colourArray (3)) Alors
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                Fin si

                Définir codeColours (colourArray (0)) = colourSetting
            Fin si
        Fin si
    Wend

    Fermer # 1

    Définir colourSetting = Rien
End Sub

«************************************************* ****************************
«SetColours Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Sélectionne l'élément de couleur dans la liste, puis itère le sélecteur de couleur
'contrôles associés à cet élément et les définit en fonction des valeurs
'défini dans le fichier VB6CodeColours.dat.
«************************************************* ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colourSetting As Color)
    Dim iKey As Integer

    SendKeys "{HOME}"

    Pour iKey = 1 à iColour
        SendKeys "{DOWN}"
    Suivant iKey

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

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

«************************************************* ****************************
'SetColourSelector Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Définit la couleur dans le combo de sélecteur. Suppose que l'accent est mis sur
'précédant le contrôle avant l'exécution du code (onglets de la première ligne
'contrôle supposé).
«************************************************* ****************************
Sub SetColourSelector (ByVal iColour As Integer)
    Dim iKey As Integer

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

    Pour iKey = 1 à iColour
        SendKeys "{DOWN}"
    Suivant iKey
End Sub

«************************************************* ****************************
'AddinInstance_OnConnection Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Cette méthode s'exécute lorsque le complément est chargé par l'IDE
«************************************************* ****************************
Private Sub AddinInstance_OnConnection (ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom () As Variant)
    En cas d'erreur GoTo ErrorHandler

    'enregistrer l'instance vb
    Définir VBInstance = Application

    Si ConnectMode ext_cm_External Alors
        Définir mcbMenuCommandBar = AddToAddInCommandBar ("Coloration du code VB6")
        'couler l'événement
        Définissez Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

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

        Définissez oStdToolbar = VBInstance.CommandBars ("Standard")
        Définissez oStdToolbarItem = oStdToolbar.Controls.Add (Type: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Définir les couleurs IDE"
        oStdToolbarItem.BeginGroup = True
        Définissez Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    Fin si

    Quitter sous
ErrorHandler:
    MsgBox Err.Description
End Sub

«************************************************* ****************************
'AddinInstance_OnDisconnection Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
«Cette méthode s'exécute lorsque l'add-in est supprimé par l'IDE et nettoie tout
«références etc.
«************************************************* ****************************
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom () As Variant)
    En cas d'erreur Reprendre ensuite

    'supprimer l'entrée de la barre de commandes
    mcbMenuCommandBar.Delete

    'fermez le complément
    Si FormDisplayed Alors
        SaveSetting App.Title, "Paramètres", "DisplayOnConnect", "1"
        FormDisplayed = False
    Autre
        SaveSetting App.Title, "Paramètres", "DisplayOnConnect", "0"
    Fin si

    Décharger mfrmAddIn
    Set mfrmAddIn = Nothing

    Set MenuHandler = Nothing
    Set MenuHandler2 = Nothing
End Sub

«************************************************* ****************************
'MenuHandler_Click Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Cette méthode effectue les tâches nécessaires lorsque l'utilisateur clique sur l'élément de menu.
«************************************************* ****************************
Private Sub MenuHandler_Click (ByVal CommandBarControl As Object, géré comme booléen, CancelDefault comme booléen)
    Script de lancement
End Sub

«************************************************* ****************************
'MenuHandler2_Click Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Cette méthode effectue les tâches nécessaires lorsque vous cliquez sur le bouton de la barre d'outils.
«************************************************* ****************************
Private Sub MenuHandler2_Click (ByVal CommandBarControl As Object, géré comme booléen, CancelDefault comme booléen)
    Script de lancement
End Sub

«************************************************* ****************************
'AddToAddInCommandBar Sub
«------------------------------------------------- ----------------------------
' LA DESCRIPTION:
'Ajoute l'élément spécifié à la liste des menus.
«************************************************* ****************************
Fonction AddToAddInCommandBar (sCaption As String) As Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl 'objet de barre de commandes
    Dim cbMenu As Object

    En cas d'erreur Reprendre ensuite

    'voir si nous pouvons trouver le menu des compléments
    Définissez cbMenu = VBInstance.CommandBars ("compléments")
    Si cbMenu n'est rien alors
        'non disponible donc nous échouons
        Fonction de sortie
    Fin si

    En cas d'erreur GoTo ErrorHandler

    'ajoutez-le à la barre de commandes
    Définissez cbMenuCommandBar = cbMenu.Controls.Add (1)
    'mettre la légende
    cbMenuCommandBar.Caption = sCaption

    Définissez AddToAddInCommandBar = cbMenuCommandBar

    Fonction de sortie
ErrorHandler:
    «Sortez gracieusement
Fonction de fin

Ce code permet à l'application de lire les couleurs que je veux à partir d'un fichier qui réside dans le même répertoire que le .dll (appelé VB6CodeColours.dat). Ce fichier contient les éléments suivants (et il variera en fonction des couleurs que vous remplacez dans le VB6.EXE, donc un simple copier-coller ne fonctionnera probablement pas.

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

On dirait du charabia, mais je vais t'expliquer. Il a le format "Code Color", "Foreground", "Background", Indicator "de sorte que la ligne supérieure définira le" Normal Text "sur le 14ème élément du combo pour le premier plan, le 12 pour le fond et le 1er pour l'indicateur .

Pourquoi j'ai dit que c'était une solution assez brute: * Il utilise SendKeys. Aucune autre explication n'est nécessaire là, je suis sûr :) * L'utilisateur doit cliquer sur l'option menu / barre d'outils pour qu'elle prenne effet. * Le code n'est pas le mieux structuré (à mon avis) mais était basé sur le temps que je pouvais y consacrer à l'époque. Je vise à l'améliorer à l'avenir, mais cela fonctionne bien pour moi dans l'état actuel (donc je vais probablement le laisser!)

Peut-être avec une base, quelqu'un peut-il développer davantage.

jonifen
la source
2

Voici l'astuce pour conserver votre sélection de couleurs permanente. Un peu plus d'édition hexadécimale. Si vous avez effectué le remplacement suggéré par Bond, vous devriez avoir les éléments suivants à portée de main: les valeurs RGBA pour les couleurs de base (classiques) 16 indexées de 0 à 15 et les valeurs RGBA pour vos couleurs personnalisées indexées de la même manière. Recherchez maintenant dans VBEx.DLL la séquence d'octets construite à partir des 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.-à-d. Blanc, gris, gris foncé, noir, rouge, rouge foncé, etc.). Le modèle n'est pas aléatoire, il est dérivé de valeurs, stocké dans le registre, voir le post de Tex Hex. La chaîne hexadécimale de 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 exemple 15, 7, 8, etc. Maintenant, toutes les couleurs que vous choisissez dans VS UI seront stockées dans le registre et appliquées après le redémarrage de l'application. Eh bien, toutes, mais des couleurs "indicatrices". Ceux-ci sont toujours réinitialisés aux valeurs par défaut. Remarques:

  1. Dans VBE7.DLL (MSO2010), je n'ai trouvé qu'une seule séquence d'octets ordonnée de cette manière à l'offset 0x15A98C.
  2. Comme mentionné dans le post de Bond, il y a plusieurs séquences d'octets pour le premier remplacement (valeurs RGBA de base 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 ce que vous faites ci-dessus est à vos risques et périls :) Et n'oubliez pas de sauvegarder.

Merci à Tex Hex et Bond pour leurs recherches initiales.

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

dias
la source
2

La solution de Bond (modification de la table des couleurs dans VB6.exe) fonctionne parfaitement pour modifier la table des couleurs dans l'IDE 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 de 1 à 16 représentent une couleur dans la table des couleurs et 0 signifie «Auto».

Cependant, lorsqu'une couleur modifiée est sélectionnée, VB6 écrira un nombre en dehors de la plage d'index dans le registre et la valeur CodeForeColors ressemblera à 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 a é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.

ravanbak
la source