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


33

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

現在の色を変更するには、私はに行くTools -> Options -> Editor Format...しかし、あなたの選択は唯一のデフォルト(基本)に限られている16色-と私は基本言うとき、私の平均基本など、ピンク、青、黒、白のような..

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


マイクロソフトが私たちに伝えようとしていることは、人々がVBAでプログラムすることを望まないということだと思います。あるいは、ビル・ゲイツは鎮痛剤の生産者に強いかもしれません。
ホレン

回答:


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はAUTOの色付け、11はシアン、5は赤などを示します。

試してみる:Excelを閉じ、CodeBackColorsの最初の値を5 に変更して、Excelを再起動します。コードエディタの背景が赤になります。

問題は、VBAエディターがこれらの内部値のみをサポートし、理解できる最大数が16であるということです。他の値は受け入れられず、デフォルトでAUTOに戻ります。

異なる値(128255128、16777215、#aaffee、255または "170,255,238"など)を入力するオプションをいくつか試しましたが、どれも機能しませんでした。

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


1
答えてくれてありがとう。IIRC、賞金を撤回することはできませんが、文字通りこれを行うことができない場合は、最も正しい答えをあなたに授与します。さらに回答が投稿されるかどうかを確認するためにもう少し待ちたいと思いますが、あなたの応答に感謝します、+ 1。
ブレークスルー

1
私は認めなければならない、それはさらに良く聞こえます:)
テックス16世

FMSの「Total Visual CodeTools」(fmsinc.com/vb6/CodingTools.html)には、「エディターの色を簡単に表示および設定できるVBE Color Scheme manager」というツールがあります。ユーザーマニュアル(PDF)をダウンロードすると、スクリーンショットが表示されますが、色の設定は簡単ですが、16色のパレットに制限されています。カスタムカラーを直接使用する方法があれば、このツールにそれを含めると思います。Tex Hexが正しいようです。
ブライアン

以下の回答で可能であることが示されているので、この回答を変更する必要があります。HEXエディターを使用して、VBAエディターで色を確実に変更することができます。
スティーブンマーティン

16

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

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

ss

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

楽しい

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


@gallauxを共有してくれてありがとう。好奇心からソースコードをリリースする予定はありますか?
ブレークスルー

はい、すぐにそれを少しきれいにする必要があります;)
ガロー

ギャローのおかげで、私は同じことをするつもりでしたが、VBAエディターを好きな配色にした後、「16色の目の緊張にイライラ」していなかったので、そのモチベーションを失いました!
スティーブンマーティン

1
申し訳ありませんが、これを適用するには、私は助けが必要です
ペドロミゲルピミエンタモラレス

1
@YouCrackedMeUp(github.com/dimitropoulos/VBECustomColorsに基づく)regeditを使用してレジストリキーを更新する必要があります:[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色の組み込み色を独自に変更することは可能です。ちょっとした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カラーで占められていたスロットに新しいカラーが表示されるはずです。


1
うーん、私はオフィス2003のシステム上のすべてをツールで検索しましたが、VB6.exeという名前のファイルもフォルダーVB98も見つかりません。この回答は、OPが持っているOffice 2007に対してのみですか?ただし、バージョン6.0.97.82は、Office 2003のバージョンよりも古いです。
nixda13年

1
@nixda私のシステムにも何もありません-Bondは彼のシステムのVB6アプリケーションを指していると思います。Excelに統合されたVBAではありません。Excel実行可能ファイルといくつかのVBA DLLを調べて、カラーテーブルが見つかるかどうかを確認します。
ブレークスルー

1
PCにOffice 2010があるので、VBE6.DLLではなくVBE7.DLLがありますが、同じプロセスである必要があります。色は同じです。表示されている順序で色を見ると、黒= 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 Lgtグレー= C0 C0 C0 00 Drkグレー= 80 80 80 00 ...それぞれの横に16進数のカラーコードを追加しました。以下の16進文字列のためのバイナリエディタや検索におけるだからオープンVBE6.DLL:
ボンド

1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000複数回発生する可能性がありますが、最初のカラーテーブルだけで変更が必要であることがわかりました。それがあなたのために働くかどうか見てください。
ボンド

1
素晴らしい答え、ボンド。将来の読者のために、変更に必要なキー私は六角編集(バイト番号1200308)を使用して、 `12 50B4'に位置する第2の1(オフィス2013、Windowsの8.1)、だった
アンディ・テラ

5

多くの人が指摘しているように、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の公開リポジトリに移動します。


スクリプトと貢献をありがとう!VbClassicColorEditorで更新されたリンクを取得できる可能性はありますか?あなたが掲示一つは... 404Dを持っている
アンディ・テラ

3

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

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

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

ステップ1: Hex Editorで、@にある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:検索第一ののoccuranceを

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:この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 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を開き、コードの色を設定します。

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

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


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)

あなたの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の場合、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などを変更しないように、他の回答の一部の色を並べ替えたため、コードで目的の結果が得られるはずです。これは完全にテストされていないため、常に自分の責任でプログラムを変更してください。

あなたのためにこれを行う小さなプログラムをまとめるといいでしょう(ガローがしたように)、そのプログラムを使用してレジストリとVB6 IDEに書き込むことに問題があり、プレビューウィンドウのようなものがいいでしょう。

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


2

dnissleyの応答(誰かがアドインを作成できるかどうかを尋ねるところ)から餌を取り、VB6のアドインを作成しました。それは少し粗雑です(そして、私はすぐに理由を説明します)が、それは仕事をしません。

VB6で新しいアドインプロジェクトを作成し、既定の "frmAddin"フォーム(これは使用しません)と "Connect"デザイナーを作成しました。次を含むColorクラスを自分で追加しました。

オプション明示

Dim m_iForeColour As Integer
Dim m_iBackColour As Integer
Dim m_iIndicatorColour As Integer

PublicプロパティLet ForeColour(ByVal iID As Integer)
    m_iForeColour = iID
終了プロパティ
PublicプロパティGet ForeColour()As Integer
    ForeColour = m_iForeColour
終了プロパティ

PublicプロパティLet BackColour(ByVal iID As Integer)
    m_iBackColour = iID
終了プロパティ
PublicプロパティGet BackColour()As Integer
    BackColour = m_iBackColour
終了プロパティ

PublicプロパティLet IndicatorColour(ByVal iID As Integer)
    m_iIndicatorColour = iID
終了プロパティ
Public Property Get IndicatorColour()As Integer
    IndicatorColour = m_iIndicatorColour
終了プロパティ

そして、「接続」デザイナーのコードを次のように修正しました。

オプション明示

ブールとしてパブリックFormDisplayed
VBIDE.VBEとしてのパブリックVBInstance
Dim mcbMenuCommandBar As Office.CommandBarControl
新しいfrmAddInとしてDim mfrmAddIn
Public WithEvents MenuHandler As CommandBarEvents 'コマンドバーイベントハンドラー

Dim mcbToolbar As Office.CommandBarControl
CommandBarEventsとしてのPublic WithEvents MenuHandler2

Dim codeColours()As Color

'************************************************* ****************************
'RunScript Sub
'------------------------------------------------- ----------------------------
'説明:
'でコードウィンドウに必要な色を設定するコードを実行します
'アクティブなIDE。
'***これが実際に機能する前に、プロジェクトをロードする必要があります***
'************************************************* ****************************
サブRunScript()
    ReadColoursFile

    'ツール>オプションを選択します
    SendKeys "%to"、5
    'タブに移動し、[オプション]を選択します
    SendKeys "+ {TAB}"
    SendKeys "{RIGHT}"

    'リストボックスを選択
    SendKeys "{TAB}"

    暗い色設定
    整数として薄暗いiColour

    iColour = 0〜9の場合
        SetColours iColour、codeColours(iColour)
    次のiColour

    SendKeys "〜"
サブ終了

'************************************************* ****************************
'ReadColoursFile Sub
'------------------------------------------------- ----------------------------
'説明:
'ディスクからカラーファイルを読み取り、codeColours配列に入力します。
'は、正しい色を選択するためにSetColour *メソッドによって使用されます
'オプション画面。
'************************************************* ****************************
サブReadColoursFile()
    文字列として薄暗い色
    Dim colourArray()As String
    暗い色設定
    FileSystemObjectとしてDim oFSO

    oFSO =新しいFileSystemObjectを設定します

    If Not oFSO.FileExists(App.Path& "\ VB6CodeColours.dat")その後
        MsgBox "VB6CodeColours.datが"&App.Path、vbOKOnly、 "VB6CodeColours Settings file not found!"に見つかりません! "
        サブを終了
    終了する

    oFSO =何も設定しない

    入力としてApp.Pathと「\ VB6CodeColours.dat」を開く#1
    ReDim codeColours(9)As Color

    EOF以外(1)
        ライン入力#1、colourLine
        colourArray = Split(colourLine、 "、")

        If IsNumeric(colourArray(0))Then
            codeColours(colourArray(0))が何もない場合
                colourSetting =新しい色の設定

                If IsNumeric(colourArray(1))Then
                    colourSetting.ForeColour = CInt(colourArray(1))
                終了する

                If IsNumeric(colourArray(2))Then
                    colourSetting.BackColour = CInt(colourArray(2))
                終了する

                If IsNumeric(colourArray(3))Then
                    colourSetting.IndicatorColour = CInt(colourArray(3))
                終了する

                設定codeColours(colourArray(0))= colourSetting
            終了する
        終了する
    ウェンド

    閉じる#1

    colourSetting = Nothingを設定します
サブ終了

'************************************************* ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
'説明:
'リストからカラーアイテムを選択し、カラーセレクターを繰り返します
'そのアイテムに関連付けられたコントロールは、値に従ってそれらを設定します
'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
'------------------------------------------------- ----------------------------
'説明:
'セレクターコンボの色を設定します。焦点は
'コードが実行される前の制御(最初の行のタブ
'想定される制御)。
'************************************************* ****************************
Sub SetColourSelector(ByVal iColour As Integer)
    整数としてDim iKey

    SendKeys "{TAB}"
    SendKeys "{HOME}"

    iKey = 1の場合iColourへ
        SendKeys "{DOWN}"
    次のiKey
サブ終了

'************************************************* ****************************
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
'説明:
'このメソッドは、アドインがIDEによってロードされるときに実行されます
'************************************************* ****************************
Private Sub AddinInstance_OnConnection(ByVal Application as Object、ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode、ByVal AddInInst As Object、custom()As Variant)
    エラー時GoTo ErrorHandler

    'vbインスタンスを保存します
    VBInstance =アプリケーションの設定

    If ConnectMode ext_cm_External Then
        Set mcbMenuCommandBar = AddToAddInCommandBar( "VB6 Code Colouring")
        'イベントをシンク
        Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)

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

        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)
    終了する

    サブを終了
ErrorHandler:
    MsgBox Err.Description
サブ終了

'************************************************* ****************************
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
'説明:
'このメソッドは、アドインがIDEによって削除されたときに実行され、
'参照など
'************************************************* ****************************
Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode、custom()As Variant)
    エラー時の再開

    'コマンドバーエントリを削除する
    mcbMenuCommandBar.Delete

    'アドインをシャットダウンします
    FormDisplayed Then
        SaveSetting App.Title、「Settings」、「DisplayOnConnect」、「1」
        FormDisplayed = False
    その他
        SaveSetting App.Title、「Settings」、「DisplayOnConnect」、「0」
    終了する

    mfrmAddInをアンロードします
    mfrmAddIn = Nothingを設定します

    MenuHandler = Nothingを設定します
    MenuHandler2を設定する=何もない
サブ終了

'************************************************* ****************************
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
'説明:
'このメソッドは、メニュー項目がクリックされたときに必要なタスクを実行します。
'************************************************* ****************************
プライベートサブMenuHandler_Click(ByVal CommandBarControl As Object、Booleanとして処理、CancelDefault As Boolean)
    RunScript
サブ終了

'************************************************* ****************************
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
'説明:
'このメソッドは、ツールバーボタンがクリックされたときに必要なタスクを実行します。
'************************************************* ****************************
プライベートサブMenuHandler2_Click(ByVal CommandBarControl As Object、Booleanとして処理、CancelDefault As Boolean)
    RunScript
サブ終了

'************************************************* ****************************
'AddToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
'説明:
'指定されたアイテムをメニューリストに追加します。
'************************************************* ****************************
関数AddToAddInCommandBar(sCaption As String)As Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl 'コマンドバーオブジェクト
    オブジェクトとしてDim cbMenu

    エラー時の再開

    'アドインメニューが見つかるかどうかを確認します
    cbMenu = VBInstance.CommandBars( "Add-Ins")を設定します
    cbMenuが何もない場合
        「利用できないので失敗する
        終了機能
    終了する

    エラー時GoTo 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

意味不明ですが、説明します。「Code Colour」、「Foreground」、「Background」、Indicator」という形式になっているため、一番上の行では、「Normal Text」が前景のコンボの14番目のアイテム、背景の12番目、インジケーターの1番目のアイテムに設定されます。 。

それがかなり粗雑なソリューションだと言った理由:* SendKeysを使用します。そこにそれ以上の説明は必要ありません:) *ユーザーは、メニュー/ツールバーオプションをクリックして有効にする必要があります。*コードは(私の意見では)最適な構造ではありませんが、その時点でコードに専念できる時間に基づいています。私は将来的にそれを改善することを目指していますが、現在の状態ではうまく機能します(したがって、おそらくそれを残すでしょう!)

おそらく基礎があれば、誰かがそれをさらに拡張することができます。


2

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

  1. VBE7.DLL(MSO2010)で、オフセット0x15A98Cでこのように順序付けられたバイトシーケンスが1つしか見つかりませんでした。
  2. Bondの投稿で述べたように、最初の置換用にいくつかのバイトシーケンスがあります(基本的なRGBA値は0から15までまっすぐに並べられています)。前のノート(0x15A5ACにある)からのオフセットに最も近い1つだけを変更しました。
  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を起動すると、変更された色に設定されていたアイテムに正しい色を設定できなくなります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.