ฉันจะใช้สีที่กำหนดเองในโปรแกรมแก้ไข Microsoft VBA ได้อย่างไร


33

ฉันกำลังทำงานกับโครงการสองสามโครงการเพื่อใช้งานกับ Excel และ VBA ดังนั้นฉันจึงไม่มีทางเลือกนอกจากใช้โปรแกรมแก้ไข Microsoft Visual Basic ปกติแล้วฉันจะไม่รังเกียจ แต่ฉันไม่สามารถหาวิธีตั้งค่าสีที่กำหนดเองสำหรับตัวแก้ไข (ฉันสามารถเลือกจากจานสีเริ่มต้นเท่านั้น)

หากต้องการเปลี่ยนสีในขณะนี้ฉันไปที่Tools -> Options -> Editor Format... อย่างไรก็ตามตัวเลือกของคุณจะถูก จำกัด เฉพาะค่าเริ่มต้น (และขั้นพื้นฐาน) 16 สี - และเมื่อฉันพูดแบบพื้นฐานฉันหมายถึงพื้นฐานเช่นสีชมพูสีน้ำเงินสีดำสีขาว ฯลฯ ..

ไม่มีใครรู้วิธีระบุสีที่กำหนดเองหรืออย่างน้อยที่สุดเปลี่ยนสีที่ปรากฏในจานสีเริ่มต้นหรือไม่


ฉันคิดว่าสิ่งที่ Microsoft พยายามบอกกับเราคือพวกเขาไม่ต้องการให้คนเขียนโปรแกรมใน VBA หรือบางที Bill Gates ก็หนักหน่วงในผู้ผลิตยาแก้ปวด
Holene

คำตอบ:


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 ค่าอื่น ๆ จะไม่ได้รับการยอมรับและจะกลับเป็นค่าเริ่มต้นเป็นอัตโนมัติ

ฉันได้ลองหลายตัวเลือกในการป้อนค่าต่าง ๆ (เช่น 128255128, 16777215, #aaffee, 255 หรือ "170,255,238") และไม่มีตัวเลือกใดทำงานเลย

ดังนั้นฉันคิดว่ามันเป็นไปไม่ได้ที่จะกำหนดสีอื่น ๆ ในทางเทคนิค


1
ขอบคุณสำหรับคำตอบ. IIRC คุณไม่สามารถถอนรางวัลได้ แต่ถ้าคุณทำสิ่งนี้ไม่ได้จริง ๆ ฉันจะให้รางวัลกับคำตอบที่ถูกต้องที่สุด ฉันต้องการรออีกสักครู่เพื่อดูว่ามีคำตอบเพิ่มเติมอีกหรือไม่ แต่ขอบคุณสำหรับการตอบกลับของคุณ +1
พัฒนา

1
ฉันต้องยอมรับว่าเสียงที่ดียิ่งขึ้น :)
Tex Hex

"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) จาก FMS มีเครื่องมือ "VBE Color Scheme manager เพื่อดูและตั้งค่าสีสำหรับบรรณาธิการของคุณ" หากคุณดาวน์โหลดคู่มือผู้ใช้ (PDF) จะแสดงภาพหน้าจอที่ทำให้การตั้งค่าสีง่ายขึ้นยังคง จำกัด อยู่ที่จานสี 16 สี จะคิดว่าหากมีวิธีการโดยตรงในการใช้สีที่กำหนดเองพวกเขาจะรวมไว้ในเครื่องมือนี้ ดูเหมือนว่า Hex Hex นั้นถูกต้อง
Brian

เนื่องจากมันได้ถูกแสดงพร้อมกับคำตอบด้านล่างว่าเป็นไปได้คำตอบนี้ควรได้รับการแก้ไข สามารถเปลี่ยนสีใน VBA Editor ได้อย่างน่าเชื่อถือโดยใช้โปรแกรมแก้ไข HEX
สตีเวนมาร์ติ

16

ฉันสร้างแอปพลิเคชันตามข้อมูลที่พบที่นี่: https://github.com/dimitropoulos/VBECustomColors

มันเป็นการสำรองไฟล์. dll VBE6 / VBE7 และอนุญาตให้ใช้สีที่กำหนดเองโดยไม่ต้องใช้โปรแกรมแก้ไขฐานสิบหก

เอสเอส

คุณสามารถดาวน์โหลดได้ที่นี่: 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. สำรองไฟล์ VB6.EXE ของคุณในโฟลเดอร์โปรแกรม VB98 ของคุณ (ไม่บังคับ แต่แนะนำ)

  2. เปิดโปรแกรมแก้ไข hex ที่คุณชื่นชอบ (ส่งเสียงไปที่ HxD) แล้วเปิด VB6.EXE

  3. ข้ามไปยังที่อยู่ 0xE22F4 นี่คือจุดเริ่มต้นของตารางสี

คุณควรเห็นสี่ศูนย์ สิ่งนี้แสดงถึงสีดำในรูปแบบ RRGGBBAA (ไม่รองรับอัลฟาจึงเป็นรูปแบบ RRGGBB00 จริงๆเท่านั้น) สี่ไบต์ถัดไประบุสีถัดไปเป็นต้นไปจนกว่าคุณจะได้รับ FFFFFF00 (สีขาว) ซึ่งลงท้ายด้วย offset 0xE2333

  1. แก้ไขค่าสี่ไบต์ใด ๆ เหล่านี้เป็นการเลือกของคุณ เพียงใช้ค่าเลขฐานสิบหกที่เหมาะสมในรูปแบบ RGB ตามด้วยศูนย์ไบต์ ตัวอย่างเช่น RGB (64, 128, 192) จะเป็น 40 80 C0 00

  2. บันทึกการเปลี่ยนแปลงของคุณไปยัง EXE และเริ่ม VB6 คุณควรเห็นสีใหม่ของคุณในช่องที่ครอบครองโดยสี VB ในตัวก่อนหน้านี้


1
ฉันค้นหาด้วยเครื่องมือทุกอย่างในระบบที่มี office 2003 และไม่พบไฟล์ชื่อ VB6.exe หรือโฟลเดอร์ VB98 คำตอบนี้มีเฉพาะสำหรับ Office 2007 เช่นเดียวกับ OP ใช่หรือไม่ อย่างไรก็ตามเวอร์ชั่น 6.0.97.82 นั้นเก่ากว่าของฉันกับ Office 2003
nixda

1
@ nixda ไม่มีอะไรในระบบของฉัน - ฉันคิดว่า Bond อ้างถึงแอปพลิเคชัน VB6 ในระบบของเขาไม่ใช่ VBA ที่รวมเข้ากับ Excel ฉันจะดูผ่าน Excel และ VBA DLLs และดูว่าฉันสามารถหาตารางสีได้หรือไม่
ความก้าวหน้า

1
ฉันมี Office 2010 บนพีซีของฉันดังนั้นฉันจึงมี VBE7.DLL ไม่ใช่ VBE6.DLL แต่ควรเป็นกระบวนการเดียวกัน สีเหมือนกัน หากคุณดูสีตามลำดับที่แสดงควรเป็น: สีดำ = 00 00 00 00 น้ำเงิน = 00 00 80 00 สีเขียว = 00 80 00 00 เทอร์ควอย = 00 80 80 00 Magenta = 80 00 00 00 สีม่วง = 80 00 80 00 มะกอก = 80 80 00 00 แอลจีสีเทา = C0 C0 C0 00 Drk เกรย์ = 80 80 80 00 ... ฉันได้เพิ่มรหัสสีฐานสิบหกข้างกัน ดังนั้นเพียงแค่เปิด VBE6.DLL ในตัวแก้ไข hex และค้นหาสตริง hex ต่อไปนี้:
23413 พันธบัตร

1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 มันอาจเกิดขึ้นหลายครั้ง แต่ฉันพบว่าตารางสีแรกคือทั้งหมดที่ต้องแก้ไข ดูว่าเหมาะกับคุณหรือไม่
บอนด์

1
คำตอบที่ยอดเยี่ยมบอร์น สำหรับผู้อ่านในอนาคตกุญแจที่ฉันต้องเปลี่ยนคือกุญแจอันที่สอง (Office 2013, Windows 8.1) ซึ่งอยู่ที่ 12 12BB4 โดยใช้ Hex Edit (Byte หมายเลข 1,200,308)
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 ให้คุณโดยอัตโนมัติเพื่อให้การเลือกสีง่ายขึ้น ฉันสงสัยว่ามีวิธีทิ้งสคริปต์ AutoIt โดยสร้างปลั๊กอินสำหรับ VS หรือไม่

แก้ไข 2:สร้างโปรแกรมที่ช่วยให้คุณสามารถแก้ไขสีใน exe โดยไม่ต้องใช้โปรแกรมแก้ไขฐานสิบหก: VbClassicColorEditor ลิงก์นั้นจะไปยังที่เก็บข้อมูลสาธารณะบนบิตบิต


ขอบคุณสำหรับสคริปต์และผลงาน! มีโอกาสใดที่เราจะได้รับลิงก์ที่อัปเดตบน VbClassicColorEditor คนที่คุณโพสต์มี 404d ...
Andy Terra

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:ค้นหาสิ่งที่เกิดขึ้นครั้งแรกของ

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> เครื่องมือ> ตัวเลือก> รูปแบบตัวแก้ไขและตั้งค่าสีรหัส

การเปลี่ยนสตริงทั้งสองเป็นสิ่งจำเป็นเนื่องจากช่วยให้สีสามารถบันทึกได้อย่างถูกต้องเมื่อปิดเครื่องและช่วยให้ตัวแก้ไขสีเปิดได้โดยไม่ขัดข้อง

ขอขอบคุณผู้ตอบก่อนหน้าทุกคนที่สละเวลาเพื่อหาคำตอบ!


3

ฉันได้สร้างโปรแกรมที่ทำสิ่งเหล่านี้โดยอัตโนมัติใช้เวลานานเกินไปในการสร้างตัวเลือกสี ทำใน VB6 เพราะเหตุใด โปรแกรมรวบรวมและรหัสแหล่งที่มาใช้ได้ที่นี่ ทดสอบกับรุ่นของ DLL และ VB6 ของฉันเท่านั้นโปรดทำการสำรองข้อมูลก่อนที่จะเปลี่ยนแปลงสิ่งใด - สถานที่จะได้รับการแก้ไขในรหัส



นี่เป็นคำถามที่เก่ามาก แต่ฉันต้องการชั่งน้ำหนักเพื่อความสมบูรณ์

สำหรับ VS2012 สีใน VBA หรือ VB6 IDE: เปิด 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 ตอนนี้ให้เปิด 'VB6.exe' ในตัวแก้ไข Hex ของคุณและแก้ไขการเกิดขึ้นครั้งแรกของ

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 มันค่อนข้างหยาบ (และฉันจะอธิบายว่าทำไมไม่นาน) แต่มันทำงานได้ดี

ฉันสร้างโครงการ Add-In ใหม่ใน VB6 ซึ่งให้ฟอร์ม "frmAddin" เริ่มต้น (ซึ่งฉันไม่ได้ใช้) และตัวออกแบบ "เชื่อมต่อ" ฉันได้เพิ่มคลาส Color ด้วยตัวเองซึ่งมีสิ่งต่อไปนี้

ตัวเลือกที่ชัดเจน

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

ทรัพย์สินสาธารณะให้ ForeColour (ByVal iID เป็นจำนวนเต็ม)
    m_iForeColour = iID
สิ้นสุดคุณสมบัติ
ทรัพย์สินสาธารณะรับ ForeColour () เป็นจำนวนเต็ม
    ForeColour = m_iForeColour
สิ้นสุดคุณสมบัติ

คุณสมบัติสาธารณะ Let BackColour (ByVal iID As Integer)
    m_iBackColour = iID
สิ้นสุดคุณสมบัติ
คุณสมบัติสาธารณะ Get BackColour () As Integer
    BackColour = m_iBackColour
สิ้นสุดคุณสมบัติ

ทรัพย์สินสาธารณะให้ตัวบ่งชี้สี (ByVal iID เป็นจำนวนเต็ม)
    m_iIndicatorColour = iID
สิ้นสุดคุณสมบัติ
ทรัพย์สินสาธารณะรับ IndicatorColour () As Integer
    IndicatorColour = m_iIndicatorColour
สิ้นสุดคุณสมบัติ

จากนั้นฉันได้แก้ไขโค้ดในตัวออกแบบ "เชื่อมต่อ" ให้เป็นดังนี้:

ตัวเลือกที่ชัดเจน

แบบฟอร์มสาธารณะแสดงเป็นบูลีน
VBInstance สาธารณะในฐานะ VBIDE.VBE
Dim mcbMenuCommandBar เป็น Office.CommandBarControl
ติ่ม mfrmAddIn เหมือนใหม่ frmAddIn
Public WithEvents MenuHandler เป็นตัวจัดการเหตุการณ์แถบคำสั่งของ CommandBarEvents

Dim mcbToolbar เป็น Office.CommandBarControl
Public WithEvents MenuHandler2 เป็น CommandBarEvents

Dim codeColours () As Color

'************************************************* ****************************
'RunScript ย่อย
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'เรียกใช้รหัสที่ตั้งค่าสีที่ต้องการสำหรับหน้าต่างรหัสใน
'IDE ที่ใช้งานอยู่
'*** ต้องโหลดโครงการก่อนที่จะทำงานได้จริง ***
'************************************************* ****************************
Sub RunScript ()
    ReadColoursFile

    'เลือกเครื่องมือ> ตัวเลือก
    SendKeys "% ถึง", 5
    'ไปที่แท็บเลือก "ตัวเลือก"
    SendKeys "+ {TAB}"
    ปุ่มคำสั่ง "{RIGHT}"

    'เลือกกล่องรายการ
    SendKeys "{TAB}"

    ติ่มซำการตั้งค่าเป็นสี
    Dim iColour As Integer

    สำหรับ iColour = 0 ถึง 9
        SetColours iColour, codeColours (iColour)
    ถัดไป iColour

    SendKeys "~"
ส่วนท้าย

'************************************************* ****************************
'ReadColoursFile Sub
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'อ่านไฟล์สีจากดิสก์และใส่อาเรย์ของ codeColours ลงไป
'SetColour * ใช้สำหรับการเลือกสีที่ถูกต้องจาก
หน้าจอตัวเลือก
'************************************************* ****************************
Sub ReadColoursFile ()
    Dim colourLine As String
    Dim colourArray () As String
    ติ่มซำการตั้งค่าเป็นสี
    Dim oFSO As FileSystemObject

    ตั้ง oFSO = FileSystemObject ใหม่

    ถ้าไม่ใช่ oFSO.FileExists (App.Path & "\ VB6CodeColours.dat") จากนั้น
        MsgBox "ไม่พบ VB6CodeColours.dat ใน" & App.Path, vbOKOnly, "ไม่พบไฟล์การตั้งค่า VB6CodeColours!"
        ออกจากตำบล
    สิ้นสุดถ้า

    ตั้ง oFSO = ไม่มีอะไร

    เปิด App.Path & "\ VB6CodeColours.dat" สำหรับใส่เป็น # 1
    ReDim codeColours (9) เป็นสี

    ในขณะที่ไม่ใช่ EOF (1)
        Line Input # 1, colourLine
        colourArray = แยก (colourLine, ",")

        ถ้า IsNumeric (colourArray (0)) จากนั้น
            ถ้า codeColours (colourArray (0)) ไม่เป็นเช่นนั้น
                ตั้งค่า colourSetting = สีใหม่

                ถ้า 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
            สิ้นสุดถ้า
        สิ้นสุดถ้า
    Wend

    ปิด # 1

    ตั้ง colourSetting = ไม่มีอะไร
ส่วนท้าย

'************************************************* ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'เลือกรายการสีจากรายการจากนั้นทำซ้ำตัวเลือกสี
'การควบคุมที่เกี่ยวข้องกับรายการนั้นและตั้งค่าตามค่า
'ตั้งอยู่ในไฟล์ VB6CodeColours.dat
'************************************************* ****************************
ย่อย SetColours (ByVal iColour As Integer, ByRef colour การตั้งค่าเป็นสี)
    Dim iKey As Integer

    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 As Integer

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

    สำหรับ iKey = 1 ถึง iColour
        SendKeys "{DOWN}"
    ถัดไป iKey
ส่วนท้าย

'************************************************* ****************************
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'วิธีนี้จะทำงานเมื่อมีการโหลด Addin โดย IDE
'************************************************* ****************************
Private Sub AddinInstance_OnConnection (แอปพลิเคชัน ByVal เป็นวัตถุ, ByVal ConnectMode เป็น AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst เป็นวัตถุ, กำหนดเอง () เป็น Variant)
    ในข้อผิดพลาด GoTo ErrorHandler

    'บันทึกอินสแตนซ์ vb
    ตั้งค่า VBInstance = แอปพลิเคชัน

    ถ้า ConnectMode ext_cm_External แล้ว
        ตั้งค่า mcbMenuCommandBar = AddToAddInCommandBar ("การกำหนดรหัส VB6")
        'จมเหตุการณ์
        ตั้งค่า Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

        ติม oStdToolbar เป็น Office.CommandBar
        ติม oStdToolbarItem เป็น Office.CommandBarControl

        ตั้งค่า oStdToolbar = VBInstance.CommandBars ("มาตรฐาน")
        ตั้งค่า oStdToolbarItem = oStdToolbar.Controls.Add (ประเภท: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "ตั้งค่าสี IDE"
        oStdToolbarItem.BeginGroup = True
        ตั้งค่า Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    สิ้นสุดถ้า

    ออกจากตำบล
ErrorHandler:
    MsgBox Err คำอธิบาย
ส่วนท้าย

'************************************************* ****************************
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'วิธีนี้จะทำงานเมื่อมีการลบ Addin โดย IDE และล้างข้อมูลใด ๆ
อ้างอิงเป็นต้น
'************************************************* ****************************
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode เป็น AddInDesignerObjects.ext_DisconnectMode แบบกำหนดเอง () เป็น Variant)
    เมื่อเกิดข้อผิดพลาดต่อไป

    'ลบรายการแถบคำสั่ง
    mcbMenuCommandBar.Delete

    'ปิด Add-In
    ถ้า FormDisplayed แล้ว
        บันทึกการตั้งค่าแอปชื่อเรื่อง "การตั้งค่า", "DisplayOnConnect", "1"
        FormDisplayed = False
    อื่น
        บันทึกการตั้งค่าแอปชื่อเรื่อง "การตั้งค่า", "DisplayOnConnect", "0"
    สิ้นสุดถ้า

    ยกเลิกการโหลด mfrmAddIn
    ตั้ง mfrmAddIn = ไม่มีอะไร

    ตั้ง MenuHandler = ไม่มีอะไร
    ตั้ง MenuHandler2 = ไม่มีอะไร
ส่วนท้าย

'************************************************* ****************************
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'วิธีนี้จะทำงานที่จำเป็นเมื่อมีการคลิกรายการเมนู
'************************************************* ****************************
เมนูย่อย PrivateHandler_Click (ByVal CommandBarControl เป็นวัตถุจัดการเป็นบูลีน CancelDefault As บูลีน)
    runscript
ส่วนท้าย

'************************************************* ****************************
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'วิธีนี้จะทำงานที่จำเป็นเมื่อคลิกปุ่มแถบเครื่องมือ
'************************************************* ****************************
เมนูย่อย PrivateHandler2_Click (ByVal CommandBarControl เป็นวัตถุจัดการเป็นบูลีน, CancelDefault เป็นบูลีน)
    runscript
ส่วนท้าย

'************************************************* ****************************
'AddToAddInCommandBar ย่อย
'------------------------------------------------- ----------------------------
'คำอธิบาย:
'เพิ่มรายการที่ระบุในรายการเมนู
'************************************************* ****************************
ฟังก์ชัน AddToAddInCommandBar (sCaption As String) เป็น Office.CommandBarControl
    Dim cbMenuCommandBar As Office.CommandBarControl 'วัตถุแถบคำสั่ง
    Dim cbMenu เป็นวัตถุ

    เมื่อเกิดข้อผิดพลาดต่อไป

    'ดูว่าเราสามารถหาเมนูเพิ่มเติมได้หรือไม่
    ตั้งค่า cbMenu = VBInstance.CommandBars ("Add-In")
    ถ้า 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

