Jak mogę używać niestandardowych kolorów w edytorze Microsoft VBA?

33

Pracuję nad kilkoma projektami do pracy przy użyciu Excela i VBA, więc nie mam wyboru i muszę użyć edytora Microsoft Visual Basic. Zwykle nie miałbym nic przeciwko, ale nie mogę wymyślić, jak ustawić niestandardowy kolor dla edytora (mogę tylko wybrać domyślną paletę).

Aby zmienić kolor obecnie, przechodzę do Tools -> Options -> Editor Format... Jednak twoje wybory są ograniczone tylko do domyślnych (i podstawowych) 16 kolorów - a kiedy mówię podstawowy, mam na myśli podstawowe , takie jak różowy, niebieski, czarny, biały itp. ..

Czy ktoś wie, jak albo określić niestandardowy kolor, albo przynajmniej zmienić niektóre kolory wyświetlane w domyślnej palecie?

Przełom
źródło
Myślę, że Microsoft próbuje nam powiedzieć, że nie chcą, żeby ludzie programowali w VBA. A może Bill Gates lubi producentów środków przeciwbólowych.
Holene,

Odpowiedzi:

19

VBA odczytuje ustawienia kolorów z tych kluczy rejestru:

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

Każdy z tych kluczy zawiera listę wartości (oddzielonych spacją) dla każdego wpisu w Narzędziach -> Opcje -> Format edytora. Na przykład pierwsza wartość w CodeBackColors to kolor tła, a pierwsza wartość w CodeForeColors to kolor pierwszego planu dla normalnego tekstu. Wartości są wewnętrznym identyfikatorem koloru, 0 oznacza automatyczne kolorowanie, 11 pokazuje cyjan, 5 czerwonych itp.

Aby spróbować: Zamknij program Excel, zmień pierwszą wartość CodeBackColors na 5 i uruchom ponownie program Excel. Tło edytora kodu będzie teraz czerwone.

Problem polega na tym, że edytor VBA obsługuje tylko te wartości wewnętrzne, a najwyższa liczba, jaką rozumie, to 16. Każda inna wartość nie zostanie zaakceptowana i domyślnie zostanie przywrócona wartość AUTO.

Wypróbowałem kilka opcji wprowadzania różnych wartości (np. 128255128, 16777215, #aaffee, 255 lub „170,255,238”) i żadna z nich nie zadziałała.

Dlatego myślę, że technicznie nie jest możliwe przypisanie innych kolorów.

Tex Hex
źródło
1
Dziękuję za odpowiedź. IIRC, nie możesz wycofać nagrody, ale jeśli dosłownie nie możesz tego zrobić, przyznam ci ją za najbardziej poprawną odpowiedź. Chcę jeszcze trochę poczekać, aby zobaczyć, czy opublikowano więcej odpowiedzi, ale dziękuję za odpowiedź +1.
Przełom
1
Muszę przyznać, że brzmi to jeszcze lepiej :)
Tex Hex
„Total Visual CodeTools” ( fmsinc.com/vb6/CodingTools.html ) firmy FMS ma narzędzie „Menedżer schematu kolorów VBE do łatwego przeglądania i ustawiania kolorów dla edytora”. Jeśli pobierzesz instrukcję obsługi (plik PDF), zobaczysz zrzuty ekranu, które ułatwiając ustawianie kolorów, są nadal ograniczone do palety 16 kolorów. Pomyślałby, że gdyby istniał bezpośredni sposób użycia niestandardowych kolorów, umieściłby go w tym narzędziu. Wygląda na to, że Tex Hex jest poprawny.
Brian
Jak pokazano poniżej z odpowiedziami, że jest to możliwe, odpowiedź ta powinna zostać zmodyfikowana. Możliwe jest niezawodne zmienianie kolorów w edytorze VBA za pomocą edytora HEX.
Steven Martin
16

Stworzyłem aplikację na podstawie informacji tutaj: https://github.com/dimitropoulos/VBECustomColors

Zasadniczo tworzy kopię zapasową pliku .dll VBE6 / VBE7 i umożliwia stosowanie niestandardowych kolorów bez konieczności korzystania z edytora szesnastkowego.

