web-dev-qa-db-ja.com

Microsoft VBAエディターでカスタムカラーを使用するにはどうすればよいですか?

私はExcelとVBAを使用するいくつかのプロジェクトに取り組んでいるので、Microsoft Visual Basicエディターを使用せざるを得ません。通常は気にしませんが、エディターのカスタム色を設定する方法がわかりません(デフォルトのパレットからしか選択できません)。

現在色を変更するには、Tools -> Options -> Editor Format...ただし、選択できるのはデフォルト(および基本)16色のみです。基本と言うとき、ピンク、青、黒、白などのbasicを意味します。 ..

カスタム色を指定する方法、または少なくとも、デフォルトのパレットに表示される色の一部を変更する方法を知っている人はいますか?

34
Breakthrough

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」など)を試しましたが、どれも機能しませんでした。

したがって、他の色を割り当てることは技術的に不可能だと思います。

20
Tex Hex

ここにある情報に基づいてアプリケーションを作成しました: https://github.com/dimitropoulos/VBECustomColors

基本的にVBE6/VBE7 .dllファイルをバックアップし、16進エディターを使用せずにカスタムカラーを使用できます。

ss

ここからダウンロードできます: https://github.com/gallaux/VBEThemeColorEditor

楽しい

編集:ソースコードが利用可能になりました!

16
gallaux

TeX HeXが注目されています。ただし、IS 16の組み込み色を独自の色に変更することができます。16進の編集が少し必要です。ステップごとのガイドを示します。(注:これはVB6 SP6、ファイルバージョン6.0.97.82)。

  1. VB98プログラムフォルダー内のVB6.EXEファイルをバックアップします。 (オプション、ただし推奨)。

  2. お気に入りの16進エディタ(HxDに向かって叫ぶ)を起動し、VB6.EXEを開きます。

  3. アドレス0xE22F4にジャンプします。これがカラーテーブルの始まりです。

4つのゼロが表示されます。これはRRGGBBAA形式で黒を表します(アルファはサポートされていないため、実際にはRRGGBB00形式です)。次の4バイトは次の色を指定し、オフセット0xE2333で終わるFFFFFF00(白)に到達するまで続きます。

  1. これらの4バイト値のいずれかを選択して編集します。 RGB形式で適切な16進数値を使用し、その後にゼロバイトを続けます。たとえば、RGB(64、128、192)は40 80 C0 00になります。

  2. 変更をEXEに保存し、VB6を起動します。組み込みのVB色で以前占有されていたスロットに新しい色が表示されます。

7
Bond

多くの人が指摘したように、Bondのソリューション(VB6.exeの色テーブルを16進編集)は機能しますが、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:16進エディターを使用せずにexeの色を編集できるユーティリティを作成: VbClassicColorEditor 。そのリンクは、bitbucketのパブリックリポジトリに移動します。

5
Dylan Nissley

以前の回答の要約を投稿したかったのは、Excel VBAエディターで色を変更するために何をする必要があるかが完全に明確ではないためです。

以下の例では、 Solarized の配色を追加しています。Office2010の使用を想定しています。

ステップ0:変更する前にVBE7.dllのバックアップを作成します-警告されました!!!

ステップ1:16進エディタで、@にある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: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 Editor> Tools> Options> Editor Formatを開き、コードの色を設定します。

両方の文字列を変更すると、シャットダウン時に色が正しく保存され、Excelがクラッシュすることなくカラーエディターを開くことができるため、必要です。

これを理解するために時間を割いてくれた以前のすべての回答者に感謝します!

3
Steven Martin

私は、これらすべてを自動化するプログラムを作成しました。そのために非常に長い時間を費やし、カラーピッカーを作成するのを楽しんでいました。 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)

あなたの16進エディタで

の最初の出現を置き換える

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

次に、先頭に戻って、2回目の出現箇所を置き換えます

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の場合は、16進数エディターで '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そのプログラムの使用、およびソートプレビューウィンドウのいいです。

私が見つけた制限:これはインジケーターアイコンの色を変更しません。これは自分で行う必要があります。

3
Sam

ここでは、色の選択を永続的に維持する方法を説明します。もう少し16進編集。 Bond で置き換えを提案した場合、次のものが手元にあるはずです。基本(クラシック)16色のRGBA値は0から15までインデックスされ、カスタム色のRGBA値は同じ方法でインデックスされます。次に、VBEx.DLLを検索して、次のインデックスの順序で並べられた「クラシック」RGBA値から構築されたバイトシーケンスを探します:15、7、8、0、12、4、14、6、10、2、11、3、9、1 、13、5(つまり、白、灰色、濃い灰色、黒、赤、濃い赤など)。パターンはランダムではなく、レジストリに保存された値から導出されます。 Tex Hexの投稿 を参照してください。検索用の16進文字列は「FFFFFF00C0C0C0008080800000000000FF000000 ...」のように表示される必要があります。合計64バイトです。見つかったバイトシーケンスを、同じ方法で並べられた「カスタム」カラーのRGBA値で置き換えます。 15、7、8など。これで、VS UIで選択したすべての色がレジストリに保存され、アプリケーションの再起動後に適用されます。まあ、すべて、「指標」の色を除いて。これらは常にデフォルトにリセットされます。ノート:

  1. VBE7.DLL(MSO2010)で、オフセット0x15A98Cでこのように順序付けされたバイトシーケンスが1つだけ見つかりました。
  2. Bond's postで述べたように、最初の置換のために数バイトのシーケンスがあります(基本的なRGBA値は0から15までまっすぐに並べられています)。前のノート(0x15A5ACにあります)からのオフセットに最も近い1つだけを変更しました。
  3. 上記のすべてはあなた自身の責任で行っています:)そして、バックアップすることを忘れないでください。

Tex HexBond に感謝します。

UPD:MSO2007(VBE6.DLL)およびMSO2013(VBE7.DLL)でテスト済み。魅力のように働きます。

2
dias

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を起動すると、変更された色に設定されていたアイテムに正しい色を設定できなくなります。

私はまだ解決策を見つけようとしていますが、これまでに見つけたものを投稿したいと思っています。

2
ravanbak