27

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

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

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

9 ответов9

15

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 поддерживает только эти внутренние значения, и наибольшее число, которое он понимает, равно 16. Любое другое значение не будет принято, и по умолчанию оно вернется к AUTO.

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

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

11

Я создал приложение на основе информации, найденной здесь: https://github.com/dimitropoulos/VBECustomColors

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

сс

Вы можете скачать его здесь:https://github.com/gallaux/VBEThemeColorEditor

наслаждаться

Изменить: Исходный код теперь доступен!

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.

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.

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

Изменение обеих строк не обязательно, так как позволяет корректно сохранять цвета при выключении и позволяет редактору цветов открываться без ошибок 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

Вот трюк, как сохранить постоянный выбор цвета. Немного больше шестнадцатеричного редактирования. Если вы сделали замену, предложенную 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). Работай как шарм.

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

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

2

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

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

Option Explicit

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

Public Property Let ForeColour(ByVal iID As Integer)
    m_iForeColour = iID
End Property
Public Property Get ForeColour() As Integer
    ForeColour = m_iForeColour
End Property

Public Property Let BackColour(ByVal iID As Integer)
    m_iBackColour = iID
End Property
Public Property Get BackColour() As Integer
    BackColour = m_iBackColour
End Property

Public Property Let IndicatorColour(ByVal iID As Integer)
    m_iIndicatorColour = iID
End Property
Public Property Get IndicatorColour() As Integer
    IndicatorColour = m_iIndicatorColour
End Property

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

Option Explicit

Public FormDisplayed          As Boolean
Public VBInstance             As VBIDE.VBE
Dim mcbMenuCommandBar         As Office.CommandBarControl
Dim mfrmAddIn                 As New frmAddIn
Public WithEvents MenuHandler As CommandBarEvents          'command bar event handler

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 As CommandBarEvents

Dim codeColours() As Colour

'*****************************************************************************
' RunScript Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  Runs the code that sets the required colours for the code window in the
'  active IDE.
'  *** A PROJECT MUST BE LOADED BEFORE THIS WILL ACTUALLY WORK ***
'*****************************************************************************
Sub RunScript()
    ReadColoursFile

    ' Select Tools > Options
    SendKeys "%to", 5
    ' Go to tabs, select "Options"
    SendKeys "+{TAB}"
    SendKeys "{RIGHT}"

    ' Select listbox
    SendKeys "{TAB}"

    Dim colourSetting As Colour
    Dim iColour As Integer

    For iColour = 0 To 9
        SetColours iColour, codeColours(iColour)
    Next iColour

    SendKeys "~"
End Sub

'*****************************************************************************
' ReadColoursFile Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  Reads the colour file from disk and populates the codeColours array which
'  is used by the SetColour* methods for selecting the correct colours from
'  the options screen.
'*****************************************************************************
Sub ReadColoursFile()
    Dim colourLine As String
    Dim colourArray() As String
    Dim colourSetting As Colour
    Dim oFSO As FileSystemObject

    Set oFSO = New FileSystemObject

    If Not oFSO.FileExists(App.Path & "\VB6CodeColours.dat") Then
        MsgBox "VB6CodeColours.dat not found in " & App.Path, vbOKOnly, "VB6CodeColours Settings file not found!"
        Exit Sub
    End If

    Set oFSO = Nothing

    Open App.Path & "\VB6CodeColours.dat" For Input As #1
    ReDim codeColours(9) As Colour

    While Not EOF(1)
        Line Input #1, colourLine
        colourArray = Split(colourLine, ",")

        If IsNumeric(colourArray(0)) Then
            If codeColours(colourArray(0)) Is Nothing Then
                Set colourSetting = New Colour

                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

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

    Close #1

    Set colourSetting = Nothing
End Sub

'*****************************************************************************
' SetColours Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  Selects the colour item from the list and then iterates the colour selector
'  controls associated with that item and sets them according to the values
'  set in the VB6CodeColours.dat file.
'*****************************************************************************
Sub SetColours(ByVal iColour As Integer, ByRef colourSetting As Colour)
    Dim iKey As Integer

    SendKeys "{HOME}"

    For iKey = 1 To iColour
        SendKeys "{DOWN}"
    Next iKey

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

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

'*****************************************************************************
' SetColourSelector Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  Sets the colour in the selector combo. Assumes the focus is on the
'  preceeding control before the code is run (first line tabs to the
'  assumed control).
'*****************************************************************************
Sub SetColourSelector(ByVal iColour As Integer)
    Dim iKey As Integer

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

    For iKey = 1 To iColour
        SendKeys "{DOWN}"
    Next iKey
End Sub

'*****************************************************************************
' AddinInstance_OnConnection Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  This method runs when the addin is loaded by the IDE
'*****************************************************************************
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
    On Error GoTo ErrorHandler

    'save the vb instance
    Set VBInstance = Application

    If ConnectMode  ext_cm_External Then
        Set mcbMenuCommandBar = AddToAddInCommandBar("VB6 Code Colouring")
        'sink the event
        Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)

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

        Set oStdToolbar = VBInstance.CommandBars("Standard")
        Set oStdToolbarItem = oStdToolbar.Controls.Add(Type:=msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Set IDE Colours"
        oStdToolbarItem.BeginGroup = True
        Set Me.MenuHandler2 = VBInstance.Events.CommandBarEvents(oStdToolbarItem)
    End If

    Exit Sub
ErrorHandler:
    MsgBox Err.Description
End Sub

'*****************************************************************************
' AddinInstance_OnDisconnection Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  This method runs when the addin is removed by the IDE and cleans up any
'  references etc.
'*****************************************************************************
Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
    On Error Resume Next

    'delete the command bar entry
    mcbMenuCommandBar.Delete

    'shut down the Add-In
    If FormDisplayed Then
        SaveSetting App.Title, "Settings", "DisplayOnConnect", "1"
        FormDisplayed = False
    Else
        SaveSetting App.Title, "Settings", "DisplayOnConnect", "0"
    End If

    Unload mfrmAddIn
    Set mfrmAddIn = Nothing

    Set MenuHandler = Nothing
    Set MenuHandler2 = Nothing
End Sub

'*****************************************************************************
' MenuHandler_Click Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  This method performs the tasks needed when the menu item is clicked.
'*****************************************************************************
Private Sub MenuHandler_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
    RunScript
End Sub

'*****************************************************************************
' MenuHandler2_Click Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  This method performs the tasks needed when the toolbar button is clicked.
'*****************************************************************************
Private Sub MenuHandler2_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
    RunScript
End Sub

'*****************************************************************************
' AddToAddInCommandBar Sub
'-----------------------------------------------------------------------------
' DESCRIPTION:
'  Adds the specified item to the menu list.
'*****************************************************************************
Function AddToAddInCommandBar(sCaption As String) As Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl  'command bar object
    Dim cbMenu As Object

    On Error Resume Next

    'see if we can find the Add-Ins menu
    Set cbMenu = VBInstance.CommandBars("Add-Ins")
    If cbMenu Is Nothing Then
        'not available so we fail
        Exit Function
    End If

    On Error GoTo ErrorHandler

    'add it to the command bar
    Set cbMenuCommandBar = cbMenu.Controls.Add(1)
    'set the caption
    cbMenuCommandBar.Caption = sCaption

    Set AddToAddInCommandBar = cbMenuCommandBar

    Exit Function
ErrorHandler:
    ' Exit gracefully
End Function

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .