Як можна використовувати спеціальні кольори в редакторі Microsoft VBA?


33

Я працюю над декількома проектами для роботи з використанням Excel та VBA, тому мені не залишається іншого вибору, як використовувати редактор Microsoft Visual Basic. Я зазвичай не заперечую, але не можу зрозуміти, як встановити спеціальний колір для редактора (я можу вибрати лише палітру за замовчуванням).

Щоб змінити колір на даний момент, я переходжу до Tools -> Options -> Editor Format... Однак ваш вибір обмежений лише 16-ти кольорами за замовчуванням (а базовим) - коли я кажу базовий, я маю на увазі базовий , як-от рожевий, синій, чорний, білий і т.д. ..

Хтось знає, як вказати спеціальний колір, або, принаймні, змінити деякі кольори, які відображаються у палітрі за замовчуванням?


Я думаю, що Microsoft намагається сказати нам, що вони не хочуть, щоб люди програмували в VBA. А може, Білл Гейтс важко ставиться до виробників знеболюючих засобів.
Холен

Відповіді:


19

VBA зчитує параметри кольорів із цих ключів реєстру:

HKEY_CURRENT_USER \ Програмне забезпечення \ Microsoft \ VBA \ 6.0 \ Загальні \ CodeForeColors HKEY_CURRENT_USER \ Програмне забезпечення \ Майкрософт \ VBA \ 6.0 \ Загальні \ CodeBackColors

Кожна з цих клавіш містить список значень (розділених пробілом) для кожного запису всередині Інструменти -> Параметри -> Формат редактора. Наприклад, перше значення у CodeBackColors - це колір тла, а перше значення у CodeForeColors - це колір переднього плану для звичайного тексту. Значення - це внутрішній ідентифікатор кольору, 0 означає AUTO-забарвлення, 11 показує блакитний, 5 червоний тощо.

Щоб спробувати: Закрийте Excel, змініть перше значення CodeBackColors на 5 та перезапустіть Excel. Фон редактора коду тепер стане червоним.

Проблема полягає в тому, що редактор VBA підтримує лише ці внутрішні значення, і найвища кількість, яку він розуміє, становить 16. Будь-яке інше значення не буде прийнято, і воно за замовчуванням повернеться до AUTO.

Я спробував кілька варіантів введення різних значень (наприклад, 128255128, 16777215, #aaffee, 255 або "170,255,238"), і жоден з них не працював.

Тому я думаю, що технічно неможливо призначити інші кольори.


1
Дякую за відповідь. IIRC, ви не можете зняти щедрість, але якщо ви буквально не можете цього зробити, то я присуджую це вам за найбільш правильну відповідь. Я хочу почекати ще трохи, щоб побачити, чи ще розміщено відповіді, але дякую за вашу відповідь, +1.
Прорив

1
Мушу визнати, що це звучить ще краще :)
Tex Hex

"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) від FMS має інструмент "Менеджер кольорових схем VBE для легкого перегляду та встановлення кольорів для вашого редактора". Якщо ви завантажите посібник користувача (PDF), він показує скріншоти, які, полегшуючи встановлення кольорів, все ще обмежені 16 кольоровою палітрою. Думаю, якби був прямий спосіб використання користувальницьких кольорів, вони включили б його в цей інструмент. Схоже, текс Hex правильний.
Брайан

Оскільки зараз було показано з наведеними нижче відповідями, що це можливо, цю відповідь слід змінити. Можна надійно змінити кольори в редакторі VBA за допомогою редактора HEX.
Стівен Мартін

16

Я створив додаток на основі інформації, знайденої тут: https://github.com/dimitropoulos/VBECustomColors

Це в основному створює резервну копію файлу VBE6 / VBE7 .dll і дозволяє використовувати спеціальні кольори без необхідності використання шестигранного редактора.

сс

Завантажити його можна тут: https://github.com/gallaux/VBEThemeColorEditor

Насолоджуйтесь

Редагувати: вихідний код тепер доступний!


Нічого здорово, дякую за те, що поділився @gallaux - я обов'язково перевірю це. Плануєте випустити вихідний код з цікавості?
Прорив

Так, я скоро, мені просто потрібно це трохи прибрати;)
gallaux

Дякую, Gallaux, я мав намір зробити те саме, але, як тільки я отримав свого редактора vba на колірну схему, яка мені сподобалася, я втратив цю мотивацію, тому що я вже не був так "16-ти кольоровим напруженням очей".
Стівен Мартін

1
Вибачте, як застосувати це, мені потрібна допомога
Педро Мігель Піміента Моралес

1
@YouCrackedMeUp вам потрібно оновити ключ реєстру за допомогою regedit (на основі github.com/dimitropoulos/VBECustomColors ): [1] Перейдіть до regedit до HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] Зміна CodeBackColorsдо: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] Зміна CodeForeColorsдо: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] Зміна FontFaceдо: Consolas.
Tigregalis

7

TeX HeX не ввімкнено. Однак можливо змінити 16 вбудованих кольорів своїми руками. Це просто вимагає трохи шестигранної редагування. Ось покроковий посібник. (Примітка. Це для VB6 SP6, версія файлу 6.0.97.82).

  1. Зробіть резервну копію файлу VB6.EXE у папці програми VB98. (Необов’язково, але рекомендується).

  2. Запустіть улюблений шестигранний редактор (крикніть на HxD) та відкрийте VB6.EXE.

  3. Перейти до адреси 0xE22F4. Це початок таблиці кольорів.

Ви повинні побачити чотири нулі. Це являє собою чорний колір у форматі RRGGBBAA (альфа не підтримується, тому це насправді просто RRGGBB00 формат). Наступні чотири байти задають наступний колір і так далі, поки ви не перейдете до FFFFFF00 (білий), що закінчується зміщенням 0xE2333.

  1. Відредагуйте будь-яке з цих чотирьохбайтових значень на свій вибір. Просто використовуйте відповідні шістнадцяткові значення у форматі RGB з наступним нульовим байтом. Наприклад, RGB (64, 128, 192) буде 40 80 C0 00.

  2. Збережіть свої зміни в EXE і запустіть VB6. Ви повинні побачити ваш новий колір (и) в слотах, раніше зайнятих вбудованими кольорами VB.


1
Гм, я шукав за допомогою інструменту все в системі з Office 2003, і ​​в ньому не знайдено жодного файлу з назвою VB6.exe або папки VB98. Це відповідь лише для Office 2007, як це має ОП? Однак версія 6.0.97.82 старша за мою з Office 2003.
nixda

1
@nixda Нічого в моїй системі - я думаю, що Бонд має на увазі додаток VB6 у своїй системі, а не VBA, інтегровану в Excel. Я перегляну виконавчий файл Excel та деякі DLL-файли VBA, і побачу, чи можу я знайти будь-які таблиці кольорів.
Прорив

1
У мене на комп'ютері Office 2010, тому у мене є VBE7.DLL, а не VBE6.DLL, але це повинен бути той самий процес. Кольори однакові. Якщо ви подивитеся на кольори у порядку, який вони відображаються, вони повинні бути: Чорний = 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 Drk Grey = 80 80 80 00 ... Я додав шістнадцяткові кольорові коди поруч із кожним. Тож просто відкрийте VBE6.DLL у шестигранному редакторі та шукайте наступну шістнадцяткову рядок:
Бонд

1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Це може траплятися кілька разів, але я виявив, що перша таблиця кольорів - це все, що потрібно змінити. Подивіться, чи це працює для вас.
Бонд

1
Дивовижна відповідь, Бонд. Для майбутніх читачів ключовим, що мені потрібно було змінити, було друге (Office 2013, Windows 8.1), розташоване на `12 50B4 'за допомогою Hex Edit (байт № 1,200,308)
Енді Терра

5

Як багато хто зазначав, рішення Бонда (шістнадцяткове редагування таблиці кольорів у VB6.exe) буде працювати, але вам потрібно буде зайти та скинути кольори у діалоговому вікні параметрів кожного разу при запуску VB6. Я створив сценарій AutoIt, який зробить всю роботу за вас, просто відредагуйте його за необхідності там, де виконуються всі виклики до 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

Я просто зберігаю його на своєму робочому столі, і тепер, коли мені потрібно відкрити vb6, я просто двічі клацну по ньому і так само, як забарвлення синтаксису знаходиться під моїм контролем.

Редагувати 1: трохи оптимізувавши сценарій, щоб зробити його швидшим. Я думаю про створення програми, яка автоматично відредагує VB6.EXE для полегшення вибору кольору. Цікаво, чи є спосіб вирвати скрипт AutoIt, створивши плагін для VS?

Редагування 2: Створена утиліта, яка дозволяє редагувати кольори в exe без використання шестигранного редактора: VbClassicColorEditor . Це посилання переходить до загальнодоступного сховища на бітбукеті.


Дякую за сценарій та внесок! Будь-який шанс отримати оновлене посилання на VbClassicColorEditor? У тому, що ви розмістили, є 404d ...
Енді Терра

3

Я просто хотів опублікувати резюме попередніх відповідей, оскільки не зовсім зрозуміло, що потрібно зробити, щоб змінити кольори в редакторі Excel VBA

У наведеному нижче прикладі я додаю кольорову схему для Solarized, і я припускаю використання Office 2010

Крок 0: Зробіть резервну копію VBE7.dll, перш ніж змінювати її - вас попередили !!!

Крок 1. У шестигранному редакторі відкрийте VBE7.dll, розташований @

"C:\Program Files\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" за 64 біт

або

"C:\Program Files( x86)\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" за 32 біт

Крок 2: Знайдіть 1-й випадок

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`

і замінити на

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

Крок 3: Знайдіть другий показник цього (переконайтеся, що ви шукаєте вгорі файлу)

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

і замінити на

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

Крок 4: Збережіть файл dll, а потім відкрийте Excel> Редактор VBA> Інструменти> Параметри> Формат редактора та встановіть кольори коду.

Зміна обох рядків несекретна, оскільки дозволяє кольорам правильно зберігати при відключенні і дозволяє редактору кольорів відкриватись без краху відмінності.

Дякуємо всім попереднім відповідачам за те, що вклали час, щоб розібратися в цьому!


3

Я створив програму, яка автоматизувала все це, витрачала на це занадто довго, весело створювала підбір кольорів. Зроблено в VB6, бо чому б ні. Складена програма та вихідний код доступні тут . Протестований лише на моїх версіях DLL та VB6, будь ласка, робіть резервні копії, перш ніж щось змінювати - місця фіксуються в коді.



Це дуже старе питання, але я хотів би зважити на повноту

Для кольорів VS2012 у форматі VBA або VB6 IDE: відкрийте VBE6.DLL / VBE7.DLL або VBA6.DLL у

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

зі своїм шестигранним редактором

Замініть перше виникнення

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

З

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

Потім поверніться до вершини і замініть другий вигляд

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

з

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

Потім змініть наступне в реєстрі

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

Якщо ви змінюєте для VBA, ви закінчили, для VB6 тепер відкрийте "VB6.exe" у своєму шестигранному редакторі та змініть перше виникнення

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

з

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

Це виправляє колір, що відображається в інтерфейсі VB6, так що, якщо ви хочете внести інші зміни в кольори, ви можете.

Дякую за всі інші відповіді, я сам цього не придумав, просто подумав, що було б корисно мати всю інформацію, необхідну в одному дописі (ніде я не бачив змінення VB6.exe та VBA6.dll разом). Використовуючи цей метод, ви повинні мати можливість вільно вибирати кольори.

Я також упорядкував кольори з деяких інших відповідей, щоб не змінювати vbRed, vbBlue, vbWhite тощо, тому ви все одно отримаєте бажаний результат у коді. Це не було повністю перевірено, так як завжди змінюйте програми на свій страх і ризик.

Було б непогано скласти невелику програму, яка зробить це за вас (як це робив gallaux), у мене виникли проблеми із записом до реєстру та VB6 IDE, використовуючи цю програму, і вийшло б якесь вікно попереднього перегляду було б непогано.

Я знайшов обмеження: це не змінює колір піктограм індикатора, ви повинні зробити це самостійно.


2

Беручи приманку з відповіді денсслі (де він запитує, чи хтось міг зробити надбудову), я зробив надбудову для VB6. Це трохи грубо (і я поясню, чому незабаром), але це робить свою роботу.

Я створив новий проект надбудови у VB6, який дав мені форму "frmAddin" за замовчуванням (яку я не використовую) та дизайнер "Connect". Я сам додав клас кольорів, який містить наступне:

Варіант явний

Розмір m_iForeColour як цілий
Розмір m_iBackColour як цілий
Розмір m_iIndicatorColour як цілий

Публічна власність нехай ForeColour (ByVal iID As Integer)
    m_iForeColour = iID
Кінцева власність
Громадська власність Отримайте ForeColour () як цілісну
    ForeColour = m_iForeColour
Кінцева власність

Публічна власність відпустить колорит (ByVal iID As Integer)
    m_iBackColour = iID
Кінцева власність
Громадська власність Отримайте BackColour () як цілісність
    BackColour = m_iBackColour
Кінцева власність

Публічна власність нехай індикаторне забарвлення (ByVal iID As Integer)
    m_iIndicatorColour = iID
Кінцева власність
Громадська власність Отримайте показник кольору () як цілий
    IndicatorColour = m_iIndicatorColour
Кінцева власність

А потім я змінив код у "Підключенні" Дизайнера таким чином:

Варіант явний

Публічна форма відображається як булева
Публічний VBInstance як VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
Dim mfrmAddIn як новий frmAddIn
Public WithEvents MenuHandler як обробник подій командного рядка CommandBarEvents

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 як CommandBarEvents

Код затемнення кольори () як колір

'*************************************************** ****************************
'RunScript Sub
'------------------------------------------------- ----------------------------
ОПИС:
'Виконує код, який встановлює необхідні кольори для вікна коду в
'активний IDE.
"*** ПРОЕКТ ПОВИНЕН ЗАВАНТАЖИТИ ДО ЦЕГО, ЩО БУДЕ ДІЙСНЕ РОБОТИ ***
'*************************************************** ****************************
Sub RunScript ()
    ReadColoursFile

    "Виберіть Інструменти> Параметри
    SendKeys "% to", 5
    "Перейдіть на вкладки, виберіть" Параметри "
    SendKeys "+ {TAB}"
    SendKeys "{RIGHT}"

    "Виберіть список
    SendKeys "{TAB}"

    Тьмяний колірНалаштування як колір
    Дім iColour як цілий

    Для iColour = 0 до 9
        SetColours iColour, codeColour (iColour)
    Наступний iColour

    SendKeys "~"
Кінець Під

'*************************************************** ****************************
'Читайте кольориFile Sub
'------------------------------------------------- ----------------------------
ОПИС:
'Читає файл кольору з диска і заповнює масив codeColours, який
'використовується методами SetColour * для вибору правильних кольорів з
'екран опцій.
'*************************************************** ****************************
Sub ReadColoursFile ()
    Тьмяний колірLine As String
    Темний колірArray () As String
    Тьмяний колірНалаштування як колір
    Розмір oFSO як FileSystemObject

    Встановити oFSO = Новий FileSystemObject

    Якщо немає oFSO.FileExists (App.Path & "\ VB6CodeColours.dat"), то
        MsgBox "VB6CodeColours.dat не знайдено в" & App.Path, vbOKOnly, "Файл налаштувань VB6CodeColours не знайдено!"
        Вихід із суб
    Кінець Якщо

    Встановити oFSO = Нічого

    Відкрийте App.Path & "\ VB6CodeColours.dat" для введення як №1
    Код ReDimКольори (9) Як колір

    Хоча не EOF (1)
        Лінійний ввід №1, colourLine
        colourArray = Спліт (colourLine, ",")

        Якщо IsNumeric (colourArray (0)), то
            Якщо codeColours (colourArray (0)) - то нічого
                Встановити colourSetting = Новий колір

                Якщо IsNumeric (colourArray (1)), то
                    colourSetting.ForeColour = CInt (colourArray (1))
                Кінець Якщо

                Якщо IsNumeric (colourArray (2)), то
                    colorurSetting.BackColour = CInt (colourArray (2))
                Кінець Якщо

                Якщо IsNumeric (colourArray (3)), то
                    colorurSetting.IndicatorColour = CInt (colourArray (3))
                Кінець Якщо

                Встановити код Colours (colourArray (0)) = colorSetting
            Кінець Якщо
        Кінець Якщо
    Венд

    Закрити №1

    Встановити colourSetting = Нічого
Кінець Під

'*************************************************** ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
ОПИС:
'Вибирає кольоровий елемент зі списку, а потім повторює селектор кольорів
'елементи управління, пов'язані з цим елементом, і встановлює їх відповідно до значень
'встановлено у файлі VB6CodeColours.dat.
'*************************************************** ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colorSetting As Colour)
    Дім iKey як цілий

    SendKeys "{HOME}"

    Для iKey = 1 Для iColour
        SendKeys "{DOWN}"
    Далі iKey

    SetColourSelector colorSetting.ForeColour
    SetColourSelector colorSetting.BackColour
    SetColourSelector colorSetting.IndicatorColour

    SendKeys "+ {TAB}"
    SendKeys "+ {TAB}"
    SendKeys "+ {TAB}"
