Como posso usar cores personalizadas no editor do Microsoft VBA?


33

Estou trabalhando em alguns projetos para trabalhar com Excel e VBA, então não tenho escolha a não ser usar o editor do Microsoft Visual Basic. Normalmente, eu não me importaria, mas não consigo descobrir como definir uma cor personalizada para o editor (só posso escolher na paleta padrão).

Para alterar a cor atualmente, 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 que aparecem na paleta padrão?


Acho que o que a Microsoft está tentando nos dizer é que eles não querem que as pessoas programem no VBA. Ou talvez Bill Gates seja um grande produtor de analgésicos.
Holene

Respostas:


19

O VBA lê as configurações das cores dessas chaves do Registro:

HKEY_CURRENT_USER \ Software \ Microsoft \ VBA \ 6.0 \ Common \ CodeForeColors HKEY_CURRENT_USER \ Software \ Microsoft \ VBA \ 6.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 plano de fundo e o primeiro valor dentro de CodeForeColors é a cor de primeiro plano do texto normal. Os valores são o ID interno da cor, 0 significa coloração AUTO, 11 mostra ciano, 5 vermelho etc.

Para tentar: 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 do 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 volta para AUTO.

Eu tentei várias opções para 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.


1
Obrigado pela resposta. IIRC, você não pode retirar uma recompensa, mas se você literalmente não puder fazer isso, eu lhe darei a resposta mais correta. Quero esperar um pouco mais para ver se mais respostas foram postadas, mas obrigado pela sua resposta, +1.
Breakout

1
Eu tenho que admitir, isso soa ainda melhor :)
Tex Hex

O "Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) da FMS possui uma ferramenta "Gerenciador de esquema de cores VBE para visualizar e definir cores facilmente para o seu editor". Se você baixar o manual do usuário (um PDF), ele mostra capturas de tela que, facilitando a definição de cores, ainda estão limitadas a uma paleta de 16 cores. Pensaria que, se houvesse uma maneira direta de usar cores personalizadas, elas o incluiriam nesta ferramenta. Parece que o Tex Hex está correto.
Brian

Como agora foi demonstrado com as respostas abaixo que é possível, essa resposta deve ser modificada. É possível alterar com segurança as cores no Editor VBA usando um editor HEX.
Steven Martin

16

Criei um aplicativo com base nas informações encontradas aqui: https://github.com/dimitropoulos/VBECustomColors

Ele basicamente faz backup do arquivo .dll do VBE6 / VBE7 e permite o uso de cores personalizadas sem a necessidade de um editor hexadecimal.

ss

Você pode baixá-lo aqui: https://github.com/gallaux/VBEThemeColorEditor

Apreciar

Edit: O código fonte já está disponível!


Uau super legal, obrigado por compartilhar @gallaux - eu definitivamente vou ver isso. Você está planejando liberar o código fonte por curiosidade?
Revelação

Sim, eu vou em breve, eu só preciso limpá-lo um pouco;)
gallaux

Graças à Gallaux, eu pretendia fazer a mesma coisa, mas, depois de colocar meu editor de vba no esquema de cores que eu mais gostava, perdi essa motivação porque não estava mais tão "frustrado" por 16 olhos cansados!
Steven Martin

1
Desculpe como aplicar isso, eu preciso de ajuda
Pedro Miguel Pimienta Morales

1
@YouCrackedMeUp, você precisa atualizar a chave do registro usando o regedit (baseado em github.com/dimitropoulos/VBECustomColors ): [1] Navegue no regedit para HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] mudança CodeBackColorspara: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] mudança CodeForeColorspara: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] mudança FontFacepara: Consolas.
Tigregalis 9/08/19

7

TeX HeX está no local. No entanto, é possível alterar as 16 cores internas por conta própria. Requer apenas um pouco de edição hexadecimal. Aqui está um guia passo a passo. (Nota: Este é para o VB6 SP6, versão 6.0.97.82).

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

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

  3. Vá para o endereço 0xE22F4. Este é o início da tabela de cores.

You should see four zeros. This represents the color black in RRGGBBAA format (alpha isn't supported so it's really just RRGGBB00 format). The next four bytes specify the next color and so on until you get to FFFFFF00 (white) ending at offset 0xE2333.

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

  2. Salve suas alterações no EXE e inicie o VB6. Você deve ver suas novas cores nos slots anteriormente ocupados pelas cores internas do VB.


1
Hmm, procurei com a ferramenta tudo em um sistema com o Office 2003 e ele não encontra nenhum arquivo chamado VB6.exe ou uma pasta VB98. Essa resposta é apenas para o Office 2007 como o OP tem? No entanto, a versão 6.0.97.82 é mais velha do que a minha com o Office 2003.
nixda

