VBA的“罪與罰”:一柄生銹的辦公自動化巨斧
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
導(dǎo)讀 VBA的核心問題在于它是一個(gè)被時(shí)代鎖定的技術(shù)。微軟早已明確表示不會對其做重大更新(最新的Office 365中VBA依然存在且重要)。其設(shè)計(jì)理念、語法和功能都深深地刻著上世紀(jì)90年代的烙印。 從cobol到C++,從shell到awk,從jsp到j(luò)ava,從vb到vba以及python,通過筆者親測,相對而言只有vba對非IT人員來說學(xué)習(xí)成本更較低,難度曲線更緩,確實(shí)是編程愛好者的入門首選,尤其是它基于office生態(tài),具有龐大的用戶群體和生命力,這也是同時(shí)代的語言均日漸沒落,而vba依然運(yùn)行在大大小小的寫字間的唯一原因。 雖然它是一柄生銹的辦公自動化巨斧,但一時(shí)半會還不會被完全替代。 今天就自揭傷疤,細(xì)數(shù)一下vba的諸多短板。也供即將入坑vba的編程愛好者參考。 我想從語法、編輯器、窗體、調(diào)試、運(yùn)行環(huán)境等幾個(gè)方面講起。 1. 語法與語言特性:過時(shí)的語言設(shè)計(jì),冗長且啰嗦 VBA支持“基于對象”而不是真正的“面向?qū)ο蟆?。它缺乏繼承、多態(tài)、構(gòu)造函數(shù)等核心OOP特性。只能用接口模擬部分功能,非常笨拙。 雖然有Option Explicit強(qiáng)制聲明變量,但類型系統(tǒng)依然松散。Variant類型雖然強(qiáng)大,但濫用會導(dǎo)致性能問題和難以發(fā)現(xiàn)的錯(cuò)誤。 On Error GoTo是全局錯(cuò)誤處理機(jī)制,與現(xiàn)代語言的try-catch-finally結(jié)構(gòu)相比,顯得非常原始和容易出錯(cuò),容易導(dǎo)致代碼流程混亂。 沒有l(wèi)ambda表達(dá)式、LINQ(或類似的集成查詢)、泛型集合(Dictionary是后來加入的,非原生)等,處理數(shù)據(jù)集合時(shí)代碼冗長。 需要大量使用Set關(guān)鍵字來設(shè)置對象變量。 調(diào)用API或復(fù)雜對象時(shí),代碼行會非常長,且缺少好的鏈?zhǔn)秸{(diào)用支持。 必須寫End If, End Sub, Wend等結(jié)束語句,不如使用{}的語言簡潔。 2. 編輯器:功能簡陋,界面和用戶體驗(yàn)差,穩(wěn)定性讓人抓狂。 VBE是VBA開發(fā)者最常用的環(huán)境,但其用戶體驗(yàn)遠(yuǎn)遠(yuǎn)落后于現(xiàn)代IDE(如VS Code, Visual Studio, JetBrains系列)。 代碼提示速度慢、準(zhǔn)確性差,經(jīng)常失效,遠(yuǎn)不如現(xiàn)代IDE智能。 沒有“重命名變量/方法”(一旦重命名,所有地方都要手動改)、提取方法、自動導(dǎo)入等基本重構(gòu)功能,代碼維護(hù)成本極高,重構(gòu)功能幾乎為零。 查找所有引用、在過程間跳轉(zhuǎn)等功能笨拙,對于大型項(xiàng)目非常不友好,代碼導(dǎo)航困難。 幾乎不能更換字體主題、配色方案(永遠(yuǎn)的藍(lán)底白字/黑字),對開發(fā)者不友好。(有第三方插件可以支持了,但也僅限配色字體等) 縮進(jìn)和格式化規(guī)則簡單,且容易出錯(cuò)。 模塊、類模塊、用戶窗體都以一種扁平化的列表展示,缺乏文件夾分層管理,大型項(xiàng)目會變得一團(tuán)糟。 全局搜索的效率和展示結(jié)果的方式都很原始。 VBE本身有時(shí)會莫名其妙地崩潰,尤其是在調(diào)試或編輯大型模塊時(shí)。 偶爾會遇到VBA項(xiàng)目(.vba項(xiàng)目文件)莫名其妙損壞的情況,導(dǎo)致無法打開或代碼丟失,令人吐血。 3. 窗體 (UserForm):控件庫陳舊,布局功能孱弱,事件模型匱乏 VBA的窗體控件庫是其最大的軟肋之一,幾乎與現(xiàn)代UI設(shè)計(jì)脫節(jié)。 控件風(fēng)格是古老的Windows 95風(fēng)格,無法自動適配現(xiàn)代Windows系統(tǒng)的視覺風(fēng)格(如扁平化設(shè)計(jì))。 缺乏大量現(xiàn)代控件,如樹形列表視圖(TreeView)、帶狀工具欄(Ribbon)、高級網(wǎng)格(DataGridView)等都需要通過引入外部控件(如MSCOMCTL.OCX)來實(shí)現(xiàn),而這又會帶來新的部署和兼容性問題。 沒有錨定 和??抗δ?。當(dāng)窗體大小改變時(shí),控件無法自動調(diào)整大小和位置,必須編寫復(fù)雜的Resize事件代碼手動計(jì)算,極其不便且容易出錯(cuò)。 控件支持的事件很少,例如很多控件沒有MouseEnter、MouseLeave等常見事件,需要靠API模擬,增加了復(fù)雜度。 4. 調(diào)試與錯(cuò)誤排查:錯(cuò)誤信息模糊,調(diào)試功能有限,缺乏高級調(diào)試工具 雖然VBA提供了基本的調(diào)試功能(斷點(diǎn)、單步執(zhí)行、即時(shí)窗口、監(jiān)視窗口),但整體依然落后。 運(yùn)行時(shí)錯(cuò)誤提示常常很籠統(tǒng)(例如著名的“錯(cuò)誤 1004”),需要大量經(jīng)驗(yàn)才能快速定位問題根源,對新手極不友好。 即時(shí)窗口功能有限,無法執(zhí)行多行代碼或復(fù)雜查詢。 缺乏高級調(diào)試工具,如性能分析器(Profiler)、內(nèi)存查看器、多線程調(diào)試(VBA本身是單線程的)等。 當(dāng)程序崩潰時(shí),VBE經(jīng)常會重置模塊狀態(tài),導(dǎo)致所有變量值丟失,難以分析崩潰瞬間的狀態(tài)。 5. 運(yùn)行環(huán)境與部署:安全性差,跨平臺和跨版本兼容性差,部署和分發(fā)困難 宏病毒的歷史遺留問題導(dǎo)致Office對VBA默認(rèn)不信任,每次打開帶有宏的文件都會出現(xiàn)巨大的安全警告,用戶體驗(yàn)很差。需要用戶手動調(diào)整信任中心設(shè)置或進(jìn)行數(shù)字簽名,增加了部署難度。 VBA基本上被綁定在Windows平臺的桌面版Office上。Mac Office上的VBA功能是殘缺不全的(例如缺少某些API和控件支持)。 不同Office版本(如Office 2016 vs Office 365)之間的VBA也可能存在細(xì)微差別,可能導(dǎo)致兼容性問題。 完全無法在Office Web版 或 移動版 上運(yùn)行。 對于執(zhí)行大量計(jì)算或復(fù)雜操作的場景,VBA的性能遠(yuǎn)不如原生的C++或現(xiàn)代的.NET語言。特別是頻繁操作Excel單元格區(qū)域(Range)時(shí),如果寫法不當(dāng),性能會急劇下降。 分發(fā)VBA項(xiàng)目通常意味著分發(fā)整個(gè)Excel、Word文檔(如.xlsm),代碼和數(shù)據(jù)耦合在一起。 更新代碼需要重新分發(fā)整個(gè)文件,版本管理很麻煩。 無法方便地引用和管理第三方庫,依賴管理原始。 vba的問題還有很多,大多是歷史遺留的,VBA的核心問題在于它是一個(gè)被時(shí)代鎖定的技術(shù)。微軟早已明確表示不會對其做重大更新(最新的Office 365中VBA依然存在且重要)。其設(shè)計(jì)理念、語法和功能都深深地刻著上世紀(jì)90年代的烙印。 總之,VBA是一個(gè)在特定歷史時(shí)期取得了巨大成功的“領(lǐng)域特定語言”,其核心價(jià)值在于與Office應(yīng)用程序的深度、無縫集成。對于簡單的辦公自動化、快速原型制作和小工具開發(fā),它依然無可替代。 所以,現(xiàn)在就去祭奠它還為時(shí)尚早。 閱讀原文:原文鏈接 該文章在 2025/8/28 15:25:08 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |