Làm cách nào để sử dụng màu tùy chỉnh trong trình soạn thảo Microsoft VBA?


33

Tôi đang làm việc trên một vài dự án để làm việc bằng Excel và VBA, vì vậy tôi không có lựa chọn nào khác ngoài sử dụng trình soạn thảo Microsoft Visual Basic. Tôi thường không bận tâm, nhưng tôi không thể tìm ra cách đặt màu tùy chỉnh cho trình chỉnh sửa (tôi chỉ có thể chọn từ bảng màu mặc định).

Để thay đổi màu hiện tại, tôi đi đến Tools -> Options -> Editor Format... Tuy nhiên, các lựa chọn của bạn chỉ giới hạn ở 16 màu mặc định (và cơ bản) - và khi tôi nói cơ bản, tôi có nghĩa là cơ bản , như hồng, xanh, đen, trắng, v.v. ..

Có ai biết cách chỉ định một màu tùy chỉnh, hoặc ít nhất, thay đổi một số màu hiển thị trong bảng màu mặc định không?


Tôi nghĩ điều mà Microsoft đang cố nói với chúng tôi là họ không muốn mọi người lập trình trong VBA. Hoặc có thể Bill Gates nặng lòng với các nhà sản xuất thuốc giảm đau.
Holene

Câu trả lời:


19

VBA đọc các cài đặt cho màu từ các khóa đăng ký này:

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

Mỗi phím này chứa một danh sách các giá trị (được phân tách bằng dấu cách) cho mỗi mục bên trong Công cụ -> Tùy chọn -> Định dạng Trình chỉnh sửa. Ví dụ: giá trị đầu tiên bên trong CodeBackColors là màu nền và giá trị đầu tiên bên trong CodeForeColors là màu nền trước cho văn bản thông thường. Các giá trị là id bên trong của màu, 0 có nghĩa là màu TỰ ĐỘNG, 11 hiển thị màu lục lam, 5 màu đỏ, v.v.

Để dùng thử: Đóng Excel, thay đổi giá trị đầu tiên của CodeBackColors thành 5 và khởi động lại Excel. Nền của trình soạn thảo mã bây giờ sẽ có màu đỏ.

Vấn đề là Trình soạn thảo VBA chỉ hỗ trợ các giá trị nội bộ này và số cao nhất mà nó hiểu là 16. Mọi giá trị khác sẽ không được chấp nhận và mặc định trở lại TỰ ĐỘNG.

Tôi đã thử một số tùy chọn nhập các giá trị khác nhau (ví dụ: 128255128, 16777215, #aaffee, 255 hoặc "170.255.238") và không có tùy chọn nào hoạt động.

Vì vậy, tôi nghĩ rằng về mặt kỹ thuật không thể chỉ định các màu khác.


1
Cảm ơn câu trả lời. IIRC, bạn không thể rút tiền thưởng, nhưng nếu bạn thực sự không thể làm điều này, thì tôi sẽ trao giải thưởng cho bạn để có câu trả lời đúng nhất. Tôi muốn chờ thêm một chút để xem có câu trả lời nào nữa được đăng không, nhưng cảm ơn phản hồi của bạn, +1.
Đột phá

1
Tôi phải thừa nhận, điều đó nghe còn hay hơn :)
Tex Hex

"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) từ FMS có một công cụ "Trình quản lý lược đồ màu VBE để dễ dàng xem và đặt màu cho trình soạn thảo của bạn". Nếu bạn tải xuống hướng dẫn sử dụng (PDF), nó sẽ hiển thị các ảnh chụp màn hình mà trong khi việc đặt màu dễ dàng hơn vẫn bị giới hạn trong bảng màu 16 màu. Sẽ nghĩ rằng nếu có một cách trực tiếp để sử dụng màu tùy chỉnh thì họ sẽ đưa nó vào công cụ này. Hình như Tex Hex là chính xác.
Brian

Vì nó đã được hiển thị với các câu trả lời dưới đây rằng có thể, câu trả lời này nên được sửa đổi. Có thể thay đổi màu sắc một cách đáng tin cậy trong Trình chỉnh sửa VBA bằng trình chỉnh sửa HEX.
Steven Martin

16

Tôi đã tạo một ứng dụng dựa trên thông tin tìm thấy ở đây: https://github.com/dimitropoulos/VBECustomColors

Về cơ bản, nó sao lưu tệp VBE6 / VBE7 và cho phép sử dụng màu tùy chỉnh mà không cần phải sử dụng trình soạn thảo hex.

ss

Bạn có thể tải xuống tại đây: https://github.com/gallaux/VBEThemeColorEditor

Thưởng thức

Chỉnh sửa: Mã nguồn hiện có sẵn!


Wow cực hay, cảm ơn vì đã chia sẻ @gallaux - Tôi chắc chắn sẽ kiểm tra điều này. Bạn có kế hoạch phát hành mã nguồn ra khỏi sự tò mò?
Đột phá

Vâng tôi sẽ sớm thôi, tôi chỉ cần dọn dẹp một chút thôi;)
gallaux

Cảm ơn Gallaux, tôi đã có ý định làm điều tương tự, nhưng một khi tôi đã có trình soạn thảo vba của mình theo bảng màu tôi thích, tôi đã mất động lực đó vì tôi không còn là "căng mắt 16 màu nữa"!
Steven Martin

1
Xin lỗi, làm thế nào để áp dụng điều này, tôi cần sự giúp đỡ
Pedro Miguel Pimienta Morales

1
@YouCrackedMeUp bạn cần cập nhật khóa đăng ký bằng regedit (dựa trên github.com/dimitropoulos/VBECustomColors ): [1] Điều hướng trong regedit đến HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] đổi CodeBackColorsthành : 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] đổi CodeForeColorsthành : 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] đổi FontFacethành : Consolas.
Tigregalis

7

TeX HeX là tại chỗ. Tuy nhiên, bạn có thể thay đổi 16 màu tích hợp với màu của riêng bạn. Nó chỉ cần một chút chỉnh sửa hex. Đây là một hướng dẫn từng bước. (Lưu ý: Đây là phiên bản VB6 SP6, phiên bản tệp 6.0.97.82).

  1. Sao lưu tệp VB6.EXE trong thư mục chương trình VB98 của bạn. (Tùy chọn, nhưng được khuyến nghị).

  2. Bật trình soạn thảo hex yêu thích của bạn (hét to HxD) và mở VB6.EXE.

  3. Chuyển đến địa chỉ 0xE22F4. Đây là sự khởi đầu của bảng màu.

Bạn sẽ thấy bốn số không. Điều này thể hiện màu đen ở định dạng RRGGBBAA (alpha không được hỗ trợ nên thực sự chỉ là định dạng RRGGBB00). Bốn byte tiếp theo chỉ định màu tiếp theo và cứ thế cho đến khi bạn đến FFFFFF00 (màu trắng) kết thúc ở offset 0xE2333.

  1. Chỉnh sửa bất kỳ giá trị bốn byte nào theo lựa chọn của bạn. Chỉ cần sử dụng các giá trị hex thích hợp ở định dạng RGB, theo sau là byte không. Ví dụ: RGB (64, 128, 192) sẽ là 40 80 C0 00.

  2. Lưu các thay đổi của bạn vào EXE và kích hoạt VB6. Bạn sẽ thấy (các) màu mới của mình trong các vị trí bị chiếm bởi các màu VB tích hợp trước đó.


1
Hmm, tôi đã tìm kiếm với công cụ mọi thứ trên một hệ thống với office 2003 và nó không tìm thấy bất kỳ tệp nào có tên VB6.exe hoặc thư mục VB98. Có phải câu trả lời này chỉ dành cho Office 2007 như OP có không? Tuy nhiên, phiên bản 6.0.97.82 cũ hơn phiên bản của tôi với Office 2003.
nixda

1
@nixda Không có gì trên hệ thống của tôi cả - Tôi nghĩ Bond đang đề cập đến ứng dụng VB6 trên hệ thống của anh ấy chứ không phải VBA được tích hợp vào Excel. Tôi sẽ xem qua tệp thực thi Excel và một số DLL VBA và xem liệu tôi có thể tìm thấy bất kỳ bảng màu nào không.
Đột phá

1
Tôi có Office 2010 trên PC nên tôi có VBE7.DLL, không phải VBE6.DLL, nhưng nó phải là quá trình tương tự. Các màu sắc là như nhau. Nếu bạn nhìn vào các màu theo thứ tự chúng được hiển thị, chúng sẽ là: Đen = 00 00 00 00 Navy = 00 00 80 00 Green = 00 80 00 00 Turqoir = 00 80 80 00 Magenta = 80 00 00 00 Violet = 80 00 80 00 Olive = 80 80 00 00 Lgt Gray = C0 C0 C0 00 Drk Grey = 80 80 80 00 ... Tôi đã thêm các mã màu hex bên cạnh mỗi mã. Vì vậy, chỉ cần mở VBE6.DLL trong trình chỉnh sửa hex và tìm kiếm chuỗi hex sau:
Bond

1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Nó có thể xảy ra nhiều lần nhưng tôi thấy rằng bảng màu đầu tiên là tất cả những gì cần phải sửa đổi. Xem nếu điều đó làm việc cho bạn.
Trái phiếu

1
Câu trả lời tuyệt vời, Bond. Đối với những độc giả tương lai, khóa tôi cần thay đổi là khóa thứ hai (Office 2013, Windows 8.1), nằm ở `12 50B4 'bằng cách sử dụng Hex Edit (Byte số 1.200.308)
Andy Terra

5

Như nhiều người đã lưu ý, giải pháp của Bond (chỉnh sửa hex bảng màu trong VB6.exe) sẽ hoạt động nhưng bạn sẽ phải truy cập và đặt lại màu của mình trong hộp thoại tùy chọn mỗi khi bạn khởi động VB6. Tôi đã tạo một tập lệnh AutoIt sẽ thực hiện tất cả công việc cho bạn, chỉ cần chỉnh sửa tập lệnh đó khi cần thiết khi tất cả các lệnh gọi tới SetSyntaxColoring () được thực hiện:

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

Tôi chỉ giữ nó trên máy tính để bàn của mình và bây giờ bất cứ khi nào tôi phải mở vb6, tôi chỉ cần nhấp đúp vào nó và giống như màu cú pháp đó nằm dưới sự kiểm soát của tôi.

Chỉnh sửa 1: Tối ưu hóa tập lệnh một chút để làm cho nó chạy nhanh hơn. Tôi đang suy nghĩ về việc kết hợp một chương trình sẽ tự động chỉnh sửa VB6.EXE để bạn chọn màu dễ dàng hơn. Tôi tự hỏi liệu có cách nào để bỏ tập lệnh AutoIt bằng cách tạo một plugin cho VS không?

Chỉnh sửa 2: Tạo một tiện ích cho phép bạn chỉnh sửa các màu trong exe mà không phải sử dụng trình chỉnh sửa hex: VbClassicColorEditor . Liên kết đó đi đến kho lưu trữ công khai trên bitbucket.


Cảm ơn bạn cho kịch bản và đóng góp! Bất kỳ cơ hội nào chúng ta có thể nhận được một liên kết cập nhật trên VbClassicColorEditor? Người bạn đã đăng có 404d ...
Andy Terra

3

Tôi chỉ muốn đăng một bản tóm tắt các câu trả lời trước đó vì nó không hoàn toàn rõ ràng những gì cần phải làm để thay đổi màu sắc trong Trình soạn thảo VBA của Excel

Trong ví dụ dưới đây, tôi đang thêm bảng màu cho Solarized và tôi giả sử sử dụng Office 2010

Bước 0: Tạo bản sao lưu VBE7.dll trước khi sửa đổi nó - bạn đã được cảnh báo !!!

Bước 1: Trong Trình chỉnh sửa Hex, mở VBE7.dll nằm ở @

"C:\Program Files\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" cho 64 bit

hoặc là

"C:\Program Files( x86)\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" cho 32 bit

Bước 2: Tìm lần xuất hiện đầu tiên của

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`

và thay thế bằng

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

Bước 3: Tìm lần xuất hiện thứ 2 của điều này (đảm bảo bạn tìm kiếm từ đầu tệp)

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

và thay thế bằng

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

Bước 4: Lưu tệp dll và sau đó mở Excel> VBA Editor> Công cụ> Tùy chọn> Định dạng trình chỉnh sửa và đặt màu mã.

Thay đổi cả hai chuỗi là không cần thiết vì nó cho phép các màu lưu chính xác khi tắt máy và cho phép trình chỉnh sửa màu mở ra với sự cố excel.

Cảm ơn tất cả những người trả lời trước đã dành thời gian để tìm ra điều này!


3

Tôi đã tạo ra một chương trình tự động hóa tất cả những thứ này, dành quá nhiều thời gian cho nó, rất vui khi tạo một bộ chọn màu. Sản xuất tại VB6 vì sao không. Chương trình biên dịch và mã nguồn có sẵn ở đây . Chỉ được thử nghiệm trên các phiên bản DLL và VB6 của tôi, vui lòng tạo bản sao lưu trước khi thay đổi bất cứ điều gì - các vị trí được cố định trong mã.



Đây là một câu hỏi rất cũ nhưng tôi muốn cân nhắc cho đầy đủ

Đối với Màu VS2012 trong VBA hoặc VB6 IDE: Mở VBE6.DLL / VBE7.DLL hoặc VBA6.DLL trong

C:\Program Files (x86)\Common Files\microsoft shared\VBA\
or
C:\Program Files (x86)\VB98\ (Your VB6 install location)

với trình soạn thảo hex của bạn

Thay thế lần xuất hiện đầu tiên của

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

Với

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

Sau đó quay trở lại đầu trang và thay thế lần xuất hiện thứ hai của

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

với

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

Sau đó sửa đổi các mục sau trong sổ đăng ký

(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 '

Nếu bạn đang sửa đổi VBA, bạn đã hoàn tất, đối với VB6, bây giờ hãy mở 'VB6.exe' trong trình chỉnh sửa Hex của bạn và sửa đổi lần xuất hiện đầu tiên của

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

với

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

Điều này sửa màu được hiển thị trong giao diện của VB6 để nếu bạn muốn thực hiện các thay đổi khác cho màu bạn có thể.

Cảm ơn tất cả các câu trả lời khác, tôi đã không tự mình nghĩ ra điều này chỉ nghĩ rằng thật hữu ích khi có tất cả thông tin cần thiết trong một bài đăng (tôi không thấy sửa đổi VB6.exe và VBA6.dll cùng nhau). Sử dụng phương pháp này, bạn sẽ có thể tự do lựa chọn từ các màu có sẵn.

Tôi cũng sắp xếp lại các màu từ một số câu trả lời khác để không thay đổi vbRed, vbBlue, vbWhite, v.v. vì vậy bạn vẫn sẽ nhận được kết quả mong muốn trong mã. Điều này chưa được kiểm tra đầy đủ để luôn tự sửa đổi các chương trình có nguy cơ.

Thật tuyệt khi kết hợp một chương trình nhỏ sẽ làm điều này cho bạn (như gallaux đã làm), tôi gặp vấn đề với việc ghi vào sổ đăng ký và VB6 IDE sử dụng chương trình đó, và sắp xếp cửa sổ xem trước sẽ rất tuyệt.

Hạn chế tôi đã tìm thấy: điều này không thay đổi màu sắc của các biểu tượng chỉ báo, bạn phải tự làm điều này.


2

Lấy mồi từ câu trả lời của dnissley (nơi anh ta hỏi liệu ai đó có thể tạo bổ trợ không), tôi đã tạo một bổ trợ cho VB6. Đó là một chút thô thiển (và tôi sẽ giải thích tại sao trong thời gian ngắn), nhưng nó thực hiện công việc.

Tôi đã tạo một dự án Bổ trợ mới trong VB6, cho tôi mẫu "frmAddin" mặc định (mà tôi không sử dụng) và trình thiết kế "Kết nối". Bản thân tôi đã thêm một lớp Màu bao gồm:

Tùy chọn rõ ràng

Dim m_iForeColour là số nguyên
Dim m_iBackColour là số nguyên
Dim m_iTheicatorColour As Integer

Tài sản công cộng Hãy để PremColour (ByVal iID làm số nguyên)
    m_iForeColour = iID
Tài sản cuối
Tài sản công cộng Nhận PremColour () dưới dạng Số nguyên
    ForeColour = m_iForeColour
Tài sản cuối

Tài sản công cộng Hãy để BackColour (ByVal iID làm số nguyên)
    m_iBackColour = iID
Tài sản cuối
Tài sản công cộng Nhận BackColour () dưới dạng Số nguyên
    BackColour = m_iBackColour
Tài sản cuối

Tài sản công cộng Hãy để IndicatorColour (ByVal iID làm số nguyên)
    m_iTheicatorColour = iID
Tài sản cuối
Tài sản công cộng Nhận IndicatorColour () dưới dạng Số nguyên
    IndicatorColour = m_iTheicatorColour
Tài sản cuối

Và sau đó tôi đã sửa đổi mã trong Trình thiết kế "Kết nối" như sau:

Tùy chọn rõ ràng

Mẫu công khai Hiển thị như Boolean
VBInstance như VBIDE.VBE
Dim mcbMothyCommandBar As Office.CommandBarControl
Dim mfrmAddIn Như frmAddIn mới
Public WithEvents MenuHandler Là trình xử lý sự kiện thanh lệnh của CommandBarEvents

Dim mcbToolbar Là Office.CommandBarControl
Công khai với các MenuHandler2 dưới dạng CommandBarEvents

Mã DimColours () là màu

'****** / TÌM HIỂU ****** / TÌM KIẾM
'RunScript Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Chạy mã đặt các màu cần thiết cho cửa sổ mã trong
'IDE hoạt động.
'*** MỘT DỰ ÁN PHẢI ĐƯỢC LO LẮNG TRƯỚC KHI NÀY HOẠT ĐỘNG HOẠT ĐỘNG ***
'****** / TÌM HIỂU ****** / TÌM KIẾM
Run Run ()
    ReadColoursFile

    'Chọn Công cụ> Tùy chọn
    SendKeys "% đến", 5
    'Chuyển đến tab, chọn "Tùy chọn"
    Khóa gửi "+ {TAB}"
    SendKeys "{RIGHT}"

    'Chọn hộp danh sách
    Khóa gửi "{TAB}"

    Dim colourSding As Color
    Dim iColour là số nguyên

    Đối với iColour = 0 đến 9
        SetColours iColour, codeColours (iColour)
    Tiếp theo iColour

    Khóa gửi "~"
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'SubColoursFile Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Đọc tệp màu từ đĩa và điền vào mảng codeColours
'được sử dụng bởi các phương thức SetColour * để chọn màu chính xác từ
'màn hình tùy chọn.
'****** / TÌM HIỂU ****** / TÌM KIẾM
Sub ReadColoursFile ()
    Dim colourLine As String
    Dim colourArray () dưới dạng Chuỗi
    Dim colourSding As Color
    Dim oFSO là FileSystemObject

    Đặt oFSO = FileSystemObject mới

    Nếu không phải oFSO.FileExists (App.Path & "\ VB6CodeColours.dat") thì
        MsgBox "Không tìm thấy VB6CodeColours.dat trong" & App.Path, vbOKOnly, "Không tìm thấy tệp Cài đặt VB6CodeColours!"
        Thoát Sub
    Kết thúc nếu

    Đặt oFSO = Không có gì

    Mở App.Path & "\ VB6CodeColours.dat" cho đầu vào là số 1
    Mã ReDimColours (9) Là màu

    Trong khi không phải EOF (1)
        Dòng đầu vào số 1, colourLine
        colourArray = Tách (colourLine, ",")

        Nếu IsNumeric (colourArray (0)) thì
            Nếu codeColours (colourArray (0)) là gì thì
                Đặt colourSetting = Màu mới

                Nếu IsNumeric (colourArray (1)) thì
                    colourSetting.ForeColour = CInt (colourArray (1))
                Kết thúc nếu

                Nếu IsNumeric (colourArray (2)) thì
                    colourSetting.BackColour = CInt (colourArray (2))
                Kết thúc nếu

                Nếu IsNumeric (colourArray (3)) thì
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                Kết thúc nếu

                Đặt mãColours (colourArray (0)) = colourSding
            Kết thúc nếu
        Kết thúc nếu
    xoay về

    Đóng số 1

    Đặt colourSetting = Không có gì
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'SetColours Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Chọn mục màu từ danh sách và sau đó lặp lại bộ chọn màu
'điều khiển được liên kết với mục đó và đặt chúng theo các giá trị
'được đặt trong tệp VB6CodeColours.dat.
'****** / TÌM HIỂU ****** / TÌM KIẾM
Sub SetColours (ByVal iColour As Integer, ByRef colourSding As Color)
    Dim iKey là số nguyên

    SendKeys "{HOME}"

    Dành cho iKey = 1 đến iColour
        Phím gửi "{DOWN}"
    IKey tiếp theo

    SetColourSelector colourSetting.ForeColour
    SetColourSelector colourSetting.BackColour
    SetColourSelector colourSetting.TheicatorColour

    Khóa gửi "+ {TAB}"
    Khóa gửi "+ {TAB}"
    Khóa gửi "+ {TAB}"
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'SetColourSelector Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Đặt màu trong bộ chọn. Giả sử trọng tâm là
'kiểm soát tiến hành trước khi mã được chạy (các tab dòng đầu tiên đến
'kiểm soát giả định).
'****** / TÌM HIỂU ****** / TÌM KIẾM
Sub SetColourSelector (ByVal iColour As Integer)
    Dim iKey là số nguyên

    Khóa gửi "{TAB}"
    SendKeys "{HOME}"

    Dành cho iKey = 1 đến iColour
        Phím gửi "{DOWN}"
    IKey tiếp theo
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Phương thức này chạy khi addin được IDE tải
'****** / TÌM HIỂU ****** / TÌM KIẾM
Private Sub AddinInstance_OnConnection (Ứng dụng ByVal là đối tượng, ByVal ConnectMode là AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom () As Variant)
    Khi gặp lỗi GoTo ErrorHandler

    'lưu ví dụ vb
    Đặt VBInstance = Ứng dụng

    Nếu ConnectMode ext_cm_External thì
        Đặt mcbMothyCommandBar = AddToAddInCommandBar ("Tô màu mã VB6")
        'nhấn chìm sự kiện
        Đặt Me.MothyHandler = VBInstance.Events.CommandBarEvents (mcbMothyCommandBar)

        Dim oStdToolbar Là Office.CommandBar
        Dim oStdToolbarItem Là Office.CommandBarControl

        Đặt oStdToolbar = VBInstance.CommandBars ("Tiêu chuẩn")
        Đặt oStdToolbarItem = oStdToolbar.Controls.Add (Loại: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Đặt màu IDE"
        oStdToolbarItem.Begingroup = True
        Đặt Me.MothyHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    Kết thúc nếu

    Thoát Sub
ErrorHandler:
    MsgBox Err. Mô tả
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Phương thức này chạy khi addin bị IDE loại bỏ và dọn sạch mọi
'tài liệu tham khảo, vv
'****** / TÌM HIỂU ****** / TÌM KIẾM
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom () As Variant)
    Khi xảy ra lỗi Tiếp tục

    'xóa mục nhập thanh lệnh
    mcbMothyCommandBar.Delete

    'tắt bổ trợ
    Nếu FormDisplayed thì
        Lưu cài đặt ứng dụng.Title, "Cài đặt", "DisplayOnConnect", "1"
        FormDisplayed = Sai
    Khác
        Lưu cài đặt ứng dụng.Title, "Cài đặt", "DisplayOnConnect", "0"
    Kết thúc nếu

    Dỡ bỏ mfrmAddIn
    Đặt mfrmAddIn = Không có gì

    Đặt MenuHandler = Không có gì
    Đặt MenuHandler2 = Không có gì
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'MenuHandler_Click Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Phương pháp này thực hiện các tác vụ cần thiết khi nhấp vào mục menu.
'****** / TÌM HIỂU ****** / TÌM KIẾM
Menu phụ riêng tưHandler_Click (ByVal CommandBarControl As Object, được xử lý dưới dạng Boolean, CancDefault As Boolean)
    Chạy script
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'MenuHandler2_Click Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Phương pháp này thực hiện các tác vụ cần thiết khi nhấp vào nút thanh công cụ.
'****** / TÌM HIỂU ****** / TÌM KIẾM
Menu phụ riêng tưHandler2_Click (ByVal CommandBarControl As Object, được xử lý dưới dạng Boolean, CancDefault As Boolean)
    Chạy script
Kết thúc phụ

'****** / TÌM HIỂU ****** / TÌM KIẾM
'AddToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
' SỰ MIÊU TẢ:
'Thêm mục được chỉ định vào danh sách menu.
'****** / TÌM HIỂU ****** / TÌM KIẾM
Hàm AddToAddInCommandBar (sCaption As String) As Office.CommandBarControl
    Dim cbMothyCommandBar As Office.CommandBarControl 'đối tượng thanh lệnh
    Dim cbMothy làm đối tượng

    Khi xảy ra lỗi Tiếp tục

    'xem chúng ta có thể tìm thấy menu Bổ trợ không
    Đặt cbMothy = VBInstance.CommandBars ("Bổ trợ")
    Nếu cbMothy không là gì thì
        'không có sẵn nên chúng tôi thất bại
        Chức năng thoát
    Kết thúc nếu

    Khi gặp lỗi GoTo ErrorHandler

    'thêm nó vào thanh lệnh
    Đặt cbMothyCommandBar = cbMothy.Controls.Add (1)
    'đặt chú thích
    cbMothyCommandBar.Caption = sCaption

    Đặt AddToAddInCommandBar = cbMothyCommandBar

    Chức năng thoát
ErrorHandler:
    'Thoát một cách duyên dáng
Chức năng kết thúc

Mã này cho phép ứng dụng đọc các màu tôi muốn từ một tệp nằm trong cùng thư mục với tệp ZIP (được gọi là VB6CodeColours.dat). Tệp này chứa các mục sau (và nó sẽ thay đổi dựa trên màu nào bạn thay thế trong VB6.EXE để sao chép và dán thẳng có thể sẽ không hoạt động.

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

Trông có vẻ vô nghĩa, nhưng tôi sẽ giải thích. Nó có định dạng "Màu mã", "Tiền cảnh", "Nền", Chỉ báo ", vì vậy hàng trên cùng sẽ đặt" Văn bản bình thường "thành mục thứ 14 trong kết hợp cho Tiền cảnh, 12 cho Nền và thứ 1 cho Chỉ báo .

Tại sao tôi nói đó là một giải pháp khá thô thiển: * Nó sử dụng SendKeys. Tôi không có lời giải thích nào thêm nữa. Tôi chắc chắn :) * Người dùng phải nhấp vào tùy chọn menu / thanh công cụ để nó có hiệu lực. * Mã không có cấu trúc tốt nhất (theo ý kiến ​​của tôi) nhưng dựa trên lượng thời gian tôi có thể dành cho nó vào thời điểm đó. Tôi đặt mục tiêu cải thiện nó trong tương lai, nhưng nó hoạt động tốt với tôi trong tình trạng hiện tại (vì vậy tôi có thể sẽ rời bỏ nó!)

Có lẽ với một cơ sở, ai đó có thể mở rộng về nó hơn nữa.


2

Đây là mẹo làm thế nào để giữ cho lựa chọn màu của bạn vĩnh viễn. Chỉnh sửa hex hơn một chút. Nếu bạn thực hiện thay thế được đề xuất bởi Bond, bạn nên có sẵn các giá trị sau: Các giá trị RGBA cho 16 màu cơ bản (cổ điển) được lập chỉ mục từ 0 đến 15 và các giá trị RGBA cho các màu tùy chỉnh của bạn được lập chỉ mục theo cùng một cách. Bây giờ hãy tìm kiếm VBEx.DLL cho chuỗi byte được xây dựng từ các giá trị RGBA "cổ điển" được sắp xếp theo thứ tự các chỉ mục sau: 15, 7, 8, 0, 12, 4, 14, 6, 10, 2, 11, 3, 9, 1 , 13, 5 (tức là trắng, xám, xám đen, đen, đỏ, đỏ sẫm, v.v.). Mẫu không ngẫu nhiên, nó xuất phát từ các giá trị, được lưu trữ trong sổ đăng ký, xem bài đăng của Tex Hex. Chuỗi hex cho tìm kiếm sẽ trông giống như 'FFFFFF00C0C0C0008080800000000000FF000000 ...', v.v., tổng cộng 64 byte. Thay thế chuỗi byte được tìm thấy bằng các giá trị RGBA của các màu "tùy chỉnh" được sắp xếp theo cùng một cách, ví dụ 15, 7, 8, v.v. Bây giờ, tất cả các màu bạn chọn trong VS UI sẽ được lưu trữ trong sổ đăng ký và được áp dụng sau khi khởi động lại ứng dụng. Vâng, tất cả, nhưng màu sắc "chỉ số". Chúng luôn được đặt lại về mặc định. Ghi chú:

  1. Trong VBE7.DLL (MSO2010) tôi chỉ tìm thấy một chuỗi byte được sắp xếp theo cách đó ở offset 0x15A98C.
  2. Như đã đề cập trong bài đăng của Bond, có một vài chuỗi byte cho lần thay thế đầu tiên (các giá trị RGBA cơ bản được sắp xếp trực tiếp từ 0 đến 15). Tôi chỉ thay đổi một, gần nhất với phần bù từ ghi chú trước (tìm thấy tại 0x15A5AC).
  3. Tất cả ở trên bạn đang làm nguy cơ của riêng bạn :) Và đừng quên sao lưu.

