Como posso usar cores personalizadas no editor do Microsoft VBA?

26

Estou trabalhando em alguns projetos para o trabalho usando o Excel e o VBA, portanto, não tenho escolha a não ser usar o editor do Microsoft Visual Basic. Eu normalmente não me importo, mas não consigo descobrir como definir uma cor personalizada para o editor (só posso escolher na paleta padrão).

Para mudar a cor atualmente, eu vou para Tools -> Options -> Editor Format ... No entanto, suas escolhas são limitadas apenas às 16 cores padrão (e básicas) - e quando digo básico, quero dizer básico , como rosa, azul, preto, branco, etc ...

Alguém sabe como especificar uma cor personalizada ou, no mínimo, alterar algumas das cores exibidas na paleta padrão?

    
por Breakthrough 21.07.2011 / 21:04

9 respostas

16

O VBA lê as configurações das cores dessas chaves de registro:

HKEY_CURRENT_USER\Software\Microsoft\VBA.0\Common\CodeForeColors HKEY_CURRENT_USER\Software\Microsoft\VBA.0\Common\CodeBackColors

Cada uma dessas chaves contém uma lista de valores (separados por espaço) para cada entrada em Ferramentas - > Opções - > Formato do Editor. Por exemplo, o primeiro valor dentro de CodeBackColors é a cor de fundo e o primeiro valor dentro de CodeForeColors é a cor de primeiro plano do texto normal. Os valores são o id interno para a cor, 0 significa coloração AUTO, 11 mostra ciano, 5 vermelho etc.

Para fazer uma tentativa: Feche o Excel, altere o primeiro valor de CodeBackColors para 5 e reinicie o Excel. O plano de fundo do editor de código agora será vermelho.

O problema é que o Editor VBA suporta apenas esses valores internos e o número mais alto que ele entende é 16. Qualquer outro valor não será aceito e o padrão será AUTO.

Eu tentei várias opções de inserir valores diferentes (por exemplo, 128255128, 16777215, #aaffee, 255 ou "170,255,238") e nenhum deles funcionou.

Portanto, acho que tecnicamente não é possível atribuir outras cores.

    
por 27.07.2011 / 12:26
11

Eu criei um aplicativo com base nas informações encontradas aqui: link

Basicamente, faz o backup do arquivo .dll do VBE6 / VBE7 e permite o uso de cores personalizadas sem ter que usar um editor hexadecimal.

Vocêpodebaixá-loaqui: link

Aproveite

Editar: o código-fonte está agora disponível!

    
por 21.11.2016 / 21:22
6

TeX HeX está no local. No entanto, é possível alterar as 16 cores incorporadas com o seu próprio. Apenas requer um pouco de edição hexadecimal. Aqui está um guia passo a passo. (Nota: Isto é para o VB6 SP6, versão do arquivo 6.0.97.82).

  1. Faça o backup do arquivo VB6.EXE na pasta do programa VB98. (Opcional, mas recomendado).

  2. Abra seu editor hexadecimal favorito (grite para HxD) e abra o VB6.EXE.

  3. Pule para o endereço 0xE22F4. Este é o começo da tabela de cores.

Você deve ver quatro zeros. Isso representa a cor preta no formato RRGGBBAA (o alpha não é suportado, então é apenas o formato RRGGBB00). Os próximos quatro bytes especificam a próxima cor e assim por diante até chegar a FFFFFF00 (branco) terminando no deslocamento 0xE2333.

  1. Edite qualquer um desses valores de quatro bytes para sua escolha. Basta usar os valores hexadecimais apropriados no formato RGB, seguidos de um byte zero. Por exemplo, RGB (64, 128, 192) seria 40 80 C0 00.

  2. Salve suas alterações no EXE e ative o VB6. Você deve ver sua (s) nova (s) cor (es) nos slots anteriormente ocupados pelas cores VB internas.

por 06.02.2013 / 20:26
5

Como muitos notaram, a solução de Bond (hex editando a tabela de cores no VB6.exe) funcionará, mas você terá que entrar e redefinir suas cores na caixa de diálogo de opções toda vez que iniciar o VB6. Eu criei um script AutoIt que fará todo o trabalho para você, basta editá-lo conforme necessário, onde todas as chamadas para SetSyntaxColoring () são feitos:

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

Eu apenas o mantenho na minha área de trabalho e agora, sempre que eu tenho que abrir o vb6, eu apenas clico duas vezes e, assim, a sintaxe colorida está sob meu controle.

Editar 1: Otimizei o script um pouco para torná-lo mais rápido. Estou pensando em montar um programa que edite o VB6.EXE automaticamente para facilitar a seleção de cores. Gostaria de saber se há uma maneira de abandonar o script AutoIt criando um plug-in para o VS?

Editar 2: Criado um utilitário que permite editar as cores no exe sem ter que usar um editor hexadecimal: VbClassicColorEditor . Esse link vai para o repositório público no bitbucket.

    
por 24.06.2013 / 20:10
3

Eu criei um programa que automatiza tudo isso, passei muito tempo nele, me diverti criando um seletor de cores. Feito em VB6 porque porque não. Programa compilado e código fonte disponível aqui . Testado apenas nas minhas versões do DLL e do VB6, faça backups antes de alterar qualquer coisa - os locais são corrigidos no código.

Esta é uma pergunta muito antiga, mas eu gostaria de avaliar a perfeição

Para cores VS2012 no IDE VBA ou VB6: Abra VBE6.DLL / VBE7.DLL ou VBA6.DLL em

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

com seu editor hexadecimal

Substitua a primeira ocorrência de

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

com

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

Em seguida, retorne ao topo e substitua a segunda ocorrência de

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

com

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

Em seguida, modifique o seguinte no registro

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

Se você está modificando para VBA você está pronto, para o VB6 agora abra o 'VB6.exe' no seu editor Hex e modifique a primeira ocorrência de

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

com

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

Isso corrige a cor exibida na interface do VB6, de modo que, se você quiser fazer outras alterações nas cores, você pode.

Obrigado a todas as outras respostas, eu mesmo não pensei nisso, achei útil ter todas as informações necessárias em um único post (em nenhum lugar eu vi modificar o VB6.exe e o VBA6.dll juntos) ). Usando esse método, você deve poder selecionar livremente as cores disponíveis.