ss

Możesz go pobrać tutaj: https://github.com/gallaux/VBEThemeColorEditor

Cieszyć się

Edycja: Kod źródłowy jest już dostępny!

gallaux
źródło
Wow, super spoko, dziękuję za udostępnienie @gallaux - na pewno to sprawdzę. Czy planujesz uwolnić kod źródłowy z ciekawości?
Przełom
Tak, niedługo będę musiał to trochę posprzątać;)
gallaux,
Dzięki Gallaux, chciałem zrobić to samo, ale kiedy dostałem mój edytor VBA do schematu kolorów, który mi się podobał, straciłem motywację, ponieważ nie byłem już tak „sfrustrowany” zmęczeniem oczu 16 kolorów!
Steven Martin
1
Przepraszam, jak to zastosować, potrzebuję pomocy
Pedro Miguel Pimienta Morales
1
@YouCrackedMeUp musisz zaktualizować klucz rejestru za pomocą regedit (na podstawie github.com/dimitropoulos/VBECustomColors ): [1] Przejdź w regedit do HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] Zmiana CodeBackColorsdo: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] Zmiana CodeForeColorsdo: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] Zmiana FontFacedo: Consolas.
Tigregalis,
7

TeX HeX jest na miejscu. Można jednak zmienić 16 wbudowanych kolorów za pomocą własnych. To wymaga tylko trochę edycji szesnastkowej. Oto przewodnik krok po kroku. (Uwaga: dotyczy VB6 SP6, wersja pliku 6.0.97.82).

  1. Wykonaj kopię zapasową pliku VB6.EXE w folderze programu VB98. (Opcjonalne, ale zalecane).

  2. Uruchom swój ulubiony edytor hex (wykrzycz do HxD) i otwórz VB6.EXE.

  3. Przejdź do adresu 0xE22F4. To jest początek tabeli kolorów.

Powinieneś zobaczyć cztery zera. To reprezentuje kolor czarny w formacie RRGGBBAA (alfa nie jest obsługiwane, więc tak naprawdę jest to tylko format RRGGBB00). Następne cztery bajty określają następny kolor i tak dalej, aż dojdziesz do FFFFFF00 (biały) kończącego się na offset 0xE2333.

  1. Edytuj dowolną z tych czterobajtowych wartości do wyboru. Wystarczy użyć odpowiednich wartości szesnastkowych w formacie RGB, po których następuje zero bajtów. Na przykład RGB (64, 128, 192) wynosiłby 40 80 C0 00.

  2. Zapisz zmiany w EXE i uruchom VB6. Powinieneś zobaczyć swoje nowe kolory w gniazdach wcześniej zajmowanych przez wbudowane kolory VB.

Więź
źródło
1
Hmm, szukałem za pomocą tego narzędzia wszystkiego w systemie z pakietem Office 2003 i nie znalazłem żadnego pliku o nazwie VB6.exe ani folderu VB98. Czy ta odpowiedź dotyczy tylko pakietu Office 2007, tak jak OP? Jednak wersja 6.0.97.82 jest starsza niż moja z pakietem Office 2003.
nixda
1
@nixda Nic też w moim systemie - myślę, że Bond odnosi się do aplikacji VB6 w swoim systemie, a nie VBA zintegrowanej z Excelem. Przejrzę plik wykonywalny programu Excel i niektóre biblioteki DLL VBA i zobaczę, czy mogę znaleźć tabele kolorów.
Przełom
1
Mam pakiet Office 2010 na komputerze, więc mam VBE7.DLL, a nie VBE6.DLL, ale powinien to być ten sam proces. Kolory są takie same. Jeśli spojrzysz na kolory w kolejności, w jakiej są wyświetlane, powinny to być: Czarny = 00 00 00 00 Granatowy = 00 00 80 00 Zielony = 00 80 00 00 Turkusowy = 00 80 80 00 Magenta = 80 00 00 00 Fioletowy = 80 00 80 00 Oliwka = 80 80 00 00 Lgt Grey = C0 C0 C0 00 Drk Grey = 80 80 80 00 ... Dodałem szesnastkowe kody kolorów obok siebie. Więc po prostu otwórz VBE6.DLL w edytorze szesnastkowym i wyszukaj następujący ciąg szesnastkowy:
Bond
1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Może się to zdarzyć wiele razy, ale odkryłem, że pierwszą tabelę kolorów wystarczy zmodyfikować. Sprawdź, czy to Ci odpowiada.
Bond
1
Niesamowita odpowiedź, Bond. Dla przyszłych czytelników kluczem, który musiałem zmienić, był drugi (Office 2013, Windows 8.1), zlokalizowany pod adresem „12 50B4” przy użyciu edycji szesnastkowej (bajt nr 12002008)
Andy Terra,
5

