如何在Microsoft VBA编辑器中使用自定义颜色?


33

我正在使用Excel和VBA处理一些项目,因此除了使用Microsoft Visual Basic编辑器外别无选择。我通常不介意,但是我不知道如何为编辑器设置自定义颜色(我只能从默认调色板中选择)。

要更改当前的颜色,我转到Tools -> Options -> Editor Format...。但是,您的选择仅限于默认(和基本)16种颜色-当我说基本时,我的意思是基本,例如粉红色,蓝色,黑色,白色等。 ..

有谁知道如何指定自定义颜色,或者至少更改默认调色板中显示的某些颜色?


我认为Microsoft试图告诉我们的是,他们不希望人们使用VBA进行编程。也许比尔·盖茨(Bill Gates)成为止痛药的生产商。
Holene

Answers:


19

VBA从以下注册表项中读取颜色的设置:

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

这些键中的每个键都包含“工具”->“选项”->“编辑器格式”中每个条目的值列表(以空格分隔)。例如,CodeBackColors内部的第一个值是背景色,而CodeForeColors内部的第一个值是普通文本的前景色。值是颜色的内部ID,0表示自动着色,11表示青色,5表示红色等。

尝试一下:关闭Excel,将CodeBackColors的第一个值更改为5,然后重新启动Excel。现在,代码编辑器的背景将变为红色。

问题在于,VBA编辑器仅支持这些内部值,并且可以理解的最大数字为16。其他任何值都将不被接受,并且默认返回到AUTO。

我尝试了几种输入不同值的选项(例如128255128、16777215,#aaffee,255或“ 170,255,238”),但它们都不起作用。

因此,我认为在技术上不可能分配其他颜色。


1
感谢您的回答。IIRC,您不能撤消赏金,但是如果您真的不能做到这一点,那么我将向您提供最正确的答案。我想再等一下,看看是否发布了更多答案,但谢谢您的回复+1。
突破

1
我必须承认,这听起来更好:)
Tex Hex

FMS的“ Total Visual CodeTools”(fmsinc.com/vb6/CodingTools.html)提供了一个工具“ VBE配色方案管理器,可轻松查看和设置编辑器的颜色”。如果下载了用户手册(PDF),则会显示屏幕截图,尽管可以更轻松地设置颜色,但仍仅限于16种调色板。会认为,如果有直接使用自定义颜色的方法,他们会把它包含在此工具中。看起来Tex Hex是正确的。
布莱恩(Brian)

如下面的答案所示,有可能,此答案应进行修改。可以使用HEX编辑器在VBA编辑器中可靠地更改颜色。
史蒂文·马丁

16

我根据此处找到的信息创建了一个应用程序:https : //github.com/dimitropoulos/VBECustomColors

它基本上备份了VBE6 / VBE7 .dll文件,并允许使用自定义颜色,而无需使用十六进制编辑器。

ss

您可以在这里下载:https : //github.com/gallaux/VBEThemeColorEditor

请享用

编辑:源代码现已可用!


哇,太酷了,谢谢分享@gallaux-我一定会检查的。您是否打算出于好奇而发布源代码?
突破

是的,我会很快的,我只需要稍微清理一下;)
gallaux

谢谢Gallaux,我一直想做同样的事情,但是一旦我让我的vba编辑器适应了我喜欢的配色方案,我就失去了动力,因为我不再因为“ 16色眼疲劳”而烦恼了!
史蒂文·马丁

1
抱歉,如何应用此方法,我需要帮助
Pedro Miguel Pimienta Morales

1
@YouCrackedMeUp您需要使用regedit(基于github.com/dimitropoulos/VBECustomColors)更新注册表项:[1]导航至regedit HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common。[2]更改CodeBackColors为:2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0。[3]更改CodeForeColors为:13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0。[4]更改FontFace为:Consolas
Tigregalis

7

TeX HeX已被发现。但是,可以自行更改16种内置颜色。它只需要一点十六进制编辑。这是逐步指南。(注意:这适用于VB6 SP6,文件版本6.0.97.82)。

  1. 备份您的VB98程序文件夹中的VB6.EXE文件。(可选,但建议)。

  2. 启动您最喜欢的十六进制编辑器(喊出到HxD)并打开VB6.EXE。

  3. 跳转至地址0xE22F4。这是颜色表的开始。

您应该看到四个零。这代表RRGGBBAA格式的黑色(不支持alpha,因此实际上只是RRGGBB00格式)。接下来的四个字节指定下一个颜色,依此类推,直到获得以偏移量0xE2333结尾的FFFFFF00(白色)。

  1. 编辑这些四个字节的值中的任何一个供您选择。只需使用RGB格式的适当十六进制值,然后使用零字节即可。例如,RGB(64,128,192)将为40 80 C0 00。

  2. 将所做的更改保存到EXE并启动VB6。您应该在以前由内置VB颜色占用的插槽中看到新颜色。


1
嗯,我用该工具搜索了Office 2003系统上的所有内容,但找不到名为VB6.exe的文件或文件夹VB98。这个答案是否仅适用于OP一样的Office 2007?然而,版本6.0.97.82比我年长与Office 2003
nixda

1
@nixda我的系统上也没有任何内容-我认为Bond是指他系统上的VB6应用程序,而不是集成到Excel中的VBA。我将通过Excel可执行文件和一些VBA DLL进行浏览,看看是否可以找到任何颜色表。
突破

1
我的PC上有Office 2010,所以我有VBE7.DLL,而不是VBE6.DLL,但是它应该是相同的过程。颜色是相同的。如果按显示顺序查看颜色,则它们应为:黑色= 00 00 00 00海军= 00 00 80 00绿色= 00 80 00 00 Turqoise = 00 80 80 00洋红色= 80 00 00 00紫= 80 00 80 00 Olive = 80 80 00 00 Lgt Gray = C0 C0 C0 00 Drk Gray = 80 80 80 00 ...我在每一个旁边添加了十六进制颜色代码。因此,只需在十六进制编辑器中打开VBE6.DLL,然后搜索以下十六进制字符串即可:
Bond

1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000它可能发生多次,但是我发现第一个颜色表就是所有需要修改的表。看看是否适合您。
邦德债券

1
真棒的答案,邦德。对于未来的读者,我需要更改的键是第二个键(Office 2013,Windows 8.1),使用十六进制编辑(字节号1,200,308)位于“ 12 50B4”
Andy Terra

5