ดูเหมือนพูดไม่ชัด แต่ฉันจะอธิบาย มันมีรูปแบบ "รหัสสี", "เบื้องหน้า", "พื้นหลัง", ตัวบ่งชี้ "ดังนั้นแถวบนสุดจะตั้งค่า" ข้อความปกติ "เป็นรายการที่ 14 ในคอมโบสำหรับ Foreground, อันดับที่ 12 สำหรับพื้นหลังและอันดับที่ 1 สำหรับตัวบ่งชี้ .

ทำไมฉันถึงบอกว่ามันเป็นคำตอบที่ค่อนข้างหยาบ: * มันใช้ SendKeys ไม่จำเป็นต้องมีคำอธิบายเพิ่มเติมที่นั่นฉันแน่ใจว่า :) * ผู้ใช้จะต้องคลิกที่เมนู / แถบเครื่องมือเพื่อให้มันมีผล * รหัสไม่ได้มีโครงสร้างที่ดีที่สุด (ในความคิดของฉัน) แต่ขึ้นอยู่กับระยะเวลาที่ฉันสามารถอุทิศให้กับมันในเวลานั้น ฉันตั้งเป้าหมายที่จะปรับปรุงมันในอนาคต แต่มันใช้ได้ดีสำหรับฉันในสถานะปัจจุบัน (ดังนั้นฉันอาจจะทิ้งมันไว้!)

บางทีด้วยพื้นฐานบางคนสามารถขยายได้อีก


2

นี่คือเคล็ดลับวิธีทำให้การเลือกสีของคุณเป็นแบบถาวร การแก้ไข hex เพิ่มเติมเล็กน้อย หากคุณได้ทำการแทนที่ด้วยการแนะนำโดยBondคุณควรมีสิ่งต่อไปนี้อยู่ในมือของคุณ: ค่า RGBA สำหรับสีพื้นฐาน (แบบคลาสสิก) 16 สีที่จัดทำดัชนีจาก 0 ถึง 15 และค่า RGBA สำหรับสีแบบกำหนดเองของคุณ ตอนนี้ค้นหา VBEx.DLL สำหรับลำดับไบต์ที่สร้างจากค่า RGBA "คลาสสิค" ที่เรียงลำดับตามดัชนีดังต่อไปนี้: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (เช่นขาว, เทา, เทาเข้ม, ดำ, แดง, แดงเข้ม, ฯลฯ ) รูปแบบที่ไม่ได้สุ่มมาจากค่าที่เก็บในรีจิสตรีดูโพสต์ของ Hex Hex. สตริงฐานสิบหกสำหรับการค้นหาควรมีลักษณะเช่น 'FFFFFF00C0C0C0008080800000000000FF000000 ... ' ฯลฯ ทั้งหมด 64 ไบต์ แทนที่ลำดับไบต์ที่พบด้วยค่า RGBA ของสี "กำหนดเอง" ที่สั่งแบบเดียวกันเช่น 15, 7, 8 เป็นต้นตอนนี้ทุกสีที่คุณเลือกใน VS UI จะถูกเก็บไว้ในรีจิสตรีและนำไปใช้หลังจากรีสตาร์ทแอปพลิเคชัน ดีทั้งหมด แต่ "ตัวบ่งชี้" สี สิ่งเหล่านี้ถูกรีเซ็ตเป็นค่าเริ่มต้นเสมอ หมายเหตุ:

  1. ใน VBE7.DLL (MSO2010) ฉันได้พบเพียงลำดับของไบต์ที่สั่งในลักษณะเช่นนี้ที่ offset 0x15A98C
  2. ดังที่กล่าวไว้ในการโพสต์ของ Bondมีจำนวนไบต์หลายลำดับสำหรับการแทนที่ครั้งแรก (ค่า RGBA พื้นฐานสั่งตรงจาก 0 ถึง 15) ฉันเปลี่ยนเพียงหนึ่งอันที่ใกล้เคียงที่สุดกับออฟเซ็ตจากบันทึกก่อนหน้า (พบได้ที่ 0x15A5AC)
  3. เหนือสิ่งอื่นใดคุณต้องแบกรับความเสี่ยงเองและอย่าลืมสำรอง

ขอบคุณTex HexและBondสำหรับการวิจัยเบื้องต้น

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.