Eu também reordenei as cores de algumas das outras respostas, então não altere vbRed, vbBlue, vbWhite etc, então você ainda deve obter o resultado desejado no código. Isso não foi totalmente testado, portanto, sempre modifique os programas por sua conta e risco.

Seria bom montar um pequeno programa que faria isso para você (como o gallaux fez), eu tive problemas com a gravação no registro e o VB6 IDE usando esse programa, e vir uma espécie de janela de visualização seria legal .

Limitações que encontrei: isso não altera a cor dos ícones dos indicadores, você deve fazer isso sozinho.

    
por 20.02.2018 / 13:32
2

Tomando a isca da resposta do dnissley (onde ele pergunta se alguém poderia fazer um add-in), eu fiz um add-in para o VB6. É um pouco grosseiro (e explicarei o porquê em breve), mas faz o trabalho.

Eu criei um novo projeto Add-In no VB6 que me deu o formato padrão "frmAddin" (que eu não uso) e o designer "Connect". Adicionei uma classe Color que contém o seguinte:

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

Em seguida, alterei o código no Designer "Connect" como segue:

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

Esse código permite que o aplicativo leia as cores que eu quero de um arquivo que resida no mesmo diretório que o .dll (chamado VB6CodeColours.dat). Este arquivo contém o seguinte (e ele varia de acordo com as cores que você substitui no VB6.EXE, portanto, uma cópia e uma cópia retas provavelmente não funcionarão.

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

Parece rabugento, mas vou explicar. Tem o formato "Cor do Código", "Primeiro Plano", "Fundo", Indicador "para que a linha superior defina o" Texto Normal "para o 14º item na combinação para Primeiro Plano, o 12º para Fundo e o 1º para o Indicador .

Por que eu disse que é uma solução bem crua: * Ele usa SendKeys. Nenhuma outra explicação necessária, tenho certeza :) * O usuário tem que clicar no menu / barra de ferramentas para que ele tenha efeito. * O código não está melhor estruturado (na minha opinião), mas foi baseado na quantidade de tempo que eu poderia dedicar a ele na época. Eu pretendo melhorá-lo no futuro, mas funciona bem para mim no estado atual (então provavelmente vou deixá-lo!)

Talvez com base, alguém possa expandi-lo ainda mais.

    
por 03.01.2014 / 13:02
2

