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

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

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

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

12
задан Breakthrough
03.02.2023 11:48 Количество просмотров материала 2856
Распечатать страницу

9 ответов

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

раздел реестра HKEY_CURRENT_USER\программное обеспечение\Майкрософт\на VBA\6.0\общие\CodeForeColors Раздел реестра HKEY_CURRENT_USER\программное обеспечение\Майкрософт\на VBA\6.0\общие\CodeBackColors

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

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

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

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

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

16
отвечен Tex Hex 2023-02-04 19:36

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

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

ss

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

наслаждайтесь

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

11
отвечен gallaux 2023-02-04 21:53

Tex HeX находится на месте. Однако, возможно изменить 16 встроенных цветов с вашими. Это просто требует немного шестнадцатеричного редактирования. Вот пошаговое руководство. (Примечание: это для VB6 SP6, версия файла 6.0.97.82).

  1. резервное копирование VB6.EXE-файл в папке программы VB98. (Необязательно, но рекомендуется).

  2. Запустите свой любимый редактор hex (крикните HxD) и откройте VB6.ИСПОЛНЯЕМЫЙ.

  3. перейти к адресу 0xE22F4. Это начало таблицы цветов.

вы должны увидеть четыре нуля. Это представляет черный цвет в формате RRGGBBAA (Альфа не поддерживается, так что это действительно просто формат RRGGBB00). Следующие четыре байта указывают следующий цвет и так далее, пока вы не доберетесь до ffffff00 (белый), заканчивающийся в смещении 0xE2333.

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

  2. сохраните изменения в EXE и запустите VB6. Вы должны увидеть свой новый цвет(ы) в слотах, ранее занятых встроенными цветами VB.

6
отвечен Bond 2023-02-05 00:10

как многие отметили, Решение Бонда (шестнадцатеричное редактирование таблицы цветов в 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?

Edit 2: создана утилита, которая позволяет редактировать цвета в EXE без использования HEX-редактор: VbClassicColorEditor. Эта ссылка идет в публичное хранилище на bitbucket.

5
отвечен Dylan Nissley 2023-02-05 02:27

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



это очень старый вопрос, но я хотел бы взвесить для полнота

для цветов VS2012 в IDE VBA или VB6: Откройте 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)

С HEX редактор

заменить первое вхождение

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.0\Common    
HKEY_CURRENT_USER\Software\Microsoft\VBA.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 и т. д., Поэтому вы все равно должны получить желаемый результат в коде. Это не было полностью протестировано, так как всегда изменять программы на свой страх и риск.

было бы неплохо собрать небольшую программу, которая сделает это за вас (как это сделал Галло), у меня были проблемы с записью в реестр и VB6 IDE с помощью этой программы, и приходят своего рода окно предварительного просмотра было бы хорошо.

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

3
отвечен Sam 2023-02-05 04:44

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

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

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

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

2
отвечен jonifen 2023-02-05 07:01

вот трюк, как сохранить ваш выбор цвета постоянным. Немного больше шестнадцатеричного редактирования. Если вы сделали замену, предложенную 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's post. Шестнадцатеричная строка для поиска должна выглядеть как 'FFFFFF00C0C0C00080800000000000FF000000...', п. 64 байт. Замену нашли последовательность байтов с RGBA значения "заказных" цветы заказаны таким же образом, например, 15, 7, 8, и т. д. Теперь все цвета, выбранные в пользовательском интерфейсе VS, будут сохранены в реестре и применены после перезапуска приложения. Ну, все, но цвета" индикатора". Они всегда сбрасываются к значениям по умолчанию. Примечания:

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

спасибо Tex Hex и Bond для первоначальных исследований.

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

2
отвечен dias 2023-02-05 09:18

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

В приведенном ниже примере я добавляю цветовую схему для Solarized и я предполагаю использование Office 2010

Шаг 0: сделайте резервную копию VBE7.dll перед изменением-вы были предупреждены!!!

Шаг 1: в HEX-редактор , откройте VBE7.файл DLL находится @

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

или

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

Шаг 2: найти 1st возникновения

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: найти 2nd возникновение этого (убедитесь, что вы ищете из верхней части файла)

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

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

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

2
отвечен Steven Martin 2023-02-05 11:35

решение Бонда (редактирование таблицы цветов в 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
отвечен ravanbak 2023-02-05 13:52

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх