Wie kann ich benutzerdefinierte Farben im Microsoft VBA-Editor verwenden?

33

Ich arbeite an einigen Projekten für die Arbeit mit Excel und VBA, daher habe ich keine andere Wahl, als den Microsoft Visual Basic-Editor zu verwenden. Normalerweise würde es mir nichts ausmachen, aber ich kann nicht herausfinden, wie ich eine benutzerdefinierte Farbe für den Editor festlegen kann (ich kann nur aus der Standardpalette auswählen).

Um die aktuelle Farbe zu ändern, gehe ich zu Tools -> Options -> Editor Format... Ihre Auswahl beschränkt sich jedoch nur auf die Standardfarben (und die Standardfarben) 16 - und wenn ich Basic sage, meine ich Basic , wie Pink, Blau, Schwarz, Weiß usw. ..

Weiß jemand, wie man entweder eine benutzerdefinierte Farbe angibt oder zumindest einige der Farben ändert, die in der Standardpalette angezeigt werden?

Durchbruch
quelle
Ich denke, Microsoft versucht uns mitzuteilen, dass sie nicht wollen, dass Leute in VBA programmieren. Oder vielleicht Bill Gates sind schwer in Produzenten von Schmerzmitteln.
Holene

Antworten:

19

VBA liest die Einstellungen für die Farben aus diesen Registrierungsschlüsseln:

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

Jeder dieser Schlüssel enthält eine Liste von Werten (durch Leerzeichen getrennt) für jeden Eintrag unter Extras -> Optionen -> Editorformat. Beispielsweise ist der erste Wert in CodeBackColors die Hintergrundfarbe und der erste Wert in CodeForeColors die Vordergrundfarbe für normalen Text. Die Werte sind die interne ID für die Farbe, 0 bedeutet AUTO-Färbung, 11 zeigt Cyan, 5 Rot usw.

Probieren Sie es aus: Schließen Sie Excel, ändern Sie den ersten Wert von CodeBackColors in 5 und starten Sie Excel neu. Der Hintergrund des Code-Editors ist jetzt rot.

Das Problem ist, dass der VBA-Editor nur diese internen Werte unterstützt und die höchste Zahl, die er versteht, 16 ist. Alle anderen Werte werden nicht akzeptiert und werden standardmäßig auf AUTO zurückgesetzt.

Ich habe verschiedene Eingabemöglichkeiten für unterschiedliche Werte ausprobiert (z. B. 128255128, 16777215, #aaffee, 255 oder "170,255,238"), und keine davon hat funktioniert.

Aus diesem Grund denke ich, dass es technisch nicht möglich ist, andere Farben zuzuweisen.

Tex Hex
quelle
1
Danke für die Antwort. IIRC, Sie können ein Kopfgeld nicht zurückziehen, aber wenn Sie dies buchstäblich nicht können, werde ich es Ihnen für die richtigste Antwort zuteilen. Ich möchte etwas länger warten, um zu sehen, ob weitere Antworten veröffentlicht werden, aber danke für Ihre Antwort, +1.
Durchbruch
1
Ich muss zugeben, das klingt noch besser :)
Tex Hex
"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) von FMS verfügt über das Tool "VBE Color Scheme Manager, mit dem Sie die Farben für Ihren Editor einfach anzeigen und festlegen können". Wenn Sie das Benutzerhandbuch (PDF) herunterladen, werden Screenshots angezeigt, die das Festlegen von Farben vereinfachen und sich dennoch auf eine 16-Farben-Palette beschränken. Würde denken, wenn es eine direkte Möglichkeit gäbe, benutzerdefinierte Farben zu verwenden, hätten sie diese in dieses Tool aufgenommen. Sieht aus wie Tex Hex richtig ist.
Brian
Da mit den folgenden Antworten nun gezeigt wurde, dass dies möglich ist, sollte diese Antwort geändert werden. Mit einem HEX-Editor können die Farben im VBA-Editor zuverlässig geändert werden.
Steven Martin
16

Ich habe eine Anwendung basierend auf den Informationen hier erstellt: https://github.com/dimitropoulos/VBECustomColors

Es sichert im Grunde genommen die DLL-Datei VBE6 / VBE7 und ermöglicht die Verwendung benutzerdefinierter Farben, ohne einen Hex-Editor verwenden zu müssen.

ss

Sie können es hier herunterladen: https://github.com/gallaux/VBEThemeColorEditor

Genießen

Bearbeiten: Quellcode ist jetzt verfügbar!

Gallaux
quelle
Wow super cool, danke für das Teilen von @gallaux - ich werde das auf jeden Fall überprüfen. Planen Sie, den Quellcode aus Neugier heraus zu veröffentlichen?
Durchbruch
Ja, werde ich bald, ich muss es nur ein wenig aufräumen;)
Gallaux
Vielen Dank Gallaux, ich hatte vor, das Gleiche zu tun, aber als ich meinen VBA-Editor auf das gewünschte Farbschema eingestellt hatte, verlor ich diese Motivation, weil ich nicht mehr so ​​frustriert war wie mit "16 Farben"!
Steven Martin
1
Entschuldigung, wie Sie dies anwenden, ich brauche Hilfe
Pedro Miguel Pimienta Morales
1
@YouCrackedMeUp Sie müssen den Registrierungsschlüssel mit regedit aktualisieren (basierend auf github.com/dimitropoulos/VBECustomColors ): [1] Navigieren Sie in regedit zu HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] Wechsel CodeBackColorszu: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] Wechsel CodeForeColorszu: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] Wechsel FontFacezu: Consolas.
Tigregalis
7

TeX HeX ist genau richtig. Es ist jedoch möglich, die 16 integrierten Farben mit Ihren eigenen zu ändern. Es erfordert nur ein bisschen Hex-Bearbeitung. Hier ist eine Schritt-für-Schritt-Anleitung. (Hinweis: Dies ist für VB6 SP6, Dateiversion 6.0.97.82).

  1. Sichern Sie Ihre VB6.EXE-Datei in Ihrem VB98-Programmordner. (Optional, aber empfohlen).

  2. Starten Sie Ihren bevorzugten Hex-Editor (rufen Sie HxD an) und öffnen Sie VB6.EXE.

  3. Zur Adresse 0xE22F4 springen. Dies ist der Beginn der Farbtabelle.

Sie sollten vier Nullen sehen. Dies stellt die Farbe Schwarz im RRGGBBAA-Format dar (Alpha wird nicht unterstützt, es ist also wirklich nur das RRGGBB00-Format). Die nächsten vier Bytes geben die nächste Farbe usw. an, bis Sie zu FFFFFF00 (weiß) gelangen, das mit dem Offset 0xE2333 endet.

  1. Bearbeiten Sie einen dieser 4-Byte-Werte nach Ihren Wünschen. Verwenden Sie einfach die entsprechenden Hex-Werte im RGB-Format, gefolgt von einem Null-Byte. Zum Beispiel wäre RGB (64, 128, 192) 40 80 C0 00.

  2. Speichern Sie Ihre Änderungen an der EXE und starten Sie VB6. Sie sollten Ihre neuen Farben in den Steckplätzen sehen, die zuvor von den integrierten VB-Farben belegt waren.

Bindung
quelle
1
Hmm, ich habe mit dem Tool alles auf einem System mit Office 2003 durchsucht und es wurde keine Datei mit dem Namen VB6.exe oder ein Ordner mit dem Namen VB98 gefunden. Ist diese Antwort nur für Office 2007 wie das OP? Allerdings ist die Version 6.0.97.82 älter als meine mit Office 2003.
Nixda
1
@nixda Auf meinem System gibt es auch nichts - ich glaube, Bond bezieht sich auf die VB6-Anwendung auf seinem System, nicht auf die in Excel integrierte VBA. Ich werde mir die ausführbare Excel-Datei und einige der VBA-DLLs ansehen und nachsehen, ob ich Farbtabellen finde.
Durchbruch
1
Ich habe Office 2010 auf meinem PC, also habe ich VBE7.DLL, nicht VBE6.DLL, aber es sollte der gleiche Prozess sein. Die Farben sind gleich. Wenn Sie sich die Farben in der Reihenfolge ansehen, in der sie angezeigt werden, sollten sie folgendermaßen aussehen: Schwarz = 00 00 00 00 Marine = 00 00 80 00 Grün = 00 80 00 00 Türkis = 00 80 80 00 Magenta = 80 00 00 00 Violett = 80 00 80 00 Olive = 80 80 00 00 Lgt Gray = C0 C0 C0 00 Drk Gray = 80 80 80 00 ... Ich habe die Hex-Farbcodes neben jedem hinzugefügt. Öffnen Sie also einfach VBE6.DLL in einem Hex-Editor und suchen Sie nach der folgenden Hex-Zeichenfolge:
Bond
1
000000000000800000800000008080008000008000800080800000C0C0C00080808000 Es kann mehrmals vorkommen, aber ich habe festgestellt, dass nur die erste Farbtabelle geändert werden muss. Sehen Sie, ob das bei Ihnen funktioniert.
Bond
1
Geniale Antwort, Bond. Für zukünftige Leser war der Schlüssel, den ich ändern musste, der zweite (Office 2013, Windows 8.1), der sich mit Hex Edit (Byte Nr. 1.200.308) unter `12 50B4 'befand
Andy Terra,
5

Wie bereits erwähnt, funktioniert Bonds Lösung (hexadezimales Bearbeiten der Farbtabelle in VB6.exe), Sie müssen jedoch bei jedem Start von VB6 die Farben im Dialogfeld "Optionen" neu einstellen. Ich habe ein AutoIt- Skript erstellt, das die gesamte Arbeit für Sie erledigt. Bearbeiten Sie es einfach nach Bedarf, wenn alle Aufrufe von SetSyntaxColoring () erfolgen:

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

Ich behalte es einfach auf meinem Desktop und jetzt, wenn ich vb6 öffnen muss, doppelklicke ich darauf und die Syntaxfärbung ist einfach unter meiner Kontrolle.

Edit 1: Das Skript wurde ein wenig optimiert, um die Ausführung zu beschleunigen. Ich denke darüber nach, ein Programm zusammenzustellen, das VB6.EXE automatisch bearbeitet, um die Farbauswahl zu vereinfachen. Ich frage mich, ob es eine Möglichkeit gibt, das AutoIt-Skript durch Erstellen eines Plugins für VS zu umgehen.

Bearbeiten 2: Erstellt ein Dienstprogramm, mit dem Sie die Farben in der Exe bearbeiten können, ohne einen Hex-Editor verwenden zu müssen: VbClassicColorEditor . Dieser Link führt zum öffentlichen Repository von bitbucket.

Dylan Nissley
quelle
Danke für das Drehbuch und den Beitrag! Gibt es eine Chance, dass wir einen aktualisierten Link zum VbClassicColorEditor bekommen? Der, den Sie gepostet haben, hat 404d ...
Andy Terra
3

Ich wollte nur eine Zusammenfassung der vorherigen Antworten veröffentlichen, da nicht ganz klar ist, was getan werden muss, um die Farben im Excel VBA-Editor zu ändern

Im folgenden Beispiel füge ich das Farbschema für Solarized hinzu und gehe von der Verwendung von Office 2010 aus

Schritt 0: Erstellen Sie eine Sicherungskopie der VBE7.dll, bevor Sie diese ändern - Sie wurden gewarnt !!!

Schritt 1: Öffnen Sie in einem Hex-Editor die Datei VBE7.dll, die sich unter befindet.

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

oder

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

Schritt 2: Finden Sie das 1. Vorkommen von

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`

und ersetzen mit

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

Schritt 3: Finden Sie das 2. Vorkommen davon (stellen Sie sicher, dass Sie oben in der Datei suchen)

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

und ersetzen mit

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

Schritt 4: Speichern Sie die DLL-Datei, öffnen Sie Excel> VBA-Editor> Extras> Optionen> Editor-Format und legen Sie die Codefarben fest.

Das Ändern beider Zeichenfolgen ist erforderlich, damit die Farben beim Herunterfahren korrekt gespeichert werden und der Farbeditor ohne Absturz von Excel geöffnet werden kann.

Vielen Dank an alle vorherigen Antwortenden, die sich die Zeit genommen haben, dies herauszufinden!

Steven Martin
quelle
3

Ich habe ein Programm erstellt, das all dies automatisiert, viel zu lange damit verbracht und Spaß daran gehabt, einen Farbwähler zu erstellen. Made in VB6 weil warum nicht. Kompiliertes Programm und Quellcode hier verfügbar . Getestet nur auf meinen Versionen der DLLs und VB6, machen Sie bitte Backups, bevor Sie etwas ändern - die Speicherorte sind im Code festgelegt.



Dies ist eine sehr alte Frage, aber ich möchte der Vollständigkeit halber abwägen

Für VS2012-Farben in VBA- oder VB6-IDE: Öffnen Sie VBE6.DLL / VBE7.DLL oder VBA6.DLL in

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

mit deinem hex editor

Ersetzen Sie das erste Vorkommen von

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

Mit

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

Kehren Sie dann nach oben zurück und ersetzen Sie das zweite Vorkommen von

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

mit

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

Ändern Sie dann Folgendes in der Registrierung

(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 '

Wenn Sie für VBA modifizieren, sind Sie fertig. Öffnen Sie für VB6 jetzt 'VB6.exe' in Ihrem Hex-Editor und ändern Sie das erste Vorkommen von

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

mit

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

Dadurch wird die in der Oberfläche von VB6 angezeigte Farbe korrigiert, sodass Sie weitere Änderungen an den Farben vornehmen können.

Vielen Dank an alle anderen Antworten. Ich habe mir das nicht ausgedacht, sondern nur gedacht, dass es nützlich ist, alle erforderlichen Informationen in einem einzigen Beitrag zu haben. Mit dieser Methode sollten Sie in der Lage sein, aus den verfügbaren Farben frei zu wählen.

Ich habe auch die Farben einiger anderer Antworten neu angeordnet, also ändere vbRed, vbBlue, vbWhite usw. nicht, damit du immer noch das gewünschte Ergebnis im Code erhältst. Da dies nicht vollständig getestet wurde, ändern Sie Programme immer auf eigenes Risiko.

Es wäre schön, ein kleines Programm zusammenzustellen, das dies für Sie erledigt (wie es Gallaux getan hat). Ich hatte Probleme beim Schreiben in die Registrierung und in die VB6-IDE mit diesem Programm, und eine Art Vorschaufenster wäre schön.

Einschränkungen, die ich gefunden habe: Dies ändert nicht die Farbe der Anzeigesymbole. Sie müssen dies selbst tun.

Sam
quelle
2

Ausgehend von Dnissleys Antwort (wo er fragt, ob jemand ein Add-In erstellen könnte) habe ich ein Add-In für VB6 erstellt. Es ist ein bisschen grob (und ich erkläre gleich, warum), aber es macht den Job.

Ich habe in VB6 ein neues Add-In-Projekt erstellt, das mir das Standardformular "frmAddin" (das ich nicht verwende) und den Designer "Connect" gab. Ich habe selbst eine Farbklasse hinzugefügt, die Folgendes enthält:

Option explizit

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

Öffentliche Eigenschaft Let ForeColour (ByVal iID As Integer)
    m_iForeColour = iID
Eigenschaft beenden
Öffentliche Eigenschaft Get ForeColour () As Integer
    ForeColour = m_iForeColour
Eigenschaft beenden

Öffentliche Eigenschaft Let BackColour (ByVal iID As Integer)
    m_iBackColour = iID
Eigenschaft beenden
Öffentliche Eigenschaft Get BackColour () As Integer
    BackColour = m_iBackColour
Eigenschaft beenden

Öffentliche Eigenschaft Let IndicatorColour (ByVal iID As Integer)
    m_iIndicatorColour = iID
Eigenschaft beenden
Öffentliche Eigenschaft Get IndicatorColour () As Integer
    IndicatorColour = m_iIndicatorColour
Eigenschaft beenden

Und dann habe ich den Code im "Connect" -Designer folgendermaßen geändert:

Option explizit

Öffentliches FormDisplayed As Boolean
Öffentliche VBInstance As VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
Dim mfrmAddIn As New frmAddIn
Public WithEvents MenuHandler Als CommandBarEvents-Ereignisbehandlungsroutine für die Befehlsleiste

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 As CommandBarEvents

Dim codeColours () As Color

'************************************************** ****************************
'RunScript Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Führt den Code aus, mit dem die erforderlichen Farben für das Codefenster in der festgelegt werden
'aktive IDE.
"*** EIN PROJEKT MUSS GELADEN WERDEN, BEVOR ES WIRKLICH FUNKTIONIERT ***
'************************************************** ****************************
Sub RunScript ()
    ReadColoursFile

    'Wählen Sie Extras> Optionen
    SendKeys "% to", 5
    'Gehe zu den Registerkarten, wähle "Optionen"
    SendKeys "+ {TAB}"
    SendKeys "{RIGHT}"

    'Listbox auswählen
    SendKeys "{TAB}"

    Dim colourSetting As Color
    IColour As Integer dimen

    Für iColour = 0 bis 9
        SetColours iColour, CodeColours (iColour)
    Nächste iColour

    SendKeys "~"
End Sub

'************************************************** ****************************
'ReadColoursFile Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Liest die Farbdatei von der Festplatte und füllt das codeColours-Array, das
'wird von den SetColour * -Methoden zur Auswahl der richtigen Farben aus verwendet
'den Optionsbildschirm.
'************************************************** ****************************
Unter ReadColoursFile ()
    Dimmen Sie colourLine As String ab
    Dim colourArray () As String
    Dim colourSetting As Color
    OFSO als FileSystemObject dimmen

    Setzen Sie oFSO = New FileSystemObject

    Wenn nicht, oFSO.FileExists (App.Path & "\ VB6CodeColours.dat") Then
        MsgBox "VB6CodeColours.dat nicht gefunden in" & App.Path, vbOKOnly, "VB6CodeColours-Einstellungsdatei nicht gefunden!"
        Sub beenden
    End If

    Setze oFSO = Nothing

    Öffnen Sie App.Path & "\ VB6CodeColours.dat" für Eingabe als # 1
    ReDim codeColours (9) Als Farbe

    Während nicht EOF (1)
        Line Input # 1, colourLine
        colourArray = Split (colourLine, ",")

        If IsNumeric (colourArray (0)) Then
            Wenn codeColours (colourArray (0)) nichts ist, dann
                Stellen Sie colourSetting = New Color ein

                If IsNumeric (colourArray (1)) Then
                    colourSetting.ForeColour = CInt (colourArray (1))
                End If

                If IsNumeric (colourArray (2)) Then
                    colourSetting.BackColour = CInt (colourArray (2))
                End If

                If IsNumeric (colourArray (3)) Then
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                End If

                Setze codeColours (colourArray (0)) = colourSetting
            End If
        End If
    Wend

    Schließen Sie # 1

    Set colourSetting = Nothing
End Sub

'************************************************** ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Wählt das Farbelement aus der Liste aus und iteriert dann die Farbauswahl
'steuert dieses Element und legt sie gemäß den Werten fest
'in der Datei VB6CodeColours.dat einstellen.
'************************************************** ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colourSetting As Color)
    IKey als Ganzzahl dimmen

    SendKeys "{HOME}"

    Für iKey = 1 bis iColour
        SendKeys "{DOWN}"
    Nächster iKey

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

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

'************************************************** ****************************
'SetColourSelector Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Legt die Farbe in der Auswahlkombination fest. Angenommen, der Fokus liegt auf der
'vor der Kontrolle, bevor der Code ausgeführt wird (Tabulatoren in der ersten Zeile bis zum
übernommene Kontrolle).
'************************************************** ****************************
Sub SetColourSelector (ByVal iColour As Integer)
    IKey als Ganzzahl dimmen

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

    Für iKey = 1 bis iColour
        SendKeys "{DOWN}"
    Nächster iKey