Aqui está o truque de como manter sua seleção de cores permanente. Um pouco mais de edição hexadecimal. Se você fez a substituição sugerida por Bond , você deve ter o seguinte à sua disposição: valores RGBA para 16 cores básicas (clássicas) indexadas de 0 a 15 e valores RGBA para suas cores personalizadas indexadas da mesma maneira. Agora pesquise VBEx.DLL para seqüência de bytes criada a partir de valores RGBA "clássicos" ordenados na seguinte sequência de índices: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (ou seja, branco, cinza, cinza escuro, preto, vermelho, vermelho escuro, etc.). O padrão não aleatório, é derivado de valores, armazenados no registro, veja post de Tex Hex . A seqüência hexadecimal para pesquisa deve se parecer com 'FFFFFF00C0C0C0008080800000000000FF000000 ...', etc. 64 bytes no total. Substitua a sequência de bytes encontrados por valores RGBA de cores "personalizadas", ordenadas da mesma forma, por ex. 15, 7, 8, etc. Agora, todas as cores escolhidas na interface do usuário do VS serão armazenadas no registro e aplicadas após a reinicialização do aplicativo. Bem, tudo, mas cores "indicadoras". Estes sempre redefinem para os padrões. Notas:

  1. Em VBE7.DLL (MSO2010) eu encontrei apenas uma seqüência de bytes ordenada dessa forma no deslocamento 0x15A98C.
  2. Como mencionado na postagem de Bond , há várias seqüências de bytes para a primeira substituição (valores RGBA básicos ordenados diretamente de 0 a 15). Eu mudei apenas um, o mais próximo do deslocamento da nota anterior (encontrado em 0x15A5AC).
  3. Tudo acima você está fazendo por sua conta e risco :) E não se esqueça de fazer backup.

Agradecimentos a Tex Hex e Bond para pesquisa inicial.

UPD: testado com MSO2007 (VBE6.DLL) e MSO2013 (VBE7.DLL). Trabalhe como um encanto.

    
por 14.08.2015 / 13:02
2

Eu só queria postar um resumo das respostas anteriores, já que não está totalmente claro o que precisa ser feito para mudar as cores no Excel VBA Editor

No exemplo abaixo, estou adicionando o esquema de cores para Solarizado e estou assumindo o uso do Office 2010

Passo 0: Faça um backup do VBE7.dll antes de modificá-lo - você foi avisado !!!

Etapa 1: Em um editor Hex, abra o VBE7.dll localizado @

"C:\Program Files\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" para 64 bits

ou

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

Etapa 2: Encontre a primeira ocorrência de

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'

e substitua por

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

Etapa 3: Encontre a segunda ocorrência disso (certifique-se de pesquisar na parte superior do arquivo)

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

e substitua por

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

Etapa 4: Salve o arquivo dll e abra o Excel > Editor VBA > Ferramentas > Opções > Editor de formato e defina as cores do código.

A alteração de ambas as strings é necessária, pois permite que as cores sejam salvas corretamente no desligamento e permite que o editor de cores seja aberto sem falhas do Excel.

Obrigado a todos os respondentes anteriores por dedicarem tempo a descobrir isso!

    
por 09.01.2016 / 23:16
2

A solução de Bond (editando a tabela de cores no VB6.exe) funciona perfeitamente para modificar a tabela de cores no VB6 IDE. No entanto, descobri que quando uma cor modificada é selecionada e o VB6 é desligado, o VB6 não é capaz de salvar adequadamente a cor modificada no registro.

Normalmente, o VB6 grava um índice na tabela de cores de 16 valores para cada item de texto que pode ter sua cor modificada.

Os índices de cor são gravados no registro aqui:

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

Por exemplo, o valor de CodeForeColors será parecido com isto:

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

Valores de 1 a 16 representam uma cor na tabela de cores e 0 significa 'Auto'.

No entanto, quando uma cor modificada é selecionada, o VB6 gravará um número fora do intervalo de índice para o registro e o valor de CodeForeColors será algo como isto:

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

Na próxima vez que o VB6 for iniciado, ele não poderá definir a cor correta para o item que foi definido para a cor modificada.

Ainda estou tentando descobrir uma solução, mas queria postar o que encontrei até agora.

    
por 28.03.2013 / 19:27