Jak wielu zauważyło, rozwiązanie Bonda (edycja szesnastkowa tabeli kolorów w VB6.exe) będzie działać, ale będziesz musiał wejść i zresetować kolory w oknie dialogowym opcji przy każdym uruchomieniu VB6. Stworzyłem skrypt AutoIt , który wykona całą pracę za Ciebie, po prostu edytuj go, jeśli to konieczne, w miejscu, w którym wykonywane są wszystkie wywołania 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

Po prostu trzymam go na pulpicie i teraz, kiedy muszę otworzyć vb6, po prostu dwukrotnie go klikam i tak, że ta kolorystyka składniowa jest pod moją kontrolą.

Edycja 1: Zoptymalizowano nieco skrypt, aby działał szybciej. Zastanawiam się nad stworzeniem programu, który będzie automatycznie edytował VB6.EXE, aby ułatwić wybór kolorów. Zastanawiam się, czy istnieje sposób, aby porzucić skrypt AutoIt, tworząc wtyczkę dla VS?

Edycja 2: Utworzono narzędzie, które pozwala edytować kolory w pliku exe bez konieczności używania edytora szesnastkowego: VbClassicColorEditor . Ten link prowadzi do publicznego repozytorium na bitbucket.

Dylan Nissley
źródło
Dziękujemy za scenariusz i wkład! Czy jest jakaś szansa, że ​​możemy uzyskać zaktualizowany link na VbClassicColorEditor? Ten, który opublikowałeś ma 404d ...
Andy Terra,
3

Chciałem tylko opublikować podsumowanie poprzednich odpowiedzi, ponieważ nie jest całkowicie jasne, co należy zrobić, aby zmienić kolory w edytorze Excel VBA

W poniższym przykładzie dodałem schemat kolorów dla Solarized i zakładam użycie pakietu Office 2010

Krok 0: Wykonaj kopię zapasową VBE7.dll przed modyfikacją - zostałeś ostrzeżony !!!

Krok 1: W edytorze heksadecymalnym otwórz plik VBE7.dll znajdujący się @

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

lub

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