End Sub

'************************************************** ****************************
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Diese Methode wird ausgeführt, wenn das Add-In von der IDE geladen wird
'************************************************** ****************************
Private Sub AddinInstance_OnConnection (ByVal-Anwendung als Objekt, ByVal ConnectMode als AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom () als Variante)
    On Error Gehe zu ErrorHandler

    'speichere die vb instanz
    Setzen Sie VBInstance = Application

    Wenn ConnectMode ext_cm_External Dann
        Set mcbMenuCommandBar = AddToAddInCommandBar ("VB6-Codefarbe")
        versenken die Veranstaltung
        Set Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

        OStdToolbar abdunkeln Als Office.CommandBar
        OStdToolbarItem als Office.CommandBarControl dimen

        Set oStdToolbar = VBInstance.CommandBars ("Standard")
        Setze oStdToolbarItem = oStdToolbar.Controls.Add (Typ: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "IDE-Farben festlegen"
        oStdToolbarItem.BeginGroup = True
        Set Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    End If

    Sub beenden
ErrorHandler:
    MsgBox Err.Description
End Sub

'************************************************** ****************************
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Diese Methode wird ausgeführt, wenn das Add-In von der IDE entfernt und alle entfernt werden
Referenzen etc.
'************************************************** ****************************
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom () As Variant)
    On Error Resume Weiter

    'Löschen Sie den Befehlsleisteneintrag
    mcbMenuCommandBar.Delete

    Fahren Sie das Add-In herunter
    Wenn dann FormDisplayed
        SaveSetting App.Title, "Einstellungen", "DisplayOnConnect", "1"
        FormDisplayed = False
    Sonst
        SaveSetting App.Title, "Einstellungen", "DisplayOnConnect", "0"
    End If

    Entladen Sie mfrmAddIn
    Setzen Sie mfrmAddIn = Nothing

    Setzen Sie MenuHandler = Nothing
    Set MenuHandler2 = Nothing