1
@ nixda Nada no meu sistema também - acho que Bond está se referindo ao aplicativo VB6 em seu sistema, não ao VBA integrado ao Excel. Vou dar uma olhada no executável do Excel e em algumas das DLLs do VBA e ver se consigo encontrar alguma tabela de cores.
Revelação

1
Eu tenho o Office 2010 no meu PC, então tenho o VBE7.DLL, não o VBE6.DLL, mas deve ser o mesmo processo. As cores são as mesmas. Se você observar as cores na ordem em que são exibidas, elas deverão ser: Preto = 00 00 00 00 Marinha = 00 00 80 00 Verde = 00 80 00 00 Turquesa = 00 80 80 00 Magenta = 80 00 00 00 Violeta = 80 00 80 00 Azeitona = 80 80 00 00 Lgt Cinza = C0 C0 C0 00 Cinza escuro = 80 80 80 00 ... Adicionei os códigos de cores hexadecimais ao lado de cada um. Portanto, basta abrir o VBE6.DLL em um editor hexadecimal e procurar a seguinte seqüência hexadecimal:
Bond

1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Pode ocorrer várias vezes, mas descobri que a primeira tabela de cores é tudo o que precisa ser modificado. Veja se isso funciona para você.
12303 Bond

1
Resposta incrível, Bond. Para futuros leitores, a chave que eu precisava mudar era a segunda (Office 2013, Windows 8.1), localizada em '12 50B4' usando o Hex Edit (byte nº 1.200.308))
Andy Terra

5

Como muitos observaram, a solução de Bond (edição hexadecimal da tabela de cores no VB6.exe) funcionará, mas você precisará entrar e redefinir as cores na caixa de diálogo de opções sempre que iniciar o VB6. Eu criei um AutoIt script que fará todo o trabalho para você, apenas edite-o conforme necessário, onde todas as chamadas para SetSyntaxColoring () são feitas:

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 área de trabalho e agora, sempre que preciso abrir o vb6, clico duas vezes nele e, assim, a cor da sintaxe está sob meu controle.

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

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


Obrigado pelo roteiro e contribuição! Alguma chance de conseguirmos um link atualizado no VbClassicColorEditor? O que você postou tem 404d ...
Andy Terra

3

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

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

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

Etapa 1: em um editor hexadecimal, 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