Cảm ơn Tex HexBond cho nghiên cứu ban đầu.

CẬP NHẬT: Đã thử nghiệm với MSO2007 (VBE6.DLL) và MSO2013 (VBE7.DLL). Làm việc như một cơ duyên.


2

Giải pháp của Bond (chỉnh sửa bảng màu trong VB6.exe) hoạt động hoàn hảo để sửa đổi bảng màu trong IDE VB6. Tuy nhiên, tôi thấy rằng khi một màu được sửa đổi được chọn và VB6 bị tắt, VB6 không thể lưu đúng màu đã sửa đổi vào sổ đăng ký.

Thông thường, VB6 sẽ ghi một chỉ mục vào bảng màu 16 giá trị cho mỗi mục văn bản có thể thay đổi màu của nó.

Các chỉ số màu được ghi vào sổ đăng ký ở đây:

HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic\CodeForeColors
HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic\CodeBackColors

Ví dụ: giá trị CodeForeColors sẽ trông giống như thế này:

6 14 5 0 1 3 13 4 15 0 0 0 0 0 0 0

Các giá trị từ 1 đến 16 đại diện cho một màu trong bảng màu và 0 có nghĩa là 'Tự động'.

Tuy nhiên, khi màu được sửa đổi được chọn, VB6 sẽ ghi một số nằm ngoài phạm vi chỉ mục vào sổ đăng ký và giá trị CodeForeColors sẽ trông giống như sau:

5245006 14 5 0 1 3 13 4 15 0 0 0 0 0 0 0

Lần tiếp theo VB6 được khởi động, nó sẽ không thể đặt màu chính xác cho mục đã được đặt thành màu đã sửa đổi.

Tôi vẫn đang cố gắng tìm ra một giải pháp nhưng muốn đăng những gì tôi tìm thấy cho đến nay.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.