Krok 2: Znajdź 1. wystąpienie

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`

i zamień na

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

Krok 3: Znajdź drugie wystąpienie tego (upewnij się, że wyszukujesz od początku pliku)

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

i zamień na

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

Krok 4: Zapisz plik dll, a następnie otwórz Excel> VBA Editor> Narzędzia> Opcje> Format edytora i ustaw kolory kodu.

Zmiana obu ciągów jest zbędna, ponieważ pozwala na prawidłowe zapisanie kolorów podczas zamykania i pozwala na otwarcie edytora kolorów bez awarii programu Excel.

Dziękujemy wszystkim poprzednim użytkownikom za poświęcenie czasu na zrozumienie tego!

Steven Martin
źródło
3

Stworzyłem program, który automatyzuje to wszystko, spędziłem na nim zdecydowanie za dużo czasu, dobrze się bawiłem, tworząc próbnik kolorów. Wykonane w VB6, ponieważ dlaczego nie. Skompilowany program i kod źródłowy dostępne tutaj . Testowane tylko na moich wersjach bibliotek DLL i VB6, przed zmianą wykonaj kopie zapasowe - lokalizacje są ustalone w kodzie.



To bardzo stare pytanie, ale chciałbym rozważyć jego kompletność

W przypadku kolorów VS2012 w VBA lub VB6 IDE: Otwórz VBE6.DLL / VBE7.DLL lub VBA6.DLL w

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

za pomocą edytora szesnastkowego

Zamień pierwsze wystąpienie

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

Z

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

Następnie wróć na górę i zastąp drugie wystąpienie

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

z

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

Następnie zmodyfikuj następujące elementy w rejestrze

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

Jeśli modyfikujesz VBA, gotowe, w VB6 otwórz teraz „VB6.exe” w edytorze Hex i zmodyfikuj pierwsze wystąpienie

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

z

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

To koryguje kolor wyświetlany w interfejsie VB6, więc jeśli chcesz wprowadzić inne zmiany kolorów, możesz to zrobić.

Dziękuję wszystkim pozostałym odpowiedziom, sam tego nie wymyśliłem, tylko pomyślałem, że warto mieć wszystkie informacje wymagane w jednym poście (nigdzie nie widziałem modyfikacji VB6.exe i VBA6.dll razem). Korzystając z tej metody powinieneś być w stanie swobodnie wybierać spośród dostępnych kolorów.

Zmieniłem także kolory niektórych innych odpowiedzi, więc nie zmieniaj vbRed, vbBlue, vbWhite itp., Więc powinieneś otrzymać pożądany wynik w kodzie. Nie zostało to w pełni przetestowane, więc zawsze modyfikuj programy na własne ryzyko.

Byłoby miło skompletować mały program, który zrobi to za ciebie (tak jak zrobił to gallaux), miałem problemy z pisaniem do rejestru i VB6 IDE za pomocą tego programu, i przydałby się rodzaj okna podglądu.

Ograniczenia, które znalazłem: nie zmienia to koloru ikon wskaźników, musisz to zrobić sam.

Sam
źródło
2

Biorąc przynętę z odpowiedzi dnissleya (gdzie pyta, czy ktoś mógłby zrobić dodatek), stworzyłem dodatek do VB6. Jest trochę prymitywny (a wkrótce wyjaśnię dlaczego), ale spełnia swoje zadanie.

W VB6 utworzyłem nowy projekt dodatku, który dał mi domyślny formularz „frmAddin” (którego nie używam) i projektanta „Connect”. Sam dodałem klasę kolorów, która zawiera:

Opcja Jawna

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

Właściwość publiczna Let ForeColour (ByVal iID As Integer)
    m_iForeColour = iID
Zakończ właściwość
Właściwość publiczna Get ForeColour () as Integer
    ForeColour = m_iForeColour
Zakończ właściwość

Właściwość publiczna Let BackColour (ByVal iID As Integer)
    m_iBackColour = iID
Zakończ właściwość
Właściwość publiczna Get BackColour () as Integer
    BackColour = m_iBackColour
Zakończ właściwość

Właściwość publiczna Let IndicatorColour (ByVal iID As Integer)
    m_iIndicatorColour = iID
Zakończ właściwość
Właściwość publiczna Uzyskaj IndicatorColour () jako liczba całkowita
    IndicatorColour = m_iIndicatorColour
Zakończ właściwość

A następnie zmieniłem kod w Projektancie „Połącz” w następujący sposób:

Opcja Jawna

Forma publiczna wyświetlana jako logiczna
Publiczny VBInstance jako VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
Dim mfrmAddIn as New frmAddIn
Public WithEvents MenuHandler Jako moduł obsługi zdarzeń paska poleceń CommandBarEvents

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 As CommandBarEvents

Dim codeColours () As Color

„************************************************* ****************************
„RunScript Sub
„------------------------------------------------- ----------------------------
„OPIS:
Uruchamia kod, który ustawia wymagane kolory dla okna kodu w
„aktywne IDE.
„*** PROJEKT MUSI BYĆ ZAŁADOWANY, ABY TO BĘDZIE faktycznie działało ***
„************************************************* ****************************
Sub RunScript ()
    ReadColoursFile

    „Wybierz Narzędzia> Opcje
    SendKeys „% do”, 5
    „Przejdź do kart, wybierz„ Opcje ”
    SendKeys „+ {TAB}”
    SendKeys „{RIGHT}”

    „Wybierz pole listy
    SendKeys „{TAB}”

    Przyciemnij kolor Ustaw jako kolor
    Dim iColour As Integer

    Dla iColour = 0 do 9
        SetColours iColour, codeColours (iColour)
    Następny iColour

    SendKeys „~”
Napis końcowy

„************************************************* ****************************
„ReadColoursFile Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Odczytuje plik koloru z dysku i zapełnia tablicę codeColours, która
”jest używany przez metody SetColour * do wybierania prawidłowych kolorów
„ekran opcji.
„************************************************* ****************************
Sub ReadColoursFile ()
    Dim colour Line As String
    Dim colourArray () As String
    Przyciemnij kolor Ustaw jako kolor
    Dim oFSO As FileSystemObject

    Ustaw oFSO = Nowy FileSystemObject

    Jeśli nie oFSO.FileExists (App.Path & "\ VB6CodeColours.dat"), to
        MsgBox „Nie znaleziono VB6CodeColours.dat w” i App.Path, vbOKOnly, „Nie znaleziono pliku ustawień VB6CodeColours!”
        Wyjdź z Sub
    End If

    Ustaw oFSO = Nic

    Otwórz App.Path & „\ VB6CodeColours.dat” dla danych wejściowych jako nr 1
    Kod ReDim Kolory (9) W kolorze

    Chociaż nie jest EOF (1)
        Wejście liniowe nr 1, colourLine
        colourArray = Split (colourLine, „,”)

        Jeśli IsNumeric (colourArray (0)), to
            Jeśli codeColours (colourArray (0)) nie jest niczym
                Ustaw colourSetting = Nowy kolor

                Jeśli IsNumeric (colourArray (1)), to
                    colourSetting.ForeColour = CInt (colourArray (1))
                End If

                Jeśli IsNumeric (colourArray (2)), to
                    colourSetting.BackColour = CInt (colourArray (2))
                End If

                Jeśli IsNumeric (colourArray (3)), to
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                End If

                Ustaw kod Kolory (colorArray (0)) = colorSetting
            End If
        End If
    Wend

    Zamknij # 1

    Ustaw colourSetting = Nic
Napis końcowy

„************************************************* ****************************
„SetColours Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Wybiera element koloru z listy, a następnie iteruje selektor kolorów
„kontrolki powiązane z tym elementem i ustawia je zgodnie z wartościami
”ustawiony w pliku VB6CodeColours.dat.
„************************************************* ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colourSetting As Color)
    Dim iKey As Integer

    SendKeys „{HOME}”

    Dla iKey = 1 Do iColour
        SendKeys „{DOWN}”
    Następnie iKey

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

    SendKeys „+ {TAB}”
    SendKeys „+ {TAB}”
    SendKeys „+ {TAB}”
Napis końcowy

„************************************************* ****************************
„SetColourSelector Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Ustawia kolor w kombinacji selektora. Zakłada, że ​​koncentruje się na
'poprzednia kontrola przed uruchomieniem kodu (tabulatory pierwszego wiersza do
„przejęła kontrolę).
„************************************************* ****************************
Sub SetColourSelector (ByVal iColour As Integer)
    Dim iKey As Integer

    SendKeys „{TAB}”
    SendKeys „{HOME}”

    Dla iKey = 1 Do iColour
        SendKeys „{DOWN}”
    Następnie iKey
Napis końcowy

„************************************************* ****************************
„AddinInstance_OnConnection Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Ta metoda działa, gdy dodatek jest ładowany przez IDE
„************************************************* ****************************
Private Sub AddinInstance_OnConnection (Aplikacja ByVal jako obiekt, ByVal ConnectMode jako AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst jako obiekt, custom () jako wariant)
    On Error GoTo ErrorHandler

    „zapisz instancję vb
    Ustaw VBInstance = Aplikacja

    Jeśli ConnectMode ext_cm_External Wtedy
        Ustaw mcbMenuCommandBar = AddToAddInCommandBar („Kolorowanie kodu VB6”)
        zatopić wydarzenie
        Ustaw Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

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

        Ustaw oStdToolbar = VBInstance.CommandBars („Standard”)
        Ustaw oStdToolbarItem = oStdToolbar.Controls.Add (Typ: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Ustaw kolory IDE"
        oStdToolbarItem.BeginGroup = True
        Ustaw Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    End If

    Wyjdź z Sub
ErrorHandler:
    Błąd MsgBox Opis
Napis końcowy

„************************************************* ****************************
„AddinInstance_OnDisconnection Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Ta metoda działa, gdy dodatek jest usuwany przez IDE i czyści dowolne
„referencje itp.
„************************************************* ****************************
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode jako AddInDesignerObjects.ext_DisconnectMode, custom () jako wariant)
    Po błędzie Wznów dalej

    „usuń pozycję paska poleceń
    mcbMenuCommandBar.Delete

    „zamknij dodatek
    Jeśli zostanie wyświetlony formularz FormDisplay
        SaveSetting App.Title, „Ustawienia”, „DisplayOnConnect”, „1”
        FormDisplayed = False
    Jeszcze
        SaveSetting App.Title, „Ustawienia”, „DisplayOnConnect”, „0”
    End If

    Zwolnij mfrmAddIn
    Ustaw mfrmAddIn = Nic

    Ustaw MenuHandler = Nic
    Ustaw MenuHandler2 = Nic
Napis końcowy

„************************************************* ****************************
„MenuHandler_Click Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Ta metoda wykonuje zadania potrzebne po kliknięciu elementu menu.
„************************************************* ****************************
Private Sub MenuHandler_Click (ByVal CommandBarControl As Object, obsługiwane jako Boolean, CancelDefault As Boolean)
    RunScript
Napis końcowy

„************************************************* ****************************
„MenuHandler2_Click Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Ta metoda wykonuje zadania wymagane po kliknięciu przycisku paska narzędzi.
„************************************************* ****************************
Private Sub MenuHandler2_Click (ByVal CommandBarControl As Object, obsługiwane jako Boolean, CancelDefault As Boolean)
    RunScript
Napis końcowy

„************************************************* ****************************
„AddToAddInCommandBar Sub
„------------------------------------------------- ----------------------------
„OPIS:
„Dodaje określony element do listy menu.
„************************************************* ****************************
Funkcja AddToAddInCommandBar (sCaption As String) As Office.CommandBarControl
    Dim cbMenuCommandBar As Object.CommandBarControl 'obiekt paska poleceń
    Dim cbMenu As Object

    Po błędzie Wznów dalej

    zobacz, czy możemy znaleźć menu Dodatki
    Ustaw cbMenu = VBInstance.CommandBars („Dodatki”)
    Jeśli cbMenu jest niczym, to
        „niedostępne, więc ponosimy porażkę
        Wyjdź z funkcji
    End If

    On Error GoTo ErrorHandler

    'dodaj go do paska poleceń
    Ustaw cbMenuCommandBar = cbMenu.Controls.Add (1)
    „ustaw podpis
    cbMenuCommandBar.Caption = sCaption

    Ustaw AddToAddInCommandBar = cbMenuCommandBar

    Wyjdź z funkcji
ErrorHandler:
    „Wyjdź z wdziękiem
Funkcja zakończenia

Ten kod pozwala aplikacji na odczyt żądanych kolorów z pliku, który znajduje się w tym samym katalogu co .dll (o nazwie VB6CodeColours.dat). Ten plik zawiera następujące elementy (będą się różnić w zależności od kolorów, które zamienisz w VB6.EXE, więc proste kopiowanie i wklejanie prawdopodobnie nie będzie działać).

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

Wygląda bełkotliwie, ale wyjaśnię. Ma format „Kolor kodu”, „Pierwszy plan”, „Tło”, Wskaźnik ”, więc górny wiersz ustawi„ Normalny tekst ”na 14. pozycję w zestawie dla pierwszego planu, 12. na tło i 1. na wskaźnik .

Dlaczego powiedziałem, że jest to dość prymitywne rozwiązanie: * Używa SendKeys. Jestem pewien, że nie jest potrzebne żadne dodatkowe wyjaśnienie :) * Użytkownik musi kliknąć opcję menu / paska narzędzi, aby zadziałało. * Kod nie jest najlepiej ustrukturyzowany (moim zdaniem), ale opierał się na ilości czasu, jaki mogłem w tym czasie poświęcić. Staram się go poprawić w przyszłości, ale w obecnym stanie działa dla mnie dobrze (więc prawdopodobnie go zostawię!)

Być może na podstawie ktoś może dalej to rozwinąć.

jonifen
źródło
2

Oto sztuczka, jak zachować stały wybór kolorów. Trochę więcej edycji szesnastkowej. Jeśli dokonałeś wymiany sugerowanej przez Bonda , powinieneś mieć pod ręką: wartości RGBA dla podstawowych (klasycznych) 16 kolorów indeksowanych od 0 do 15 oraz wartości RGBA dla kolorów niestandardowych indeksowanych w ten sam sposób. Teraz wyszukaj w VBEx.DLL sekwencję bajtów zbudowaną z „klasycznych” wartości RGBA uporządkowanych w następującej sekwencji indeksów: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (tj. Biały, szary, ciemnoszary, czarny, czerwony, ciemnoczerwony itp.). Wzorzec nieprzypadkowy, pochodzi od wartości przechowywanych w rejestrze, patrz post Tex Hex. Szesnastkowy ciąg wyszukiwania powinien wyglądać jak „FFFFFF00C0C0C0008080800000000000FF000000 ...” itd. Łącznie 64 bajty. Zamień znalezioną sekwencję bajtów na wartości RGBA kolorów „niestandardowych” uporządkowanych w ten sam sposób, np. 15, 7, 8 itd. Teraz wszystkie kolory wybrane w VS UI zostaną zapisane w rejestrze i zastosowane po ponownym uruchomieniu aplikacji. Cóż, wszystkie oprócz kolorów „wskaźnikowych”. Te zawsze resetują się do wartości domyślnych. Uwagi:

  1. W VBE7.DLL (MSO2010) znalazłem tylko jedną sekwencję bajtów uporządkowanych w taki sposób z przesunięciem 0x15A98C.
  2. Jak wspomniano w poście Bonda, istnieje kilka sekwencji bajtów do pierwszej zamiany (podstawowe wartości RGBA uporządkowane prosto od 0 do 15). Zmieniłem tylko jedną, najbliższą odsunięciu od poprzedniej nuty (znalezionej pod 0x15A5AC).
  3. Wszystko powyżej robisz na własne ryzyko :) I nie zapomnij wykonać kopii zapasowej.

Dzięki Tex Hex i Bond za wstępne badania.

UPD: Przetestowano za pomocą MSO2007 (VBE6.DLL) i MSO2013 (VBE7.DLL). Pracuj jak urok.

dias
źródło
2

Rozwiązanie Bonda (edycja tabeli kolorów w VB6.exe) działa idealnie do modyfikowania tabeli kolorów w IDE VB6. Stwierdziłem jednak, że po wybraniu zmodyfikowanego koloru i zamknięciu VB6, VB6 nie jest w stanie poprawnie zapisać zmodyfikowanego koloru w rejestrze.

Zwykle VB6 zapisuje indeks w 16-wartościowej tabeli kolorów dla każdego elementu tekstowego, którego kolor można zmodyfikować.

Wskaźniki kolorów są zapisywane w rejestrze tutaj:

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

Na przykład wartość CodeForeColors będzie wyglądać mniej więcej tak:

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

Wartości od 1 do 16 reprezentują kolor w tabeli kolorów, a 0 oznacza „Auto”.

Jednak po wybraniu zmodyfikowanego koloru VB6 zapisze w rejestrze liczbę spoza zakresu indeksu, a wartość CodeForeColors będzie wyglądać mniej więcej tak:

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

Przy następnym uruchomieniu VB6 nie będzie w stanie ustawić poprawnego koloru dla elementu, który został ustawiony na zmodyfikowany kolor.

Wciąż próbuję znaleźć rozwiązanie, ale chciałem opublikować to, co do tej pory znalazłem.

ravanbak
źródło