Как я могу использовать пользовательские цвета в редакторе Microsoft VBA?

33

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

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

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

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

Ответы:

19

VBA считывает настройки цветов из этих разделов реестра:

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

Каждый из этих ключей содержит список значений (разделенных пробелом) для каждой записи в Инструменты -> Параметры -> Формат редактора. Например, первое значение внутри CodeBackColors - это цвет фона, а первое значение внутри CodeForeColors - это цвет переднего плана для обычного текста. Значения являются внутренним идентификатором цвета, 0 означает автоцвет, 11 показывает голубой, 5 красный и т. Д.

Чтобы попробовать: закройте Excel, измените первое значение CodeBackColors на 5 и перезапустите Excel. Фон редактора кода теперь будет красным.

Проблема заключается в том, что VBA Editor поддерживает только эти внутренние значения, и наибольшее значение, которое он понимает, равно 16. Любое другое значение не будет принято, и по умолчанию оно вернется к AUTO.

Я пробовал несколько вариантов ввода разных значений (например, 128255128, 16777215, #aaffee, 255 или "170,255,238"), и ни одно из них не сработало.

Поэтому я думаю, что технически невозможно назначить другие цвета.

Tex Hex
источник
1
Спасибо за ответ. IIRC, вы не можете отозвать награду, но если вы в буквальном смысле не можете сделать это, то я передам ее вам за самый правильный ответ. Я хочу подождать еще немного, чтобы узнать, будут ли еще опубликованы ответы, но спасибо за ваш ответ +1.
Прорыв
1
Я должен признать, что это звучит даже лучше :)
Tex Hex
«Total Visual CodeTools» ( fmsinc.com/vb6/CodingTools.html ) от FMS имеет инструмент «Диспетчер цветовой схемы VBE, чтобы легко видеть и устанавливать цвета для вашего редактора». Если вы загружаете руководство пользователя (в формате PDF), оно показывает скриншоты, которые при упрощении настройки цветов по-прежнему ограничены 16-цветовой палитрой. Подумал бы, если бы существовал прямой способ использования пользовательских цветов, они бы включили его в этот инструмент. Похоже, Tex 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.
Тигрегалис
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, как у OP? Однако версия 6.0.97.82 старше моей с Office 2003.
nixda
1
@nixda В моей системе тоже ничего нет - я думаю, что Бонд имеет в виду приложение VB6 в своей системе, а не VBA, интегрированное в Excel. Я собираюсь просмотреть исполняемый файл Excel и некоторые из библиотек 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 Lgt Grey = C0 C0 C0 00 Drk Grey = 80 80 80 00 ... Я добавил шестнадцатеричные цветовые коды рядом с каждым. Так что просто откройте VBE6.DLL в шестнадцатеричном редакторе и найдите следующую шестнадцатеричную строку:
Bond
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 . Эта ссылка идет в публичный репозиторий на bitbucket.

Дилан Ниссли
источник
Спасибо за сценарий и вклад! Есть ли шанс получить обновленную ссылку на 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: Найдите 2-й случай этого (убедитесь, что вы ищете в верхней части файла)

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 Editor> Инструменты> Параметры> Формат редактора и установите цвета кода.

Изменение обеих строк не обязательно, поскольку позволяет корректно сохранять цвета при выключении и позволяет редактору цветов открываться без сбоев в Excel.

Спасибо всем предыдущим авторам за то, что нашли время разобраться в этом!

Стивен Мартин
источник
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» в редакторе Hex и измените первое появление

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), у меня были проблемы с записью в реестр и в IDE VB6 с использованием этой программы, и было бы неплохо, если бы окно предварительного просмотра было бы неплохо.

Ограничения, которые я нашел: это не меняет цвет значков индикатора, вы должны сделать это самостоятельно.

Сэм
источник
2

Взяв приманку из ответа Днисли (где он спрашивает, может ли кто-нибудь сделать надстройку), я сделал надстройку для VB6. Это немного грубо (и я объясню почему в ближайшее время), но это делает работу.

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

Вариант Явный

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

Открытое свойство Let ForeColour (ByVal iID As Integer)
    m_iForeColour = iID
Конечная недвижимость
Открытое свойство Get ForeColour () как целое число
    ForeColour = m_iForeColour
Конечная недвижимость

Открытое свойство Let BackColour (ByVal iID As Integer)
    m_iBackColour = iID
Конечная недвижимость
Открытое свойство Get BackColour () As Integer
    BackColour = m_iBackColour
Конечная недвижимость

Открытое свойство Let IndicatorColour (ByVal iID As Integer)
    m_iIndicatorColour = iID
Конечная недвижимость
Открытое свойство Get IndicatorColour () As Integer
    IndicatorColour = m_iIndicatorColour
Конечная недвижимость

А затем я изменил код в конструкторе «Соединение» следующим образом:

Вариант Явный

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

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 As CommandBarEvents

Dim codeColours () как цвет

«************************************************* ****************************
RunScript Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
'Запускает код, который устанавливает требуемые цвета для окна кода в
Активная IDE.
*** ПРОЕКТ ДОЛЖЕН БЫТЬ ЗАГРУЖЕН, ДО ЭТОГО БУДЕТ ДЕЙСТВИТЕЛЬНО РАБОТАТЬ
«************************************************* ****************************
Sub RunScript ()
    ReadColoursFile

    'Выберите Инструменты> Параметры
    SendKeys "% to", 5
    «Перейти на вкладки, выберите« Параметры »
    SendKeys "+ {TAB}"
    SendKeys "{RIGHT}"

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

    Dim colourSetting As Color
    Dim iColour As Integer

    Для iColour = 0 до 9
        SetColours iColour, codeColours (iColour)
    Next iColour

    SendKeys "~"
End Sub

«************************************************* ****************************
'ReadColoursFile Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
'Считывает файл цвета с диска и заполняет массив codeColours, который
'используется методами SetColour * для выбора правильных цветов из
экран настроек.
«************************************************* ****************************
Sub ReadColoursFile ()
    Dim ColourLine As String
    Dim colourArray () As String
    Dim colourSetting As Color
    Dim oFSO As FileSystemObject

    Установить oFSO = Новый FileSystemObject

    Если не oFSO.FileExists (App.Path & "\ VB6CodeColours.dat"), то
        MsgBox "VB6CodeColours.dat не найден в" & App.Path, vbOKOnly, "Файл настроек VB6CodeColours не найден!"
        Exit Sub
    End If

    Установить oFSO = ничего

    Откройте App.Path & "\ VB6CodeColours.dat" для ввода в качестве # 1
    ReDim codeColours (9) как цвет

    Пока не EOF (1)
        Линейный вход № 1, colourLine
        colourArray = Split (colourLine, ",")

        Если IsNumeric (colourArray (0)), то
            Если codeColours (colourArray (0)) - это ничто, то
                Set colourSetting = New Color

                Если IsNumeric (colourArray (1)), то
                    colourSetting.ForeColour = CInt (colourArray (1))
                End If

                Если IsNumeric (colourArray (2)), то
                    colourSetting.BackColour = CInt (colourArray (2))
                End If

                Если IsNumeric (colourArray (3)), то
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                End If

                Set codeColours (colourArray (0)) = colourSetting
            End If
        End If
    венед

    Закрыть № 1

    Set colourSetting = Nothing
End Sub

«************************************************* ****************************
'SetColours Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
'Выбирает элемент цвета из списка, а затем повторяет селектор цвета
'управления, связанные с этим элементом и устанавливает их в соответствии со значениями
'установлено в файле VB6CodeColours.dat.
«************************************************* ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colourSetting As Color)
    Dim iKey As Integer

    SendKeys "{HOME}"

    Для iKey = 1 К iColour
        SendKeys "{DOWN}"
    Next iKey

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

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

«************************************************* ****************************
'SetColourSelector Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
'Устанавливает цвет в комбо селектора. Предполагается, что основное внимание уделяется
'предшествующий элемент управления перед выполнением кода (вкладки первой строки
'взял на себя контроль).
«************************************************* ****************************
Sub SetColourSelector (ByVal iColour As Integer)
    Dim iKey As Integer

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

    Для iKey = 1 К iColour
        SendKeys "{DOWN}"
    Next iKey
End Sub

«************************************************* ****************************
'AddinInstance_OnConnection Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
'Этот метод запускается, когда надстройка загружается в IDE
«************************************************* ****************************
Private Sub AddinInstance_OnConnection (приложение ByVal как объект, ByVal ConnectMode как объект AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst как объект, custom () как вариант)
    При ошибке Перейти к ErrorHandler

    'сохранить экземпляр VB
    Установить VBInstance = приложение

    Если ConnectMode ext_cm_External, то
        Установите mcbMenuCommandBar = AddToAddInCommandBar («Раскраска кода VB6»)
        потопить событие
        Установите Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

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

        Установите oStdToolbar = VBInstance.CommandBars ("Стандартный")
        Установите oStdToolbarItem = oStdToolbar.Controls.Add (Тип: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Установить цвета IDE"
        oStdToolbarItem.BeginGroup = True
        Установите Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    End If

    Exit Sub
ErrorHandler:
    MsgBox Err.Description
End Sub

«************************************************* ****************************
'AddinInstance_OnDisconnection Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
«Этот метод запускается, когда надстройка удаляется IDE и очищает все
ссылки и т. д.
«************************************************* ****************************
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom () Как вариант)
    При ошибке возобновить следующее

    'удалить запись командной строки
    mcbMenuCommandBar.Delete

    выключить надстройку
    Если FormDisplayed, то
        SaveSetting App.Title, «Настройки», «DisplayOnConnect», «1»
        FormDisplayed = False
    еще
        SaveSetting App.Title, «Настройки», «DisplayOnConnect», «0»
    End If

    Выгрузить mfrmAddIn
    Set mfrmAddIn = Nothing

    Установить MenuHandler = ничего
    Установить MenuHandler2 = ничего
End Sub

«************************************************* ****************************
MenuHandler_Click Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
«Этот метод выполняет задачи, необходимые при нажатии на пункт меню.
«************************************************* ****************************
Private Sub MenuHandler_Click (ByVal CommandBarControl As Object, обрабатывается как Boolean, CancelDefault As Boolean)
    RunScript
End Sub

«************************************************* ****************************
MenuHandler2_Click Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
«Этот метод выполняет задачи, необходимые при нажатии кнопки на панели инструментов.
«************************************************* ****************************
Private Sub MenuHandler2_Click (ByVal CommandBarControl As Object, обрабатывается как Boolean, CancelDefault As Boolean)
    RunScript
End Sub

«************************************************* ****************************
SubToAddInCommandBar Sub
«------------------------------------------------- ----------------------------
' ОПИСАНИЕ:
'Добавляет указанный элемент в список меню.
«************************************************* ****************************
Функция AddToAddInCommandBar (sCaption As String) в качестве Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl 'объект панели команд
    Dim cbMenu As Object

    При ошибке возобновить следующее

    посмотрим, сможем ли мы найти меню надстроек
    Установите cbMenu = VBInstance.CommandBars («Надстройки»)
    Если cbMenu - ничто, тогда
        'не доступно, поэтому мы терпим неудачу
        Функция выхода
    End If

    При ошибке Перейти к 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. Я уверен, что дальнейших объяснений здесь не требуется :) * Пользователь должен нажать на опцию меню / панели инструментов, чтобы она вступила в силу. * Код, на мой взгляд, не очень хорошо структурирован, но основан на количестве времени, которое я мог бы посвятить ему в то время. Я стремлюсь улучшить его в будущем, но он отлично работает для меня в текущем состоянии (поэтому я, вероятно, оставлю это!)

Возможно, с основой, кто-то может расширить это дальше.

jonifen
источник
2

Вот трюк, как сохранить постоянный выбор цвета. Немного больше шестнадцатеричного редактирования. Если вы сделали замену, предложенную Bond, у вас должно быть следующее: значения 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 и т. Д. Теперь все цвета, выбранные вами в VS UI, будут сохранены в реестре и применены после перезапуска приложения. Ну все, кроме «индикаторных» цветов. Они всегда сбрасываются на значения по умолчанию. Заметки:

  1. В VBE7.DLL (MSO2010) я нашел только одну последовательность байтов, упорядоченных таким образом со смещением 0x15A98C.
  2. Как упомянуто в сообщении Бонда, есть несколько байтовых последовательностей для первой замены (основные значения RGBA упорядочены от 0 до 15). Я изменил только один, самый близкий к смещению от предыдущей ноты (найден в 0x15A5AC).
  3. Все это вы делаете на свой страх и риск :) И не забудьте сделать резервную копию.

Спасибо Tex Hex и Bond за начальные исследования.

UPD: протестировано с MSO2007 (VBE6.DLL) и MSO2013 (VBE7.DLL). Работай как шарм.

Dias
источник
2

Решение Бонда (редактирование таблицы цветов в 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 он не сможет установить правильный цвет для элемента, для которого был установлен измененный цвет.

Я все еще пытаюсь найти решение, но хотел опубликовать то, что я нашел до сих пор.

ravanbak
источник