Passo 2: encontre a 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 (pesquise 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

Passo 4: salve o arquivo dll e abra o Excel> Editor VBA> Ferramentas> Opções> Formato do editor e defina as cores do código.

Alterar as duas strings não é necessário, 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 um tempo para descobrir isso!


3

Eu criei um programa que automatiza tudo isso, gastei muito tempo nele e nos divertimos 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 de DLL e VB6, faça backups antes de alterar qualquer coisa - os locais são fixos no código.



Esta é uma pergunta muito antiga, mas eu gostaria de considerar a integridade

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, volte 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

Modifique o seguinte no registro

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

Se você está modificando para o VBA, conclua para o VB6 agora abra '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, para que você possa fazer outras alterações nas cores.

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

Também reordenei as cores de algumas das outras respostas, para não alterar vbRed, vbBlue, vbWhite etc., para que você ainda obtenha 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 faça isso por você (como o gallaux fez), tive problemas com a gravação no registro e no IDE do VB6 usando esse programa, e vir uma janela de visualização seria bom.

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


2

Tomando a isca da resposta de dnissley (onde ele pergunta se alguém poderia criar um suplemento), eu criei um suplemento para o VB6. É um pouco grosseiro (e vou explicar o porquê em breve), mas faz o trabalho.

Criei um novo projeto de suplemento no VB6, que me forneceu o formulário "frmAddin" padrão (que não uso) e o designer "Connect". Eu adicionei uma classe Color, que contém o seguinte:

Opção explícita

Dim m_iForeColour As Inteiro
Dim m_iBackColour As Inteiro
Dim m_iIndicatorColour As Inteiro

Propriedade pública Let ForeColour (ByVal iID como Inteiro)
    m_iForeColour = iID
Propriedade final
Propriedade pública Get ForeColour () As Inteiro
    ForeColour = m_iForeColour
Propriedade final

Propriedade pública Let BackColour (ByVal iID como inteiro)
    m_iBackColour = IDI
Propriedade final
Propriedade pública Get BackColour () As Inteiro
    BackColour = m_iBackColour
Propriedade final

Propriedade pública Let IndicatorColour (ByVal iID como Inteiro)
    m_iIndicatorColour = iID
Propriedade final
Propriedade pública Get IndicatorColour () As Inteiro
    IndicatorColour = m_iIndicatorColour
Propriedade final

E então alterei o código no Designer "Connect" da seguinte forma:

Opção explícita

Public FormDisplayed As Boolean
VBInstance público como VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
Dim mfrmAddIn As New frmAddIn
Public WithEvents MenuHandler Como o manipulador de eventos da barra de comandos CommandBarEvents

Dim mcbToolbar As Office.CommandBarControl
Public WithEvents MenuHandler2 Como CommandBarEvents

Dim colorColours () As Color

'************************************************* ****************************
'RunScript Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Executa o código que define as cores necessárias para a janela de código no
'IDE ativo.
'*** UM PROJETO DEVE SER CARREGADO ANTES DE DAR TRABALHO REALMENTE ***
'************************************************* ****************************
Sub RunScript ()
    ReadColoursFile

    'Selecione Ferramentas> Opções
    Teclas Send "% para", 5
    'Vá para as guias, selecione "Opções"
    Teclas de envio "+ {TAB}"
    Teclas de envio "{DIREITA}"

    'Selecionar caixa de listagem
    Teclas de envio "{TAB}"

    Dimensionar como cor
    Dim iColour As Inteiro

    Para iColour = 0 a 9
        SetColours iColour, codeColours (iColour)
    Próximo iColour

    Teclas de envio "~"
End Sub

'************************************************* ****************************
'ReadColoursFile Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Lê o arquivo colorido do disco e preenche a matriz codeColours que
'é usado pelos métodos SetColour * para selecionar as cores corretas
'a tela de opções.
'************************************************* ****************************
Sub ReadColoursFile ()
    Linha As String
    Dim colourArray () como String
    Dimensionar como cor
    Dim oFSO As FileSystemObject

    Defina oFSO = New FileSystemObject

    Caso contrário, oFSO.FileExists (App.Path & "\ VB6CodeColours.dat")
        MsgBox "VB6CodeColours.dat não encontrado em" & App.Path, vbOKOnly, "Arquivo de configurações do VB6CodeColours não encontrado!"
        Sair do Sub
    Fim se

    Definir oFSO = Nothing

    Abra App.Path e "\ VB6CodeColours.dat" para entrada como nº 1
    Código ReDimCores (9) Como Cor

    Embora não seja EOF (1)
        Entrada de linha # 1, colourLine
        colourArray = Dividir (colourLine, ",")

        Se IsNumeric (colourArray (0)), então
            Se codeColours (colourArray (0)) for Nothing Then
                Definir colourSetting = Nova cor

                Se IsNumeric (colourArray (1)), então
                    colourSetting.ForeColour = CInt (colourArray (1))
                Fim se

                Se IsNumeric (colourArray (2)), então
                    colourSetting.BackColour = CInt (colourArray (2))
                Fim se

                Se IsNumeric (colourArray (3)), então
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                Fim se

                Definir codeColours (colourArray (0)) = colourSetting
            Fim se
        Fim se
    Wend

    Fechar # 1

    Definir colourSetting = Nothing
End Sub

'************************************************* ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Seleciona o item de cor da lista e itera o seletor de cores
'controla associado a esse item e os define de acordo com os valores
definido no arquivo VB6CodeColours.dat.
'************************************************* ****************************
Sub SetColours (ByVal iColour As Inteiro, ByRef colourSetting As Color)
    Dim iKey As Inteiro

    Teclas de envio "{HOME}"

    Para iKey = 1 Para iColour
        Teclas de envio "{DOWN}"
    Próximo iKey

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

    Teclas de envio "+ {TAB}"
    Teclas de envio "+ {TAB}"
    Teclas de envio "+ {TAB}"
End Sub

'************************************************* ****************************
'SetColourSelector Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Define a cor no combo do seletor. Assume que o foco está no
'precede o controle antes da execução do código (guias da primeira linha do
controle assumido).
'************************************************* ****************************
Sub SetColourSelector (ByVal iColour As Inteiro)
    Dim iKey As Inteiro

    Teclas de envio "{TAB}"
    Teclas de envio "{HOME}"

    Para iKey = 1 Para iColour
        Teclas de envio "{DOWN}"
    Próximo iKey
End Sub

'************************************************* ****************************
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Este método é executado quando o suplemento é carregado pelo IDE
'************************************************* ****************************
Sub privado AddinInstance_OnConnection (aplicativo ByVal como objeto, ByVal ConnectMode como AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst como objeto, custom () como variante)
    Em erro GoTo ErrorHandler

    'salve a instância vb
    Defina VBInstance = Aplicativo

    Se o ConnectMode ext_cm_External Then
        Definir mcbMenuCommandBar = AddToAddInCommandBar ("Coloração de código VB6")
        afundar o evento
        Defina Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

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

        Defina oStdToolbar = VBInstance.CommandBars ("Standard")
        Defina oStdToolbarItem = oStdToolbar.Controls.Add (Tipo: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Definir cores do IDE"
        oStdToolbarItem.BeginGroup = True
        Defina Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    Fim se

    Sair do Sub
ErrorHandler:
    MsgBox Err.Description
End Sub

'************************************************* ****************************
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Este método é executado quando o suplemento é removido pelo IDE e limpa qualquer
'referências etc.
'************************************************* ****************************
Sub privado AddinInstance_OnDisconnection (ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom () As Variant)
    Em erro, retomar em seguida

    'exclua a entrada da barra de comando
    mcbMenuCommandBar.Delete

    'desligue o suplemento
    Se FormDisplayed Then
        Título do aplicativo SaveSetting, "Configurações", "DisplayOnConnect", "1"
        FormDisplayed = False
    Outro
        SaveSetting App.Title, "Configurações", "DisplayOnConnect", "0"
    Fim se

    Descarregar mfrmAddIn
    Defina mfrmAddIn = Nothing

    Definir MenuHandler = Nada
    Definir MenuHandler2 = Nada
End Sub

'************************************************* ****************************
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Este método executa as tarefas necessárias quando o item de menu é clicado.
'************************************************* ****************************
Private Sub MenuHandler_Click (ByVal CommandBarControl como objeto, manipulado como booleano, CancelDefault como booleano)
    RunScript
End Sub

'************************************************* ****************************
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Este método executa as tarefas necessárias quando o botão da barra de ferramentas é clicado.
'************************************************* ****************************
Sub-MenuHandler2_Click privado (ByVal CommandBarControl como objeto, tratado como booleano, CancelDefault como booleano)
    RunScript
End Sub

'************************************************* ****************************
'AddToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
' DESCRIÇÃO:
'Adiciona o item especificado à lista de menus.
'************************************************* ****************************
Função AddToAddInCommandBar (sCaption As String) Como Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl 'objeto da barra de comando
    Dim cbMenu como objeto

    Em erro, retomar em seguida

    'veja se conseguimos encontrar o menu Add-Ins
    Defina cbMenu = VBInstance.CommandBars ("Suplementos")
    Se cbMenu não for nada, então
        'não disponível, então falhamos
        Função de saída
    Fim se

    Em erro GoTo ErrorHandler

    'adicione-o à barra de comando
    Definir cbMenuCommandBar = cbMenu.Controls.Add (1)
    'defina a legenda
    cbMenuCommandBar.Caption = sCaption

    Definir AddToAddInCommandBar = cbMenuCommandBar

    Função de saída
ErrorHandler:
    Saia graciosamente
Função final

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

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 bobagem, mas eu vou explicar. Ele tem o formato "Cor do código", "Primeiro plano", "Plano de fundo", Indicador ", de modo que a linha superior defina o" Texto normal "para o 14º item do combo em Primeiro plano, o 12º para segundo plano e o 1º para o indicador .

Por que eu disse que é uma solução bastante grosseira: * Ele usa SendKeys. Não há mais explicações necessárias, tenho certeza :) * O usuário precisa clicar na opção de menu / barra de ferramentas para que ela entre em vigor. * 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 no momento. Pretendo melhorá-lo no futuro, mas funciona bem para mim no estado atual (então provavelmente o deixarei!)

Talvez, com base, alguém possa expandir ainda mais.


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, deve ter o seguinte em mãos: 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 procure no VBEx.DLL a sequência de bytes criada a partir dos 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 a publicação de Tex Hex. A sequência hexadecimal da pesquisa deve se parecer com 'FFFFFF00C0C0C0008080800000000000FF000000 ...', etc. Total de 64 bytes. Substitua a sequência de bytes encontrados pelos valores RGBA de cores "personalizadas" ordenadas da mesma maneira, por exemplo, 15, 7, 8, etc. Agora, todas as cores escolhidas na VS UI serão armazenadas no registro e aplicadas após a reinicialização do aplicativo. Bem, tudo, exceto as cores "indicadoras". Eles sempre são redefinidos para os padrões. Notas:

  1. No VBE7.DLL (MSO2010), encontrei apenas uma sequência de bytes ordenados dessa maneira no deslocamento 0x15A98C.
  2. Como mencionado no post de Bond, existem várias seqüências de bytes para a primeira substituição (valores básicos de RGBA ordenados diretamente de 0 a 15). Eu mudei apenas um, o mais próximo do deslocamento da nota anterior (encontrada 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 pela pesquisa inicial.

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


2

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

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

Os índices de cores 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 CodeForeColors será algo como isto:

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

Os valores de 1 a 16 representam uma cor na tabela de cores e 0 significa 'Automático'.

No entanto, quando uma cor modificada é selecionada, o VB6 gravará um número fora do intervalo de índice no registro e o valor 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 em que o VB6 for iniciado, ele não poderá definir a cor correta para o item que foi definido como a cor modificada.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.