正如许多人所指出的那样,Bond的解决方案(在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,以使颜色选择更加容易。我想知道是否有办法通过为VS创建插件来放弃AutoIt脚本?

编辑2:创建了一个实用程序,使您无需使用十六进制编辑器VbClassicColorEditor即可在exe中编辑颜色。该链接将转到bitbucket上的公共存储库。


感谢您的脚本和贡献!我们有机会在VbClassicColorEditor上获得更新的链接吗?您发布的邮件有404d ...
Andy Terra

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步:找到的第一次出现

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:找到这种情况的第二次出现(确保从文件顶部开始搜索)

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崩溃。

感谢所有以前的回答者花时间解决这个问题!


3

我创建了一个程序来自动化所有这些,花了太长时间,在创建拾色器方面很有趣。在VB6中制作,因为为什么不这样做。此处提供了已编译的程序和源代码。仅在我的DLL和VB6版本上进行了测试,请在进行任何更改之前先进行备份-代码中的位置已固定。



这是一个非常老的问题,但是我想为完整性考虑一下

对于VBA或VB6 IDE中的VS2012颜色:在以下位置打开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,现在在Hex编辑器中打开“ 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等,因此您仍然应该在代码中获得所需的结果。这尚未经过全面测试,因此修改程序的风险自负。

组装一个可以为您完成此任务的小程序会很好(就像Gallaux一样),我在使用该程序写入注册表和VB6 IDE时遇到了问题,并且预览窗口会很不错。

我发现的局限性:这不会改变指示器图标的颜色,您必须自己进行操作。


2

从dnissley的响应中诱饵(他问有人是否可以添加一个插件),我为VB6添加了一个插件。这有点粗糙(稍后我将解释原因),但确实可以完成工作。

我在VB6中创建了一个新的外接程序项目,该项目为我提供了默认的“ frmAddin”表单(我不使用)和“连接”设计器。我自己添加了一个Color类,其中包含以下内容:

显式期权

昏暗的m_iForeColour作为整数
昏暗的m_iBackColour作为整数
昏暗的m_iIndicatorColour As Integer

公共属性Let ForeColour(ByVal iID为整数)
    m_iForeColour = iID
最终财产
公共属性获取ForeColour()为整数
    ForeColour = m_iForeColour
最终财产

公共属性Let BackColour(ByVal iID为整数)
    m_iBackColour = iID
最终财产
公共属性获取BackColour()为整数
    BackColour = m_iBackColour
最终财产

公共属性让IndicatorColour(ByVal iID作为整数)
    m_iIndicatorColour = iID
最终财产
公共属性以整数获取IndicatorColour()
    IndicatorColour = m_iIndicatorColour
最终财产

然后,我将“连接”设计器中的代码修改如下:

显式期权

公共表单显示为布尔值
公开VBInstance为VBIDE.VBE
昏暗mcbMenuCommandBar作为Office.CommandBarControl
Dim mfrmAddIn作为新的frmAddIn
公共WithEvents MenuHandler As CommandBarEvents'命令栏事件处理程序

Dim mcbToolbar如Office.CommandBarControl
公共WithEvents MenuHandler2作为CommandBarEvents

暗淡的codeColours()作为颜色

'***************************************************** ****************************
'RunScript子
'------------------------------------------------- ----------------------------
描述:
'运行在代码窗口中设置代码窗口所需颜色的代码
活动的IDE。
'***必须先加载项目,然后才能正常工作***
'***************************************************** ****************************
子RunScript()
    ReadColoursFile

    '选择工具>选项
    SendKeys“%to”,5
    '转到标签,选择“选项”
    SendKeys“ + {TAB}”
    SendKeys“ {RIGHT}”

    '选择列表框
    SendKeys“ {TAB}”

    昏暗的颜色设置为颜色
    Dim iColour作为整数

    对于iColour = 0到9
        SetColours iColour,codeColours(iColour)
    下一个iColour

    SendKeys“〜”
结束子

'***************************************************** ****************************
'ReadColoursFile子
'------------------------------------------------- ----------------------------
描述:
'从磁盘读取颜色文件并填充codeColours数组
由SetColour *方法使用'从中选择正确的颜色
在选项屏幕上。
'***************************************************** ****************************
子ReadColoursFile()
    暗色colourLine作为字符串
    昏暗colourArray()作为字符串
    昏暗的颜色设置为颜色
    DiFoFSO作为FileSystemObject

    设置oFSO = New FileSystemObject

    如果不是oFSO.FileExists(App.Path&“ \ VB6CodeColours.dat”)然后
        MsgBox“在&&App.Path,vbOKOnly中找不到” VB6CodeColours.dat“,”找不到VB6CodeColours设置文件!“
        退出子
    万一

    设置oFSO =否

    打开App.Path和“ \ VB6CodeColours.dat”作为输入为#1
    ReDim codeColours(9)作为颜色

    虽然不是EOF(1)
        线输入1,色线
        colourArray = Split(colourLine,“,”)

        如果IsNumeric(colourArray(0))然后
            如果codeColours(colourArray(0))无效
                设置颜色设置=新颜色

                如果IsNumeric(colourArray(1))然后
                    colourSetting.ForeColour = CInt(colourArray(1))
                万一

                如果IsNumeric(colourArray(2))然后
                    colourSetting.BackColour = CInt(colourArray(2))
                万一

                如果是IsNumeric(colourArray(3)),则
                    colourSetting.IndicatorColour = CInt(colourArray(3))
                万一

                设置codeColours(colourArray(0))= colourSetting
            万一
        万一
    温德

    关闭#1

    设置颜色Setting = Nothing
结束子

'***************************************************** ****************************
SetColours子
'------------------------------------------------- ----------------------------
描述:
'从列表中选择颜色项目,然后迭代颜色选择器
'与该项目关联的控件,并根据值进行设置
在VB6CodeColours.dat文件中设置。
'***************************************************** ****************************
Sub SetColours(ByVal iColour为整数,ByRef colourSetting为颜色)
    Dim iKey作为整数

    SendKeys“ {HOME}”

    对于iKey = 1至iColour
        SendKeys“ {DOWN}”
    下一个iKey

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

    SendKeys“ + {TAB}”
    SendKeys“ + {TAB}”
    SendKeys“ + {TAB}”
结束子

'***************************************************** ****************************
'SetColourSelector子
'------------------------------------------------- ----------------------------
描述:
'在选择器组合中设置颜色。假设重点是
'在运行代码之前先进行控制(
'承担控制权)。
'***************************************************** ****************************
Sub SetColourSelector(ByVal iColour As Integer)
    Dim iKey作为整数

    SendKeys“ {TAB}”
    SendKeys“ {HOME}”

    对于iKey = 1至iColour
        SendKeys“ {DOWN}”
    下一个iKey
结束子

'***************************************************** ****************************
'AddinInstance_OnConnection子
'------------------------------------------------- ----------------------------
描述:
'该方法在IDE加载插件时运行
'***************************************************** ****************************
Private Sub AddinInstance_OnConnection(ByVal应用程序作为对象,ByVal ConnectMode作为AddInDesignerObjects.ext_ConnectMode,ByVal AddInInst作为对象,custom()作为变体)
    在错误转到To ErrorHandler

    '保存vb实例
    设置VBInstance =应用

    如果使用ConnectMode ext_cm_External然后
        设置mcbMenuCommandBar = AddToAddInCommandBar(“ VB6代码颜色”)
        '认为事件
        设置Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)

        Dim oStdToolbar作为Office.CommandBar
        将oStdToolbarItem设置为Office.CommandBarControl

        设置oStdToolbar = VBInstance.CommandBars(“ Standard”)
        设置oStdToolbarItem = oStdToolbar.Controls.Add(Type:= msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption =“设置IDE颜色”
        oStdToolbarItem.BeginGroup = True
        设置Me.MenuHandler2 = VBInstance.Events.CommandBarEvents(oStdToolbarItem)
    万一

    退出子
ErrorHandler:
    MsgBox错误说明
结束子

'***************************************************** ****************************
'AddinInstance_OnDisconnection子
'------------------------------------------------- ----------------------------
描述:
'当IDE删除插件并清理所有插件时,此方法将运行
'参考等
'***************************************************** ****************************
私人子AddinInstance_OnDisconnection(ByVal RemoveMode为AddInDesignerObjects.ext_DisconnectMode,custom()为变体)
    关于错误继续

    '删除命令栏条目
    mcbMenuCommandBar.Delete

    '关闭加载项
    如果FormDisplayed然后
        SaveSetting App.Title,“设置”,“ DisplayOnConnect”,“ 1”
        FormDisplayed =假
    其他
        SaveSetting App.Title,“设置”,“ DisplayOnConnect”,“ 0”
    万一

    卸载mfrmAddIn
    设置mfrmAddIn = Nothing

    设置MenuHandler = Nothing
    设置MenuHandler2 =无
结束子

'***************************************************** ****************************
'MenuHandler_Click子
'------------------------------------------------- ----------------------------
描述:
'该方法执行单击菜单项时所需的任务。
'***************************************************** ****************************
私有子MenuHandler_Click(ByVal CommandBarControl作为对象,作为布尔处理,CancelDefault作为布尔)
    运行脚本
结束子

'***************************************************** ****************************
'MenuHandler2_Click子
'------------------------------------------------- ----------------------------
描述:
'单击工具栏按钮时,此方法执行所需的任务。
'***************************************************** ****************************
私有子MenuHandler2_Click(ByVal CommandBarControl作为对象,作为布尔处理,CancelDefault作为布尔)
    运行脚本
结束子

'***************************************************** ****************************
'AddToAddInCommandBar子
'------------------------------------------------- ----------------------------
描述:
'将指定的项目添加到菜单列表。
'***************************************************** ****************************
函数AddToAddInCommandBar(sCaption As String)作为Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl'命令栏对象
    昏暗的cbMenu作为对象

    关于错误继续

    '看看是否可以找到“加载项”菜单
    设置cbMenu = VBInstance.CommandBars(“外接程序”)
    如果cbMenu什么都没有,那么
        '不可用,所以我们失败了
        退出功能
    万一

    在错误转到To ErrorHandler

    '将其添加到命令栏
    设置cbMenuCommandBar = cbMenu.Controls.Add(1)
    '设置标题
    cbMenuCommandBar.Caption = sCaption

    设置AddToAddInCommandBar = cbMenuCommandBar

    退出功能
ErrorHandler:
    '优雅地退出
结束功能

此代码允许应用程序从与.dll位于同一目录(称为VB6CodeColours.dat)的文件中读取所需的颜色。该文件包含以下内容(并且会根据您在VB6.EXE中替换的颜色而有所不同,因此直接复制和粘贴可能无法正常工作。

0,14,12,0
1,0,0,0
2,16,13,0
3,0,15,15
4,16,5,5
5,7,12,0
6,11,12,0
7,8,12,0
8,16,10,10
9,16,3,3

看起来很乱,但我会解释。它的格式为“代码颜色”,“前景”,“背景”,“指示符”,因此第一行将“普通文本”设置为“前景”组合中的第14个项目,将“背景”设置为12,将“指标”设置为第1。 。

为什么我说这是一个非常粗糙的解决方案:*它使用SendKeys。我敢肯定,这里不需要进一步的解释:) *用户必须单击菜单/工具栏选项才能使其生效。*该代码的结构不是最好的(我认为),但是基于我当时可以投入的时间。我的目标是将来进行改进,但是在当前状态下对我来说效果很好(所以我可能会放弃!)

也许有基础,有人可以在此基础上进一步扩展。


2

这是保持颜色选择永久性的技巧。更多十六进制编辑。如果您进行了邦德建议的更换,则手边应该有以下几点:16种基本(经典)颜色的RGBA值从0到15进行索引,而自定义颜色的RGBA值以相同的方式进行索引。现在,在VBEx.DLL中搜索从“经典” RGBA值构建的字节序列,这些“ RGB”值按以下索引顺序排序: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. 正如Bond的帖子中提到的,有几个字节序列需要进行第一次替换(基本RGBA值从0到15直接排序)。我只更改了一个,最接近上一个音符的偏移量(位于0x15A5AC)。
  3. 以上所有操作均需您自担风险:)并且不要忘记备份。

感谢Tex HexBond的初步研究。

UPD:已通过MSO2007(VBE6.DLL)和MSO2013(VBE7.DLL)进行测试。像魅力一样工作。


2

Bond的解决方案(在VB6.exe中编辑颜色表)非常适合在VB6 IDE中修改颜色表。但是,我发现,当选择一种修改的颜色并关闭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时,将无法为已设置为修改后的颜色的项目设置正确的颜色。

我仍在尝试找出解决方案,但想发布到目前为止找到的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.