End Sub

'************************************************** ****************************
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Diese Methode führt die erforderlichen Aufgaben aus, wenn auf den Menüpunkt geklickt wird.
'************************************************** ****************************
Private Sub MenuHandler_Click (ByVal CommandBarControl As Object, behandelt als Boolean, CancelDefault As Boolean)
    Skript ausführen
End Sub

'************************************************** ****************************
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Diese Methode führt die erforderlichen Aufgaben aus, wenn auf die Symbolleistenschaltfläche geklickt wird.
'************************************************** ****************************
Private Sub MenuHandler2_Click (ByVal CommandBarControl As Object, behandelt als Boolean, CancelDefault As Boolean)
    Skript ausführen
End Sub

'************************************************** ****************************
'AddToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
' BESCHREIBUNG:
'Fügt das angegebene Element der Menüliste hinzu.
'************************************************** ****************************
Funktion AddToAddInCommandBar (sCaption As String) As Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl 'Befehlsleistenobjekt
    Dim cbMenu As Object

    On Error Resume Weiter

    Überprüfen Sie, ob das Menü "Add-Ins" angezeigt wird
    Set cbMenu = VBInstance.CommandBars ("Add-Ins")
    Wenn cbMenu nichts ist, dann
        'nicht verfügbar, also scheitern wir
        Funktion beenden
    End If

    On Error Gehe zu ErrorHandler

    'füge es der Befehlsleiste hinzu
    Setze cbMenuCommandBar = cbMenu.Controls.Add (1)
    'setze die Überschrift
    cbMenuCommandBar.Caption = sCaption

    Setzen Sie AddToAddInCommandBar = cbMenuCommandBar

    Funktion beenden
ErrorHandler:
    'Beende anmutig
Funktion beenden

Mit diesem Code kann die Anwendung die gewünschten Farben aus einer Datei lesen, die sich im selben Verzeichnis befindet wie die DLL (VB6CodeColours.dat). Diese Datei enthält Folgendes (und hängt davon ab, welche Farben Sie in der Datei VB6.EXE ersetzen), sodass ein direktes Kopieren und Einfügen wahrscheinlich nicht funktioniert.

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

Sieht Kauderwelsch aus, aber ich werde es erklären. Es hat das Format "Codefarbe", "Vordergrund", "Hintergrund", Indikator ", so dass in der oberen Reihe der" Normale Text "auf das 14. Element in der Kombination für den Vordergrund, das 12. für den Hintergrund und das 1. für den Indikator gesetzt wird .

Warum habe ich gesagt, es ist eine ziemlich grobe Lösung: * Es verwendet SendKeys. Keine weiteren Erklärungen erforderlich, da bin ich mir sicher :) * Der Benutzer muss auf die Menü- / Symbolleistenoption klicken, damit sie wirksam wird. * Der Code ist (meiner Meinung nach) nicht am besten strukturiert, basierte jedoch auf der Zeit, die ich ihm zu diesem Zeitpunkt widmen konnte. Ich versuche, es in Zukunft zu verbessern, aber es funktioniert im aktuellen Zustand einwandfrei (also werde ich es wahrscheinlich lassen!)

