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

Bre*_*ugh 37 microsoft-office vba text-editors microsoft-excel-2007

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

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

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

Tex*_*Hex 22

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”),但都没有奏效。

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


gal*_*aux 20

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

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

SS

您可以在此处下载:https : //github.com/gallaux/VBEThemeColorEditor

享受

编辑:源代码现在可用!

  • @YouCrackedMeUp,您需要使用 regedit 更新注册表项(基于 https://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`。 (2认同)

小智 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 颜色占用的插槽中看到您的新颜色。


Dyl*_*ley 6

正如许多人所指出的,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
Run Code Online (Sandbox Code Playgroud)

我只是把它放在我的桌面上,现在每当我必须打开 vb6 时,我只需双击它,就像语法着色在我的控制之下一样。

编辑 1:稍微优化脚本以使其运行得更快。我正在考虑组合一个程序,该程序将自动为您编辑 VB6.EXE,使颜色选择更容易。我想知道是否有办法通过为 VS 创建插件来抛弃 AutoIt 脚本?

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