Кінець Під

'*************************************************** ****************************
'SubColourSelector Sub
'------------------------------------------------- ----------------------------
ОПИС:
'Встановлює колір у комбінації селекторів. Припускає, що зосереджена увага на
', що передує контролю перед запуском коду (вкладки першого рядка до
'взяв на себе контроль).
'*************************************************** ****************************
Sub SetColourSelector (ByVal iColour As Integer)
    Дім iKey як цілий

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

    Для iKey = 1 Для iColour
        SendKeys "{DOWN}"
    Далі iKey
Кінець Під

'*************************************************** ****************************
'Підрозділ AddinInstance_OnConnection
'------------------------------------------------- ----------------------------
ОПИС:
'Цей метод працює, коли додаток завантажується IDE
'*************************************************** ****************************
Private Sub AddinInstance_OnConnection (Додаток ByVal як об'єкт, ByVal ConnectMode як AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst як об’єкт, звичайний () як варіант)
    On Error GoTo ErrorHandler

    'збережіть екземпляр vb
    Встановити VBInstance = Додаток

    Якщо ConnectMode ext_cm_External тоді
        Встановити mcbMenuCommandBar = AddToAddInCommandBar ("Розфарбування коду VB6")
        'потопити подію
        Встановити Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

        Дім oStdToolbar як Office.CommandBar
        Dim oStdToolbarItem As Office.CommandBarControl

        Встановити oStdToolbar = VBInstance.CommandBars ("Стандартний")
        Встановити oStdToolbarItem = oStdToolbar.Controls.Add (Тип: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Встановити кольори IDE"
        oStdToolbarItem.BeginGroup = Істинно
        Встановити Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    Кінець Якщо

    Вихід із суб
ErrorHandler:
    Опис помилки MsgBox
Кінець Під

'*************************************************** ****************************
'Підрозділ AddinInstance_OnDisconnection
'------------------------------------------------- ----------------------------
ОПИС:
'Цей метод працює, коли IDE видаляє IDE і очищує будь-який
'посилання тощо
'*************************************************** ****************************
Приватний Sub AddinInstance_OnDisconnection (ByVal RemoveMode як AddInDesignerObjects.ext_DisconnectMode, custom () як варіант)
    Про помилку Відновіть далі

    'видалити запис командного рядка
    mcbMenuCommandBar.Delete

    "вимкнути надбудову
    Якщо FormDisplayed then
        SaveSetting App.Title, "Налаштування", "DisplayOnConnect", "1"
        FormDisplayed = Неправдивий
    Інше
        SaveSetting App.Title, "Налаштування", "DisplayOnConnect", "0"
    Кінець Якщо

    Вивантажте mfrmAddIn
    Встановити mfrmAddIn = Нічого

    Встановіть MenuHandler = Нічого
    Встановіть MenuHandler2 = Нічого
Кінець Під

'*************************************************** ****************************
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
ОПИС:
"Цей метод виконує завдання, необхідні при натисканні на пункт меню.
'*************************************************** ****************************
Приватне підменюHandler_Click (ByVal CommandBarControl як об’єкт, обробляється як булевий, CancelDefault As Boolean)
    RunScript
Кінець Під

'*************************************************** ****************************
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
ОПИС:
"Цей метод виконує завдання, необхідні при натисканні кнопки на панелі інструментів.
'*************************************************** ****************************
Приватне підменюHandler2_Click (ByVal CommandBarControl як об’єкт, обробляється як булевий, CancelDefault As Boolean)
    RunScript
Кінець Під

'*************************************************** ****************************
'SubToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
ОПИС:
'Додає вказаний пункт до списку меню.
'*************************************************** ****************************
Функція AddToAddInCommandBar (sCaption As String) як Office.CommandBarControl
    Дім cbMenuCommandBar As Office.CommandBarControl ', командний рядок
    Dim cbMenu як об’єкт

    Про помилку Відновіть далі

    'подивіться, чи зможемо ми знайти меню надбудови
    Встановити cbMenu = VBInstance.CommandBars ("надбудови")
    Якщо cbMenu - то нічого
        'недоступно, тому ми не вдається
        Вихід з функції
    Кінець Якщо

    On Error GoTo ErrorHandler

    'додайте його до панелі команд
    Встановити cbMenuCommandBar = cbMenu.Controls.Add (1)
    'встановити підпис
    cbMenuCommandBar.Caption = sCaption

    Установіть AddToAddInCommandBar = cbMenuCommandBar

    Вихід з функції
ErrorHandler:
    'Виходьте витончено
Кінцева функція

Цей код дозволяє програмі зчитувати потрібні кольори з файлу, який знаходиться у тому самому каталозі, що і .dll (називається VB6CodeColours.dat). Цей файл містить наступне (і залежатиме від того, які кольори ви заміняєте у VB6.EXE, тому пряма копія та вставка, ймовірно, не працюватимуть.

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

Виглядає химерно, але я поясню. Він має формати "Колір коду", "Передній план", "Фон", індикатор ", тому в верхньому рядку буде встановлено" Звичайний текст "14-му пункту у комбінації для переднього плану, 12-му для фонового та 1-му для індикатора .

Чому я сказав, що це досить грубе рішення: * Він використовує SendKeys. Ніяких додаткових пояснень там не потрібно, я впевнений :) * Користувач повинен натиснути параметр меню / панелі інструментів, щоб він набрав чинності. * Код не найкраще структурований (на мій погляд), але базувався на кількості часу, який я можу присвятити йому на той час. Я маю на меті вдосконалити це в майбутньому, але він працює добре для мене в нинішньому стані (тому я, мабуть, залишу його!)

Можливо, з основою хтось може розширити її далі.


2

Ось хитрість, як зберегти свій вибір кольору постійним. Трохи більше шістнадцяткового редагування. Якщо ви зробили заміну, запропоновану Бондом, вам слід мати під рукою такі значення: RGBA значення для основних (класичних) 16 кольорів, індексованих від 0 до 15, і значення RGBA для ваших спеціальних кольорів, індексованих однаково. Тепер шукайте VBEx.DLL для послідовності байтів, побудованої з "класичних" значень RGBA, упорядкованих у такій послідовності індексів: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (тобто білий, сірий, темно-сірий, чорний, червоний, темно-червоний тощо). Шаблон не випадковий, він отриманий із значень, що зберігаються в реєстрі, див . Публікацію Tex Hex. Шістнадцятковий рядок для пошуку повинен виглядати як "FFFFFF00C0C0C0008080800000000000FF000000 ..." і т.д. 64 байти загалом. Замініть знайдену послідовність байтів на значення RGBA "користувацьких" кольорів, упорядкованих однаково, наприклад, 15, 7, 8 і т.д. Ну все, але "індикаторні" кольори. Вони завжди повертаються до значень за замовчуванням. Примітки:

  1. У VBE7.DLL (MSO2010) я знайшов лише одну послідовність байт, упорядкованих таким чином, при зміщенні 0x15A98C.
  2. Як згадується у публікації Бонда, є кілька байтових послідовностей для першої заміни (основні значення RGBA упорядковані прямо від 0 до 15). Я змінив лише одну, найближчу до зміщення з попередньої примітки (знайдено в 0x15A5AC).
  3. Все вище ви робите на свій страх і ризик :) І не забудьте зробити резервну копію.

Завдяки Tex Hex і Bond за початкові дослідження.

UPD: Тестовано з MSO2007 (VBE6.DLL) та MSO2013 (VBE7.DLL). Працюй як шарм.


2

Рішення Bond (редагування таблиці кольорів у VB6.exe) прекрасно працює для зміни таблиці кольорів у IDE VB6. Однак я виявив, що коли вибрано модифікований колір, а VB6 вимкнено, VB6 не зможе належним чином зберегти модифікований колір у реєстрі.

Зазвичай VB6 записує індекс у таблицю кольорів 16 значень для кожного текстового елемента, який може змінити його колір.

Показники кольорів записуються до реєстру тут:

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

Наприклад, значення CodeForeColors буде виглядати приблизно так:

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

Значення від 1 до 16 представляють колір у таблиці кольорів, а 0 означає "Авто".

Однак, коли обраний модифікований колір, VB6 запише в реєстр число поза діапазоном індексу, і значення CodeForeColors буде виглядати приблизно так:

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

При наступному запуску VB6 він не зможе встановити правильний колір для елемента, який був встановлений на модифікований колір.

Я все ще намагаюся знайти рішення, але хотів опублікувати те, що знайшов досі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.