Vielleicht kann jemand auf dieser Grundlage weiter darauf eingehen.

Jonifen
quelle
2

Hier ist der Trick, wie Sie Ihre Farbauswahl dauerhaft beibehalten können. Ein bisschen mehr Hex-Bearbeitung. Wenn Sie die von Bond vorgeschlagene Ersetzung vorgenommen haben, sollten Sie Folgendes zur Hand haben: RGBA-Werte für die Basisfarben (klassisch) 16, die von 0 bis 15 indiziert sind, und RGBA-Werte für Ihre benutzerdefinierten Farben, die auf die gleiche Weise indiziert sind. Durchsuchen Sie nun VBEx.DLL nach einer Bytefolge, die aus "klassischen" RGBA-Werten aufgebaut ist und in der folgenden Reihenfolge von Indizes geordnet ist: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (dh weiß, grau, dunkelgrau, schwarz, rot, dunkelrot usw.). Das Muster ist nicht zufällig, sondern von Werten abgeleitet, die in der Registrierung gespeichert sind (siehe Beitrag von Tex Hex). Die Hex-Zeichenfolge für die Suche sollte wie folgt aussehen: 'FFFFFF00C0C0C0008080800000000000FF000000 ...' usw. Insgesamt 64 Byte. Ersetzen Sie die gefundene Bytesequenz durch RGBA-Werte von "benutzerdefinierten" Farben, die in derselben Reihenfolge angeordnet sind, z. B. 15, 7, 8 usw. Jetzt werden alle Farben, die Sie in der VS-Benutzeroberfläche auswählen, in der Registrierung gespeichert und nach dem Neustart der Anwendung angewendet. Na ja, alle außer "Indikator" -Farben. Diese werden immer auf die Standardeinstellungen zurückgesetzt. Anmerkungen:

  1. In VBE7.DLL (MSO2010) habe ich nur eine Folge von Bytes gefunden, die so bei Offset 0x15A98C angeordnet sind.
  2. Wie in Bonds Post erwähnt, gibt es mehrere Byte-Sequenzen für die erste Ersetzung (grundlegende RGBA-Werte, die direkt von 0 bis 15 angeordnet sind). Ich habe nur einen Wert geändert, der dem Versatz der vorherigen Note am nächsten liegt (gefunden bei 0x15A5AC).
  3. Alles obige machst du auf eigenes Risiko :) Und vergiss nicht, ein Backup zu machen.

Vielen Dank an Tex Hex und Bond für die ersten Recherchen.

UPD: Getestet mit MSO2007 (VBE6.DLL) und MSO2013 (VBE7.DLL). Arbeit wie ein Zauber.

dias
quelle
2

Die Lösung von Bond (Bearbeiten der Farbtabelle in VB6.exe) eignet sich perfekt zum Ändern der Farbtabelle in der VB6-IDE. Ich stellte jedoch fest, dass VB6 die geänderte Farbe nicht ordnungsgemäß in der Registrierung speichern kann, wenn eine geänderte Farbe ausgewählt und VB6 heruntergefahren wird.

Normalerweise schreibt VB6 für jedes Textelement, dessen Farbe geändert werden kann, einen Index in die Farbtabelle mit 16 Werten.

Die Farbindizes werden hier in die Registrierung geschrieben:

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

Der CodeForeColors-Wert sieht beispielsweise folgendermaßen aus:

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

Werte von 1 bis 16 stellen eine Farbe in der Farbtabelle dar und 0 bedeutet 'Auto'.

Wenn jedoch eine geänderte Farbe ausgewählt wird, schreibt VB6 eine Zahl außerhalb des Indexbereichs in die Registrierung und der CodeForeColors-Wert sieht ungefähr so ​​aus:

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

Beim nächsten Start von VB6 kann nicht die richtige Farbe für das Element festgelegt werden, für das die geänderte Farbe festgelegt wurde.

Ich versuche immer noch, eine Lösung zu finden, wollte aber posten, was ich bisher gefunden habe.

Ravanbak
quelle