定了!VBE2021開源
一、序言
VBE2021為開源工程,使用者可在源工程代碼基礎(chǔ)上,修改、完善、擴(kuò)展。
有參與完善的作者,插件最終發(fā)布會(huì)以作者名單形式列出。參與者可申請(qǐng)權(quán)限,修改本文檔。
開源文件及QQ群228441848。
若要借鑒代碼做自己的VBE插件,需備注以下文字。技術(shù)支持:燈 ,微信:285538335
二、工程文件說(shuō)明
整體思路及調(diào)試
新建dll動(dòng)態(tài)鏈接庫(kù)工程,利用IDTExtensibility2接口,實(shí)現(xiàn)對(duì)VBE的二次開發(fā)。
打開工程調(diào)試,需要注冊(cè)dll(詳見本文檔2.4.1內(nèi)容),并且啟用外部Excel或者其他程序。
2.1 窗體部分
2.1.1 CodeFrom.vb
主要功能:
展示自定義代碼庫(kù)路徑下的代碼庫(kù)文件。代碼庫(kù)以txt形式存儲(chǔ),窗體加載過(guò)程,自動(dòng)讀入TreeView控件。
用戶可在窗體上操作TreeView控件,來(lái)修改、擴(kuò)充自己的代碼庫(kù)。
可直接將代碼插入到當(dāng)前的VBE代碼編輯界面。
2.1.2 CodeList.vb
窗體對(duì)應(yīng)于:智能提示功能
主要功能:
用戶輸入空格之后,利用鍵盤鉤子,調(diào)取CodeList窗體。窗體加載過(guò)程中,對(duì)用戶當(dāng)前行的數(shù)據(jù)進(jìn)行模糊查詢,滿足條件的寫入ListBox。
左側(cè)是Listbox,右側(cè)是RichTextBox控件,用來(lái)展示詳細(xì)內(nèi)容。
CodeList窗體讀取的代碼來(lái)自于,安裝路徑下的CodeList.xlsx。
bug需解決:
窗體彈出之后,按方向鍵無(wú)法實(shí)現(xiàn),listbox的上下選取。只能光標(biāo)滑動(dòng)選取。
無(wú)法利用快捷鍵實(shí)現(xiàn)開關(guān)智能提示功能
2.1.3 IniForm.vb
主要功能:
展示配置信息選項(xiàng),配置信息存儲(chǔ)在代碼安裝路徑下的配置.ini。
2.1.4 author.vb
主要功能:
展示作者信息,后續(xù)參與者的信息也會(huì)再此展示。
2.1.5 UpdateForm.vb
主要功能:
展示qq群信息,目前只能實(shí)現(xiàn)手動(dòng)去qq群下載軟件,后期想實(shí)現(xiàn)在線下載更新。
2.2 模塊部分
2.2.1 Varaint.vb
存儲(chǔ)各類變量、常量、API函數(shù)
2.2.2 IndentCode.vb和RebuildModuleCode.vb
代碼美化縮進(jìn)的核心代碼。
2.2.3 Connect.vb
利用IDTExtensibility2接口,實(shí)現(xiàn)VBE菜單的加載。頂部菜單、按鈕、右鍵菜單等等代碼均在此。
接口的實(shí)現(xiàn)方式以及菜單的添加,參考網(wǎng)址:
https://www.mztools.com/articles/2012/MZ2012013.aspx
https://www.mztools.com/articles/2012/MZ2012015.aspx
其中,_myToolBarButton_Click點(diǎn)擊事件是所有的點(diǎn)擊觸發(fā)的事件。
2.3 添加引用部分
2.3.1 Ude
識(shí)別txt編碼形式,解決讀取txt內(nèi)容亂碼問(wèn)題。
2.3.2 VBE相關(guān)
引用VBE相關(guān)類庫(kù),實(shí)現(xiàn)VBE對(duì)象的操作。
2.4 打包注冊(cè)部分
實(shí)現(xiàn)插件的加載有2步:①注冊(cè)dll;②導(dǎo)入VBE加載項(xiàng)的注冊(cè)表。
注冊(cè)dll是利用RegAsm.exe去注冊(cè)。
2.4.1 手動(dòng)注冊(cè)方式
如果是手動(dòng)加載和卸載插件,需要手動(dòng)運(yùn)行下面的文件,并且是管理員身份運(yùn)行。
兩個(gè)文件:RegAsm.bat和RegAddIn.reg
RegAsm.bat
@ECHO OFFset dll="VBE2021.dll"%SystemRoot%"\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" /codebase %~dp0\%dll%%SystemRoot%"\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /codebase %~dp0\%dll%exit
RegAddIn.reg
Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\VBE2021.Connect]"FriendlyName"="VBE2021""Description"="VBE2021""LoadBehavior"=dword:00000003"CommandLineSafe"=dword:00000000[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins64\VBE2021.Connect]"FriendlyName"="VBE2021""Description"="VBE2021""LoadBehavior"=dword:00000003"CommandLineSafe"=dword:00000000
2.4.2 手動(dòng)卸載方式
兩個(gè)文件:RegAsm.bat和RegAddIn.reg
UnRegAsm.bat
@ECHO OFFset dll="VBE2021.dll"%SystemRoot%"\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" /codebase %~dp0\%dll% /u%SystemRoot%"\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /codebase %~dp0\%dll% /uPAUSECLS
RegAddIn.reg
Windows Registry Editor Version 5.00[-HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\VBE2021.Connect][-HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins64\VBE2021.Connect]
2.4.3 Innosetup打包直接注冊(cè)和卸載
innosetup可實(shí)現(xiàn)注冊(cè)表的寫入和dll的直接注冊(cè)。
源代碼如下:
#define MyAppName "VBE2021"#define MyAppVerName "VBE2021"[Setup]AppName={#MyAppName}AppVerName={#MyAppVerName}//版本號(hào)AppVersion=1.3VersionInfoProductName=VBE2021DefaultDirName= "d:\VBE2021"//禁止用戶選擇安裝路徑DisableDirPage=noDisableProgramGroupPage=yesDefaultGroupName=VBE2021OutputDir=.SetupIconFile=B.icoOutputBaseFilename=VBE2021WindowShowCaption=noDisableWelcomePage=no//PrivilegesRequired=adminArchitecturesInstallIn64BitMode = x64 ia64//控制面板卸載界面圖標(biāo)UninstallDisplayIcon= {app}\B.ico//發(fā)布者名稱AppPublisher=作者:燈[code]procedure InitializeWizard();beginWizardForm.LICENSEACCEPTEDRADIO.Checked:=true;end;[Messages]SetupWindowTitle=VBE2021 安裝向?qū)?/span>ClickNext=為確保本軟件能一次安裝成功,請(qǐng)盡可能先關(guān)閉360或者電腦管家、金山毒霸之類,然后再安裝本軟件。%n%n%n%n請(qǐng)確保安裝路徑不能有空格??!%n%n請(qǐng)確保安裝路徑不能有空格?。?n%n請(qǐng)確保安裝路徑不能有空格?。?/span>[Languages]Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"[Icons]Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"[Files]Source: "C:\Users\WangYa\Desktop\VBE2021\VBE2021\bin\Debug\Code\*.*"; DestDir: "{app}\Code"; Flags: recursesubdirsSource: "C:\Users\WangYa\Desktop\VBE2021\VBE2021\bin\Debug\Data\*.*"; DestDir: "{app}\Data"; Flags: recursesubdirsSource: "C:\Users\WangYa\Desktop\VBE2021\VBE2021\bin\Debug\VBE2021.dll"; DestDir: "{app}"; Flags: ignoreversionSource: "C:\Users\WangYa\Desktop\VBE2021\VBE2021\bin\Debug\B.ico"; DestDir: "{app}"; Flags: ignoreversionSource: "C:\Users\WangYa\Desktop\VBE2021\VBE2021\bin\Debug\Ude.dll"; DestDir: "{app}"; Flags: ignoreversionSource: "C:\Users\WangYa\Desktop\VBE2021\VBE2021\bin\Debug\RegAsm.bat"; DestDir: "{app}"; Flags: ignoreversion[Registry]Root: HKCU; Subkey: "Software\Microsoft\VBA\VBE\6.0\Addins\VBE2021.Connect"; ValueType: string; ValueName: "FriendlyName"; ValueData: "VBE2021"Root: HKCU; Subkey: "Software\Microsoft\VBA\VBE\6.0\Addins\VBE2021.Connect"; ValueType: string; ValueName: "Description"; ValueData: "VBE2021"Root: HKCU; Subkey: "Software\Microsoft\VBA\VBE\6.0\Addins\VBE2021.Connect"; ValueType: dword; ValueName: "LoadBehavior"; ValueData: 3Root: HKCU; Subkey: "Software\Microsoft\VBA\VBE\6.0\Addins64\VBE2021.Connect"; ValueType: string; ValueName: "FriendlyName"; ValueData: "VBE2021"Root: HKCU; Subkey: "Software\Microsoft\VBA\VBE\6.0\Addins64\VBE2021.Connect"; ValueType: string; ValueName: "Description"; ValueData: "VBE2021"Root: HKCU; Subkey: "Software\Microsoft\VBA\VBE\6.0\Addins64\VBE2021.Connect"; ValueType: dword; ValueName: "LoadBehavior"; ValueData: 3[Code]//此代碼的功能:在出現(xiàn)安裝界面之前彈出一個(gè)提示框,告之用戶一些必要的信息function InitializeSetup(): Boolean;beginLog('InitializeSetup called');Result := trueend;//此代碼的功能:卸載插件時(shí)清除注冊(cè)表痕跡procedure CurUninstallStepChanged (CurUninstallStep: TUninstallStep );beginRegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'Software\Microsoft\VBA\VBE\6.0\Addins\VBE2021.Connect');RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'Software\Microsoft\VBA\VBE\6.0\Addins64\VBE2021.Connect');end;[RUN]//Filename: "{dotnet40}\RegAsm.exe"; Parameters: /codebase VBE2021.dll; WorkingDir: {app}; StatusMsg: "正在注冊(cè)..."; Flags: skipifsilent shellexec runminimized waituntilterminated//Filename: {app}\RegAsm.bat; Description: "BAT"; Flags: skipifsilent shellexec runhidden nowait postinstallFilename: "{app}\RegAsm.bat"; WorkingDir: "{app}\"; StatusMsg: "正在安裝注冊(cè)組件..."; Parameters: {app}; Flags: skipifsilent shellexec runminimized waituntilterminated
但是dll的直接注冊(cè)我一直沒成功,所以目前打包的時(shí)候把RegAsm.bat也打包進(jìn)去了,安裝插件的時(shí)候,直接運(yùn)行RegAsm.bat實(shí)現(xiàn)間接注冊(cè)。
三、插件使用說(shuō)明
3.1 安裝
3.2 代碼輔助錄入
3.1.1 菜單錄入代碼
3.1.2智能提示錄入代碼
輸入完部分關(guān)鍵字,按空格鍵。即可彈出智能提示。
智能提示可在配置中進(jìn)行關(guān)閉。
3.3 代碼美化縮進(jìn)
3.4 代碼庫(kù)存儲(chǔ)修改

VBA微信交流群已經(jīng)到⑤群,需要交流VBA或者函數(shù)的朋友可掃碼,邀請(qǐng)你進(jìn)群。

= 推薦閱讀 =
Excel提取Word | Word VBA教程,來(lái)了! | 拆分Excel | VBA代碼解釋器 | PDF快速轉(zhuǎn)Word | 用VSTO做插件,其實(shí)很簡(jiǎn)單
