Come posso usare colori personalizzati nell'editor VBA di Microsoft?


33

Sto lavorando ad alcuni progetti per lavorare usando Excel e VBA, quindi non ho altra scelta che usare l'editor di Microsoft Visual Basic. Normalmente non mi dispiacerebbe, ma non riesco a capire come impostare un colore personalizzato per l'editor (posso solo scegliere dalla tavolozza predefinita).

Per cambiare il colore attualmente, vado a Tools -> Options -> Editor Format... Tuttavia, le tue scelte sono limitate solo ai 16 colori predefiniti (e di base) - e quando dico base, intendo base , come rosa, blu, nero, bianco, ecc. ..

Qualcuno sa come specificare un colore personalizzato o almeno cambiare alcuni dei colori che appaiono nella tavolozza predefinita?


Penso che ciò che Microsoft sta cercando di dirci è che non vogliono che le persone programmino in VBA. O forse Bill Gates è pesante nei produttori di antidolorifici.
Holene,

Risposte:


19

VBA legge le impostazioni per i colori da queste chiavi di registro:

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

Ognuna di queste chiavi contiene un elenco di valori (separati da spazio) per ogni voce all'interno di Strumenti -> Opzioni -> Formato dell'editor. Ad esempio, il primo valore in CodeBackColors è il colore di sfondo e il primo valore in CodeForeColors è il colore di primo piano per il testo normale. I valori sono l'id interno per il colore, 0 significa colorazione AUTO, 11 indica ciano, 5 rosso ecc.

Per provarlo: Chiudi Excel, modifica il primo valore di CodeBackColors su 5 e riavvia Excel. Lo sfondo dell'editor di codice ora sarà rosso.

Il problema è che VBA Editor supporta solo questi valori interni e il numero più alto che comprende è 16. Qualsiasi altro valore non verrà accettato e tornerà automaticamente ad AUTO.

Ho provato diverse opzioni per inserire valori diversi (ad es. 128255128, 16777215, #aaffee, 255 o "170.255.238") e nessuno di questi ha funzionato.

Pertanto, ritengo che tecnicamente non sia possibile assegnare altri colori.


1
Grazie per la risposta. IIRC, non puoi ritirare una taglia, ma se non riesci letteralmente a farlo, allora te lo assegnerò per la risposta più corretta. Voglio aspettare ancora un po 'per vedere se ci sono altre risposte, ma grazie per la tua risposta, +1.
Breakthrough

1
Devo ammettere che suona ancora meglio :)
Tex Hex,

"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) di FMS ha uno strumento "VBE Color Scheme Manager per vedere e impostare facilmente i colori per il tuo editor". Se scarichi il manuale dell'utente (un PDF) mostra schermate che, pur semplificando l'impostazione dei colori, sono ancora limitate a una tavolozza di 16 colori. Penserei che se ci fosse un modo diretto per usare i colori personalizzati lo avrebbero incluso in questo strumento. Sembra che Tex Hex sia corretto.
Brian

Come è stato ora mostrato con le risposte sottostanti che è possibile, questa risposta dovrebbe essere modificata. È possibile modificare in modo affidabile i colori nell'editor VBA utilizzando un editor HEX.
Steven Martin,

16

Ho creato un'applicazione basata sulle informazioni trovate qui: https://github.com/dimitropoulos/VBECustomColors

Fondamentalmente esegue il backup del file .dll VBE6 / VBE7 e consente l'uso di colori personalizzati senza dover utilizzare un editor esadecimale.

ss

Puoi scaricarlo qui: https://github.com/gallaux/VBEThemeColorEditor

Godere

Modifica: il codice sorgente è ora disponibile!


Wow super cool, grazie per aver condiviso @gallaux - Lo darò sicuramente un'occhiata. Stai pensando di rilasciare il codice sorgente per curiosità?
Svolta del

Sì, lo farò presto, ho solo bisogno di ripulirlo un po ';)
gallaux,

Grazie Gallaux, avevo intenzione di fare la stessa cosa, ma una volta che ho ottenuto il mio editor vba per la combinazione di colori che mi piaceva, ho perso quella motivazione perché non ero più "frustrato affaticamento degli occhi a 16 colori"!
Steven Martin,

1
Mi dispiace come applicare questo, ho bisogno di aiuto
Pedro Miguel Pimienta Morales il

1
@YouCrackedMeUp devi aggiornare la chiave di registro usando regedit (basato su github.com/dimitropoulos/VBECustomColors ): [1] Naviga in regedit su HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] modifica CodeBackColorsa: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] modifica CodeForeColorsa: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] cambiamento FontFacea: Consolas.
Tigregalis,

7

TeX HeX è perfetto. Tuttavia, è possibile cambiare i 16 colori incorporati con i propri. Richiede solo un po 'di modifica esadecimale. Ecco una guida dettagliata. (Nota: questo è per VB6 SP6, versione del file 6.0.97.82).

  1. Eseguire il backup del file VB6.EXE nella cartella del programma VB98. (Opzionale, ma consigliato).

  2. Avvia il tuo editor esadecimale preferito (grida a HxD) e apri VB6.EXE.

  3. Vai a indirizzo 0xE22F4. Questo è l'inizio della tabella dei colori.

Dovresti vedere quattro zeri. Questo rappresenta il colore nero nel formato RRGGBBAA (l'alfa non è supportato, quindi è solo il formato RRGGBB00). I successivi quattro byte specificano il colore successivo e così via fino ad arrivare a FFFFFF00 (bianco) che termina con offset 0xE2333.

  1. Modifica uno di questi valori a quattro byte a tua scelta. Basta usare i valori esadecimali appropriati in formato RGB, seguito da un byte zero. Ad esempio, RGB (64, 128, 192) sarebbe 40 80 C0 00.

  2. Salva le modifiche su EXE e avvia VB6. Dovresti vedere i tuoi nuovi colori negli slot precedentemente occupati dai colori VB incorporati.


1
Hmm, ho cercato con lo strumento tutto su un sistema con Office 2003 e non trova alcun file chiamato VB6.exe o una cartella VB98. Questa risposta è solo per Office 2007 come l'OP ha? Tuttavia, la versione 6.0.97.82 è più vecchia della mia con Office 2003.
nixda

1
@nixda Nulla sul mio sistema - penso che Bond si riferisca all'applicazione VB6 sul suo sistema, non al VBA integrato in Excel. Vado a dare un'occhiata all'eseguibile di Excel e ad alcune DLL VBA e vedrò se riesco a trovare delle tabelle dei colori.
Breakthrough

1
Ho Office 2010 sul mio PC, quindi ho VBE7.DLL, non VBE6.DLL, ma dovrebbe essere lo stesso processo. I colori sono gli stessi Se guardi i colori nell'ordine in cui sono visualizzati, dovrebbero essere: Nero = 00 00 00 00 Navy = 00 00 80 00 Verde = 00 80 00 00 Turqoise = 00 80 80 00 Magenta = 80 00 00 00 Viola = 80 00 80 00 Olive = 80 80 00 00 Lgt Grey = C0 C0 C0 00 Drk Grey = 80 80 80 00 ... Ho aggiunto i codici esadecimali accanto a ciascuno. Quindi basta aprire VBE6.DLL in un editor esadecimale e cercare la seguente stringa esadecimale:
Bond

1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Potrebbe verificarsi più volte ma ho scoperto che la prima tabella dei colori è tutto ciò che deve essere modificato. Vedi se va bene per te.
Bond

1
Ottima risposta, Bond. Per i futuri lettori, la chiave che dovevo cambiare era la seconda (Office 2013, Windows 8.1), situata in `12 50B4 'usando Hex Edit (byte n. 1.200.308)
Andy Terra,

5

Come molti hanno notato, la soluzione di Bond (esadecimale modifica della tabella dei colori in VB6.exe) funzionerà ma dovrai accedere e ripristinare i colori nella finestra di dialogo delle opzioni ogni volta che avvii VB6. Ho creato uno script AutoIt che farà tutto il lavoro per te, basta modificarlo come necessario dove vengono fatte tutte le chiamate 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

Lo tengo sul mio desktop e ora ogni volta che devo aprire vb6 faccio semplicemente doppio clic su di esso e proprio come quella colorazione della sintassi è sotto il mio controllo.

Modifica 1: ottimizzato un po 'lo script per renderlo più veloce. Sto pensando di mettere insieme un programma che modificherà VB6.EXE automaticamente per rendere più facile la selezione dei colori. Mi chiedo se c'è un modo per abbandonare lo script AutoIt creando un plugin per VS?

Modifica 2: creata un'utilità che consente di modificare i colori nell'exe senza dover utilizzare un editor esadecimale: VbClassicColorEditor . Tale collegamento va al repository pubblico su bitbucket.


Grazie per la sceneggiatura e il contributo! Qualche possibilità di ottenere un link aggiornato su VbClassicColorEditor? Quello che hai pubblicato ha 404d ...
Andy Terra,

3

Volevo solo pubblicare un riepilogo delle risposte precedenti in quanto non è del tutto chiaro cosa deve essere fatto per cambiare i colori nell'editor VBA di Excel

Nell'esempio seguente sto aggiungendo la combinazione di colori per Solarized e presumo l'uso di Office 2010

Passaggio 0: esegui un backup di VBE7.dll prima di modificarlo: sei stato avvisato !!!

Passaggio 1: In un editor esadecimale, apri VBE7.dll che si trova @

"C:\Program Files\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" per 64 bit

o

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

Passaggio 2: trova la prima occorrenza di

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`

e sostituisci 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

Passaggio 3: trova la seconda occorrenza di ciò (assicurati di cercare dalla cima del file)

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

e sostituisci 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

Passaggio 4: salvare il file dll e quindi aprire Excel> Editor VBA> Strumenti> Opzioni> Formato editor e impostare i colori del codice.

La modifica di entrambe le stringhe è essenziale poiché consente di salvare correttamente i colori all'arresto e consente all'editor dei colori di aprirsi senza arresti anomali di Excel.

Grazie a tutti i precedenti risponditori per aver dedicato del tempo a capire questo!


3

Ho creato un programma che automatizza tutto questo, ci ho passato troppo tempo, mi sono divertito a creare un selettore di colori. Realizzato in VB6 perché perché no. Programma compilato e codice sorgente disponibili qui . Testato solo sulle mie versioni di DLL e VB6, esegui backup prima di modificare qualsiasi cosa: le posizioni sono fisse nel codice.



Questa è una domanda molto antica, ma vorrei soppesare per completezza

Per i colori VS2012 in VBA o VB6 IDE: Aprire VBE6.DLL / VBE7.DLL o VBA6.DLL in

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

con il tuo editor esadecimale

Sostituisci la prima occorrenza di

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

Quindi tornare all'inizio e sostituire la seconda occorrenza di

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

Quindi modificare quanto segue nel 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 '

Se stai modificando per VBA hai finito, per VB6 ora apri "VB6.exe" nel tuo editor esadecimale e modifica la prima occorrenza di

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

Ciò corregge il colore visualizzato nell'interfaccia di VB6 in modo che se si desidera apportare altre modifiche ai colori, è possibile.

Grazie a tutte le altre risposte, non mi sono inventato da solo, ho pensato che fosse utile avere tutte le informazioni richieste in un singolo post (da nessuna parte ho visto modificare VB6.exe e VBA6.dll insieme). Utilizzando questo metodo dovresti essere in grado di selezionare liberamente tra i colori disponibili.

Ho anche riordinato i colori di alcune delle altre risposte, quindi non cambiare vbRed, vbBlue, vbWhite ecc., Quindi dovresti comunque ottenere il risultato desiderato nel codice. Questo non è stato completamente testato, quindi come sempre modificare i programmi a proprio rischio.

Sarebbe bello mettere insieme un piccolo programma che farà questo per te (come ha fatto gallaux), ho avuto problemi con la scrittura nel registro e l'IDE VB6 usando quel programma, e venire una sorta di finestra di anteprima sarebbe bello.

Limitazioni che ho trovato: questo non cambia il colore delle icone dell'indicatore, devi farlo da solo.


2

Prendendo l'esca dalla risposta di dnissley (dove chiede se qualcuno potrebbe creare un componente aggiuntivo), ho creato un componente aggiuntivo per VB6. È un po 'rozzo (e spiegherò perché a breve), ma fa il lavoro.

Ho creato un nuovo progetto di componente aggiuntivo in VB6 che mi ha dato il modulo "frmAddin" predefinito (che non uso) e il designer "Connect". Ho aggiunto una classe di colori che contiene quanto segue:

Opzione esplicita

Dim m_iForeColour As Intero
Dim m_iBackColour As Intero
Dim m_iIndicatorColour As Inger

Proprietà pubblica Let ForeColour (ByVal iID As Inger)
    m_iForeColour = iID
Proprietà finale
Proprietà pubblica Ottieni ForeColour () come numero intero
    ForeColour = m_iForeColour
Proprietà finale

Proprietà pubblica Let BackColour (ByVal iID As Inger)
    m_iBackColour = iID
Proprietà finale
Proprietà pubblica Get BackColour () Come numero intero
    BackColour = m_iBackColour
Proprietà finale

Proprietà pubblica Let IndicatorColour (ByVal iID As Inger)
    m_iIndicatorColour = iID
Proprietà finale
Proprietà pubblica Get IndicatorColour () Come numero intero
    IndicatorColour = m_iIndicatorColour
Proprietà finale

E poi ho modificato il codice nel Designer "Connect" in modo che sia il seguente:

Opzione esplicita

Modulo pubblico visualizzato come booleano
VBInstance pubblica come VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
Dim mfrmAddIn Come nuovo frmAddIn
Public WithEvents MenuHandler Come gestore eventi della barra dei comandi di CommandBarEvents

Dim mcbToolbar Come Office.CommandBarControl
Public WithEvents MenuHandler2 Come CommandBarEvents

Codice fioco Colori () Come colore

'************************************************* ****************************
'RunScript Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Esegue il codice che imposta i colori richiesti per la finestra del codice in
'IDE attivo.
"*** UN PROGETTO DEVE ESSERE CARICATO PRIMA CHE QUESTO FUNZIONA REALMENTE ***
'************************************************* ****************************
RunScript secondario ()
    ReadColoursFile

    'Seleziona Strumenti> Opzioni
    SendKeys "% to", 5
    "Vai alle schede, seleziona" Opzioni "
    SendKeys "+ {TAB}"
    SendKeys "{DESTRA}"

    'Seleziona la casella di riepilogo
    SendKeys "{TAB}"

    Colore tenue Impostazione come colore
    Dim iColour come numero intero

    Per iColour = da 0 a 9
        SetColours iColour, codeColours (iColour)
    Prossimo iColour

    SendKeys "~"
End Sub

'************************************************* ****************************
'ReadColoursFile Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Legge il file colore dal disco e popola l'array codeColours che
'viene utilizzato dai metodi SetColour * per selezionare i colori corretti da
'la schermata delle opzioni.
'************************************************* ****************************
Sottotitoli ReadColoursFile ()
    Dim colourLine As String
    Dim colourArray () As String
    Colore tenue Impostazione come colore
    Dim oFSO As FileSystemObject

    Impostare oFSO = New FileSystemObject

    If Not oFSO.FileExists (App.Path & "\ VB6CodeColours.dat") Quindi
        MsgBox "VB6CodeColours.dat non trovato in" & App.Path, vbOKOnly, "File delle impostazioni VB6CodeColours non trovato!"
        Esci da Sub
    Finisci se

    Impostare oFSO = Nothing

    Apri App.Path e "\ VB6CodeColours.dat" per Input As # 1
    Codice ReDimColori (9) Come colore

    While Not EOF (1)
        Ingresso linea n. 1, colourLine
        colourArray = Split (colourLine, ",")

        Se IsNumeric (colourArray (0)) Quindi
            Se codeColours (colourArray (0)) non è niente, allora
                Set colourSetting = New Color

                Se IsNumeric (colourArray (1)) Quindi
                    colourSetting.ForeColour = CInt (colourArray (1))
                Finisci se

                Se IsNumeric (colourArray (2)) Quindi
                    colourSetting.BackColour = CInt (colourArray (2))
                Finisci se

                Se IsNumeric (colourArray (3)) Quindi
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                Finisci se

                Set codeColours (colourArray (0)) = colourSetting
            Finisci se
        Finisci se
    Wend

    Chiudi # 1

    Set colourSetting = Nothing
End Sub

'************************************************* ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Seleziona l'elemento colore dall'elenco e quindi scorre il selettore colore
"controlli associati a quell'elemento e li imposta in base ai valori
'impostato nel file VB6CodeColours.dat.
'************************************************* ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colourSetting As Color)
    Dim iKey As Intero

    SendKeys "{HOME}"

    Per iKey = 1 a iColour
        SendKeys "{DOWN}"
    Il prossimo iKey

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

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

'************************************************* ****************************
'SetColourSelector Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Imposta il colore nel combo selettore. Suppone che il focus sia sul
'che precede il controllo prima dell'esecuzione del codice (schede della prima riga su
'assunto controllo).
'************************************************* ****************************
Sub SetColourSelector (ByVal iColour As Inger)
    Dim iKey As Intero

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

    Per iKey = 1 a iColour
        SendKeys "{DOWN}"
    Il prossimo iKey
End Sub

'************************************************* ****************************
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Questo metodo viene eseguito quando il componente aggiuntivo viene caricato dall'IDE
'************************************************* ****************************
Private Sub AddinInstance_OnConnection (Applicazione ByVal come oggetto, ByVal ConnectMode Come AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst Come oggetto, custom () Come variante)
    On Error Vai a ErrorHandler

    'salva l'istanza vb
    Imposta VBInstance = Applicazione

    Se ConnectMode ext_cm_External Quindi
        Imposta mcbMenuCommandBar = AddToAddInCommandBar ("Colorazione del codice VB6")
        'affondare l'evento
        Set Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

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

        Impostare oStdToolbar = VBInstance.CommandBars ("Standard")
        Set oStdToolbarItem = oStdToolbar.Controls.Add (Type: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Imposta colori IDE"
        oStdToolbarItem.BeginGroup = True
        Set Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    Finisci se

    Esci da Sub
ErrorHandler:
    MsgBox Err.Description
End Sub

'************************************************* ****************************
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Questo metodo viene eseguito quando il componente aggiuntivo viene rimosso dall'IDE e ne pulisce uno qualsiasi
"riferimenti ecc.
'************************************************* ****************************
Private AddinInstance_OnDisconnection (ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom () As Variant)
    In caso di errore Riprendi Successivo

    'elimina la voce della barra dei comandi
    mcbMenuCommandBar.Delete

    'chiudere il componente aggiuntivo
    Se viene visualizzato Form quindi
        SaveSetting App.Title, "Settings", "DisplayOnConnect", "1"
        FormDisplayed = False
    Altro
        SaveSetting App.Title, "Settings", "DisplayOnConnect", "0"
    Finisci se

    Scarica mfrmAddIn
    Impostare mfrmAddIn = Nothing

    Set MenuHandler = Nothing
    Set MenuHandler2 = Nothing
End Sub

'************************************************* ****************************
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Questo metodo esegue le attività necessarie quando si fa clic sulla voce di menu.
'************************************************* ****************************
Sottomenu privatoHandler_Click (ByVal CommandBarControl come oggetto, gestito come booleano, CancelDefault come booleano)
    RunScript
End Sub

'************************************************* ****************************
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Questo metodo esegue le attività necessarie quando si fa clic sul pulsante della barra degli strumenti.
'************************************************* ****************************
Sottomenu privatoHandler2_Click (ByVal CommandBarControl come oggetto, gestito come booleano, CancelDefault come booleano)
    RunScript
End Sub

'************************************************* ****************************
'AddToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
"DESCRIZIONE:
'Aggiunge l'elemento specificato all'elenco dei menu.
'************************************************* ****************************
Funzione AddToAddInCommandBar (sCaption As String) As Office.CommandBarControl
    Dim cbMenuCommandBar Come oggetto della barra dei comandi di Office.CommandBarControl '
    Dim cbMenu As Object

    In caso di errore Riprendi Successivo

    'vedere se riusciamo a trovare il menu dei componenti aggiuntivi
    Set cbMenu = VBInstance.CommandBars ("Componenti aggiuntivi")
    Se cbMenu non è niente allora
        'non disponibile, quindi falliamo
        Esci dalla funzione
    Finisci se

    On Error Vai a ErrorHandler

    'aggiungilo alla barra dei comandi
    Set cbMenuCommandBar = cbMenu.Controls.Add (1)
    'imposta la didascalia
    cbMenuCommandBar.Caption = sCaption

    Impostare AddToAddInCommandBar = cbMenuCommandBar

    Esci dalla funzione
ErrorHandler:
    'Esci con grazia
Fine funzione

Questo codice consente all'applicazione di leggere i colori che desidero da un file che risiede nella stessa directory del .dll (chiamato VB6CodeColours.dat). Questo file contiene quanto segue (e varierà in base ai colori che sostituisci nel VB6.EXE, quindi una copia e incolla diretta probabilmente non funzioneranno.

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

Sembra incomprensibile, ma ti spiego. Ha il formato "Codice colore", "Primo piano", "Sfondo", Indicatore ", quindi la riga superiore imposterà il" Testo normale "sul 14 ° elemento nella combo per Primo piano, il 12 ° per Sfondo e il 1 ° per l'indicatore .

Perché ho detto che è una soluzione piuttosto grezza: * Utilizza SendKeys. Non ne ho bisogno di ulteriori spiegazioni :) * L'utente deve fare clic sull'opzione menu / barra degli strumenti per rendere effettiva. * Il codice non è meglio strutturato (secondo me) ma era basato sulla quantità di tempo che potevo dedicare ad esso in quel momento. Mi propongo di migliorarlo in futuro, ma funziona bene per me nello stato attuale (quindi probabilmente lo lascerò!)

Forse con una base, qualcuno può espanderci ulteriormente.


2

Ecco il trucco su come mantenere permanente la selezione dei colori. Un po 'più di modifica esadecimale. Se hai effettuato la sostituzione suggerita da Bond , dovresti avere a portata di mano quanto segue: Valori RGBA per 16 colori di base (classici) indicizzati da 0 a 15 e valori RGBA per i tuoi colori personalizzati indicizzati allo stesso modo. Ora cerca VBEx.DLL per la sequenza di byte creata da valori RGBA "classici" ordinati nella seguente sequenza di indici: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (ovvero bianco, grigio, grigio scuro, nero, rosso, rosso scuro, ecc.). Lo schema non è casuale, deriva da valori, memorizzati nel registro, vedi il post di Tex Hex. La stringa esadecimale per la ricerca dovrebbe apparire come 'FFFFFF00C0C0C0008080800000000000FF000000 ...', ecc. 64 byte totali. Sostituisci la sequenza di byte trovati con valori RGBA di colori "personalizzati" ordinati allo stesso modo, ad esempio 15, 7, 8, ecc. Ora tutti i colori scelti nell'interfaccia utente VS verranno archiviati nel registro e applicati dopo il riavvio dell'applicazione. Bene, tutti, ma i colori "indicatore". Vengono sempre ripristinati ai valori predefiniti. Gli appunti:

  1. In VBE7.DLL (MSO2010) ho trovato solo una sequenza di byte ordinata in questo modo all'offset 0x15A98C.
  2. Come menzionato nel post di Bond, ci sono diverse sequenze di byte per la prima sostituzione (valori RGBA di base ordinati direttamente da 0 a 15). Ho cambiato solo uno, il più vicino all'offset della nota precedente (trovato a 0x15A5AC).
  3. Tutto sopra lo stai facendo a tuo rischio e pericolo :) E non dimenticare di eseguire il backup.

Grazie a Tex Hex e Bond per la ricerca iniziale.

UPD: testato con MSO2007 (VBE6.DLL) e MSO2013 (VBE7.DLL). Lavora come un fascino.


2

La soluzione Bond (modificando la tabella dei colori in VB6.exe) funziona perfettamente per modificare la tabella dei colori nell'IDE VB6. Tuttavia, ho scoperto che quando viene selezionato un colore modificato e VB6 viene chiuso, VB6 non è in grado di salvare correttamente il colore modificato nel registro.

Normalmente, VB6 scriverà un indice nella tabella dei colori a 16 valori per ogni elemento di testo a cui è possibile modificare il colore.

Gli indici dei colori sono scritti nel registro qui:

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

Ad esempio, il valore CodeForeColors sarà simile al seguente:

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

I valori da 1 a 16 rappresentano un colore nella tabella dei colori e 0 significa "Auto".

Tuttavia, quando viene selezionato un colore modificato, VB6 scriverà un numero al di fuori dell'intervallo di indice nel registro e il valore CodeForeColors avrà un aspetto simile al seguente:

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

Al successivo avvio di VB6, non sarà possibile impostare il colore corretto per l'elemento che era stato impostato sul colore modificato.

Sto ancora cercando di trovare una soluzione, ma volevo pubblicare quello che ho trovato finora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.