Excel 的 VBA 現在還算是辦公利器嗎?

非計算機專業學生,但是有少量數據處理任務,對計算機也有興趣,本打算學VBA,但是有計算機專業的告知用處不大,不如直接學習更強大的Python等腳本,由此兩個疑問:1. VBA是否已過氣而不值得新人去學習了?2. Python等是否能方便高效地去處理、分析Excel的統計數據呢?謝答。


先說結論,VBA依舊是辦公利器。以我的個人經歷而言,在BCG做過三年諮詢顧問,寫了上萬行的VBA程序,每個項目一千至幾千行程序不等。最後將Excel用成了中控界面,類似EMACS,在Excel可以隨意操控全公司的印表機、Word、Powerpoint等等,自動完成各種任務以及數據更新和抓取。依靠VBA,在效率上是一般同事的數倍甚至是高一個量級,你說VBA還是不是辦公利器?

不過題主得到的反饋也正常,許多高級程序員確實瞧不上VBA。因為程序員是有鄙視鏈的:彙編 &>C &>C++ &>Python &>Java及C#及PHP(這三者相互撕) &>VB &>HTML。在這長長的鄙視鏈中,甚至都沒有VBA的位置。

但是Office+VBA是圖靈完備的,所以被程序員用來耍酷的各類性感語言能實現的大部分功能,VBA都能實現,而且往往是以更高效更快捷的方式,在這裡不談效率和優雅。較之Python等常用語言,VBA各有攻防各有優缺點。Python的優勢當然是擴展性強、超越Office環境之後的適用性強、資源豐富以及效率高,而VBA的優點如下:

  • 環境不依賴,只需要打開裝機自帶的Office,然後按下Alt+F11就自動進入編程和執行環境
  • 上手簡單,學習曲線很平緩,甚至可以更簡單的通過錄製宏來解決寫程序的問題,只需要在簡單的代碼基礎上修修補補就可以執行,參考Excel VBA 如何快速學習? - 何明科的回答
  • 與辦公環境完美兼容,在Excel/Word/Powerpoint/Outlook/Access之間隨便穿梭,比膠水語言還要簡單易用
  • 分享性和移植性很強,幾乎所有測試通過的程序放到別的機器上也可輕易執行(如果不考慮各種本地文件位置)

基於以上的優劣勢對比,VBA仍然是當之無愧的辦公利器之王。而且大家不用太在乎手中的工具(VBA還是Python或者其他),核心還是使用工具的人以及人的思考。

下面列舉Office+VBA實現的若干功能,真正為職場人士省時省事省力。大部分內容在回答(Excel 到底有多厲害? - 何明科的回答)中已經出現過。不願意點擊過去閱讀的,直接看下面的克隆內容。

1、批量修改格式
下圖是利用Powerpoint中錄製的宏再加上稍微修改的代碼(甚至都稱不上是改代碼,大部分是改參數),將Powerpoint中所有的字體及字型大小進行統一修改。常做PPT而且需要根據老闆的喜好改來改去的同學們,知道這個批處理功能有多麼救命。

2、批量完成列印
剛進職場的新人,只要爸爸不是李剛,基本都做過影帝影后(影=印,各種複印列印的體力勞動)。特別是諮詢投行服務行業,在大忽悠會議之前之後,花數小時或者整晚來列印數個文件,並不是天方夜譚。而且這件事情是對著同樣一堆不斷修改的文件,會經常不斷重複發生。

我寫的第一個VBA程序就是完成對100多張Excel表格的自動列印,因為是第一個VBA程序,所以比較挫,基本上是宏錄製之後來改的,沒有使用參考書及搜索引擎,全靠F1和自動提示,所以貼出來特別紀念一下。但也讓大家清楚VBA上手也多麼容易。實現的功能就是將每周都要做一次的100多張表格的按順序列印讓機器自動做一遍,而且需要防卡紙:按下一個「妞」,就慢慢美妙結果的發生。

後來這個程序的升級版是:調度多台印表機,進一步提高效率,以及將印表機卡紙造成隊列錯誤的概率降到極小的範圍內。

3、製作炫目視覺效果(圖表、動畫及油畫)
圖表製作是每個Office一族的必備任務,製得一手好表格,絕對是升職加薪和偷懶放風的利器。在回答(黃燜雞米飯是怎麼火起來的? - 何明科的回答),就利用Excel+VBA做出數張炫酷的信息地圖,利用VBA為每個省的圖形塗色。

(塗色部分來自於網上的一段程序,製作GIF動畫的是自己完成的)

同時,為了進一步增強炫酷結果,還利用VBA將這些連續變化的圖表做成了GIF動畫。

另外還可以利用Excel,把心儀妹子的圖片拿到手,然後用Excel化成點陣圖並進行油畫效果的處理,然後送給她撩一撩。

4、撰寫八股文
這是幫朋友實現的一個項目,他們實驗室是研究某類事故並對重大事故進行鑒定,最後發布word版的正式報告。之前的工作流程是在專業的軟體中完成計算和模擬,最後按照正式報告八股文的行文,把各種關鍵信息填進去,最後寫成Word文件。寫報告的過程枯燥而沒有技術含量,但卻要反覆進行。

通過下圖的Word+VBA,完成主要的交互界面並連接計算軟體。在通過簡單的交互獲取主要信息後,在後台完成計算並將主要信息填寫入八股文的Word模版,最終完成報告,同時將結構化的信息存入Access資料庫。

5、管理項目及同步內容
這是協助某國際大型汽車製造廠完成新品牌及其新款車型上市,面臨車型即將斷檔的窘境,該新車型的上市非常關鍵,不能錯失時間節點。然而,新車型上市涉及到無數分支:製造、產品、市場、渠道、營銷、公關、財務等等,同時還要協調歐洲的兩個總部以及中國的兩個分部。這次諮詢的核心任務就是項目管理,總控整個大項目的進度,並每周向中國區的CEO彙報進度並發掘出易出現問題的關鍵節點以調配資源。我們4個諮詢顧問分配下去各自負責幾個部門或者項目分支,和團隊一起規劃流程、畫甘特圖、確認里程碑及時間點、安排負責人等等。當每天回到辦公室大家將進度匯總在一起的時候發現了挑戰及難點,每條任務線並不是獨立發展的,而是各條任務線交織在一起並互相影響。

  • 某些核心人員在多個任務線出現。比如:負責預算的財務人員,幾乎要出現在各條線中負責相關預算的審批環節
  • 某些任務線的里程碑是其他任務線里程碑的必要條件而相互關聯。比如:新車的下線時間影響發布會的時間,相關法規測試的通過又影響車輛的下線時間等等

當任務線增多以及任務線之間的交叉越發頻繁的時候,匯總的任務將會幾何級數增加,這就是我們在項目過程中遇到的問題。於是我利用Excel+VBA完成了這個工作的自動化。主要實現的功能:

  • 自動將4個顧問手中分散的Excel文件彙集在一起形成一個大的總表,如下圖
  • 各顧問手中的表格是按照部門維度來劃分的,匯總後需要按照不同的維度來輸出不同類型的表格,比如:按任務線輸出表格、按責任人輸出表格、所有延誤任務的表格、所有需要資源重點投入任務的表格等等

在此基礎之上,還要將上面提到的各種維度下的所有表格(大概有200多張),按要求格式粘貼到PPT中,每周提交給中國區的總部進行彙報和評估。密密麻麻的表格如下圖。於是,我又寫了一個程序將Excel中的表格輸出到Powerpoint中,將一個秘書每次需要數小時才能完成的工作,簡化成了一鍵發布,並可以在Excel中完成對PPT的更新。

這個項目的程序量不小,近似於寫了一個迷你版的Microsoft Project來進行項目管理。

最後,下圖中密密麻麻的PPT每周需要更新一次,每次都是快100張的工作量,然而基本上都是靠Excel來自動完成更新的。因為PPT的模版每次變化不大,我將這些模版記錄下來,每周更新的時候只要根據Excel中最新的數據更改PPT中的數據即可。

6、海量下載Bloomberg數據並完成分析
通過Bloomberg的VBA API,海量下載數百隻目標股票的tick data以及order book。

並根據實現構建好的數學模型,在後台完成計算,將上述的實時數據轉化成每隻股票實時的trading cost,實時展現在交易員最常用的Excel界面中,方便交易員評估當下的交易成本以便於優化交易策略。

更多文章請到數據冰山 - 知乎專欄
更多回答請看何明科的主頁


我的看法是這樣的:
1、VBA和Python本身都不難,都可以作為非計算機專業入門的2種語言,都學的話不會佔用你很多時間。
2、計算機專業的同學跟你說的也沒錯,如果你是計算機專業,你只會VBA是基本找不到啥工作的,Python精通起碼有口飯吃,但是你如果以後不在it行業混,不去搞科學研究,我認為Python在其他領域的使用率遠低於VBA。
3、如果你指的數據處理是基於excel或者access的,那你肯定要先學VBA,VBA與office結合最好,最容易上手,並且效率也不錯。
4、Python肯定是比VBA要強大一些,並且效率也高一些。但是,有句話叫殺雞焉用牛刀,如果你就是幾千行的數據,你用Python那我真是給你跪了。這就有點像你就想聽個cd,你不去直接買個cd機,結果你買來輛車,坐車上聽cd一樣。
5、VBA沒過時,在計算機專業的眼裡VBA一直都沒地位,但在金融、財務等諸多其他領域,VBA是神器。基本任何企業的絕大多數部門都會用到excel,都會需要處理數據。在這個連篩選都不是人人會、數據透視圖更是高大上的世界裡,你精通VBA你就是寶貝。


python當然可以分析小部分簡單的excel文件,但是對於那些非程序員來講,你教會他裝個python然後在命令行下面啟動不知道什麼編輯器寫出來的腳本,會比直接上自帶的VBA容易?計算功能excel都自帶了,大部分情況下,用不著python的庫。


現實中的絕大多數VBA程序都是野路子選手本著弄出來湊合能用就行的心態寫的,各種邏輯橫飛,當然沒注釋沒文檔,更沒有任何測試流程,高度依賴於運行環境,往往還鏈接了不同的xls和mdb文件。整個就是個魔法盒,除了作者沒人知道該怎麼維護,也沒人能驗證程序結果的正確性。

不可持續維護的代碼對組織來講當然是壞事,對個人就未必了。如果你處在一個周圍人都是電腦白痴的職場,用VBA處理數據簡直是神器。他們會用看猴子的眼神膜拜你,而且等你留下一坨坨屎一樣的代碼升遷走了以後,辦公室里就會留下你的不敗傳說。
當年有你在,需要小工具的時候根本不用找程序員提ticket排隊,找你花個幾小時就能做出來。你留下的sheet點一個按鈕就可以完成之前要做大半天的複雜工作,乃至於所有的人都已經忘了本來的工作手工要怎麼做,離了你的工具就不能幹活了。現在只是需求有變化需要改改功能,或者只是它不知為何突然崩潰了,全辦公室都癱瘓了等著修好這個程序,新來的傻逼卻怎麼也搞不定。
所有的人都會緬懷你的強大,嘆息你的離開。哪怕其實你自己也忘了那個程序怎麼改,即使把你叫回來一樣懵逼,但是無所謂你已經飛到一個嶄新的環境創造屎代碼或者根本不用再寫代碼了,這裡的麻煩讓它們自生自滅吧。

然後心滿意足的你就可以來知乎說一句:VBA是神器,別聽他們搞計算機的瞎逼逼。

說的也沒錯。


VBA是前端設計神器,和Excel結合起來可以設計出各種花里胡俏的操作界面。

一搞不好還會讓從沒用過的人在看到excel自己動來動去是以為你在變魔術。

至於Python,R, maltab,sql等功能更強大點東西,說實話,一般的公司業務量還達不到需要它們。等哪天真到了你會發現vba的各種慢和不方便,你會逼自己去學的。

如果馬上有工作需要,先學VBA吧,邊際回報很高。


python 慢慢安裝,慢慢安裝庫都鬱悶,VBA直接拖拉控制項就GUI,而且內置在office 裡面,easy come easy go


都學一下是王道,需要用哪個就用哪個,人努力進化億萬年並不是只讓你用一個斧頭搞定天下事。


這個問題其實是刀的二面,從我的角度來說VBA是我最重要的工具,日常OFFICE的自動化都依靠它來進行,節約了大量的時間,但同時VBA也限定了只能在OFFICE裡面進行,對於超出範圍的工作無能為力

至於PYTHON,我也嘗試去學習過,但相對VBA來說,複雜了很多,要思考要學習的地方非常大,當然,可以操作的範圍就大多了,操作OFFICE當然不在話下。

所以,VBA是家庭用的菜刀,日常用用挺不錯,要是家裡來客,剁上幾斤肉包個餃子還行,PYTHON就是切肉機了,適應你開個餐館了,你看著辦。


在Office辦公上,VBA依舊是辦公利器。有幸在實習的時候幫老闆寫過幾千行的VBA代碼,上手很快,對於Excel表格的數據處理效率很高,可以直接生成圖表或者導出Powerpoint文檔,省去了很多麻煩。

另外,題主不妨從學習成本上去考慮一下這個問題,VBA上手快,想要用什麼功能,就去學什麼功能,而且就在Office裡面就可以寫,能夠很快的使用它來解決問題,這樣給自己正向反饋,可以促進自己使用和學習的興趣。真正到了VBA已經滿足不了你的時候,你可以考慮再去學Python。而且,編程語言其實都是通的,你會了VBA,上Python手會更快。你本來的出發點,不就是解決問題么?所以更快的解決問題的方法就是好方法。

附我實習時候剛開始學VBA總結的一點東西:
Useful Tips for Excel VBA


以我在香港投行諮詢(外包)的經驗來說,Excel是BA必備的技能。老闆會Excel,猴子們寫代碼。


VBA仍然是,而且基本只能是非計算機專業辦公人員的第一利器

1. VBA的易用性
Excel對於非計算機專業辦公人員來說,已經是功能非常強大的資料庫了,CURD已經足夠優秀。而你只要常常要用到Excel,那麼學習VBA就有了必要,因為Excel自帶的操作是通用的,通常來說,工作上需要的操作往往是需要定製化的,VBA可以拓展你的Excel,實現自動化。
另外Excel的幫助文檔里關於VBA的函數十分清楚,使用起來也非常的簡單,即使沒有編程經驗也很容易上手。

2. 圖形化界面
VBA能非常容易的製作出一個符合本機操作系統風格的圖形化界面,可以很容易的進行人機交互,比如你點一個按鈕,執行一個命令,一張表瞬間就生成了。

3. VBA和COM的無縫結合
絕大多數的軟體,比如一些工程軟體,都可以通過VBA進行拓展,比如CATIA, AutoCAD等等,效率是指數級的提高。

4. VBA的不足
VBA的表達能力相對於C#, Java, Python等差距很大,另外數據結構雖然後來加入了Dictionary,但是還是無法彌補VBA在數據結構上的不足。


excel vba不是辦公利器
應該叫辦公
行業:圖書電商 職位:電商運營
以下作品請忽略界面美觀性,一切設計以快捷實用為原則

BI相關:一鍵更新百萬種商品關聯推薦(sql)
使用了:最佳組合/購買過XXX商品還購買過 等關聯推薦演算法

多條件排行榜查詢(sql)

圖書信息批量查詢:按條形碼,本站鏈接/ID(sql)
條形碼自動識別客戶的各種奇怪格式

一鍵監控指定圖書到貨情況(sql)

單品銷量走勢一鍵出圖

快捷的按客戶書單查書(內嵌網站界面)

自動比價商城折扣

vba更新暢銷榜、新書榜推薦(寫SQL)

掃描百度收錄情況

發票抽獎快捷錄入/ 批量提交

訂單信息和掃描槍配合校對實物

電子郵件群發器

還有一些更核心更特殊的程序不便公開拉


我用vba幫老闆實現排班表(只是自動填日期)這個功能,老闆讓我做店長了!從此走上康庄大道。


辦公時採用Excel就足夠了,它的功能非常強大,尤其當你應用上powerpivot以及VBA後。


我爸總是吹噓他自己僅用excel表就能做好整個大山村的戶口數據和財務管理,這還是在不懂什麼vba的情況下……


剛開始工作,需要處理很多數據,接觸excel,慢慢學會用vlookup函數,然後開始用vba寫自動處理的程序,後來用access,mysql做資料庫,用c#和.net做程序。我是做財務的,也會寫程序,可以說和數據整理處理統計有關的,基本都要找到我。

以前聽過一個梗,說apple為什麼干不過微軟,就是因為office,說office有什麼強大,可能最強大的還是excel,那麼excel里最強大的,就是vba了。就我所了解,你在excel里做的所有操作,都能用vba操作,你可以自己錄製一個宏試一試。所以,也就是說你能用代碼來做一些做自定義程度非常高的工作,這點就是vba的強大的根源所在。

我不是計算機專業出身, 我也用c#,我學C++也吃力,但我覺得那些鄙視某一門語言或者技術的,大多都是真正的菜鳥,浮躁不可一世,別人泡在前面,TA在後面鄙視~~

說完~


最近在用VBA編一些東西,Python正在學習中。作為工程人員來談談這個。首先非計算機專業的人,比如像其他答友提到的金融、財會還有我們廣大的工程狗來說,如果不是專門去開發相關軟體,肯定是沒有那麼多時間去學習掌握複雜的編程語言的。VBA和Python的優勢就是都比較容易掌握入門,語法邏輯比較清晰簡單,輔助性比較強。

VBA的好處就是內置在Office裡面了,而且像一些傳統的軟體比如AutoCAD中都有內部開發環境(最新版本需要單獨安裝開發包),所以引入非常方便,直接在這些軟體的VBA編輯器里寫一串代碼,運行就能立刻看到運行結果,結合VB語法EASY上手,快速編程的優勢不要更舒爽。門檻低、功能強、編寫速度快,簡直不要更開心。

至於Python,比VB這種IT界的黃花菜當然更高大上拉,這也是我為什麼去學習它的原因,想感受下時代的潮流(VB語言的腳步已經停止,微軟也不再更新)。Python的內置函數庫非常豐富,功能更強大,面向對象什麼的更完美。不過我還在學習中,具體用起來怎麼樣,還沒太多感受。但單就安裝過程的複雜程度,我想足以讓很多工程人員敬而遠之。很多時候,工程人員的要求不過是快、簡單,最好別人弄好了,點一下就可以完成所有工作。。。必要的時候對現成代碼改動改動就迅速投入使用(菜鳥也能看得懂)。

VB這種語言現在最活躍的用處可能就是這裡了,非專業人員人群中又不是很努力學習編程的那種人,所以到了程序員眼裡這點本事也基本形同於無。如果真的對編程感興趣又有時間,可以研究研究更高級點的語言,C#、python都算是開發性很強的工具,和工程軟體結合也比較好。最後對題主的問題給予直接答覆,VBA是利器,Python也更強大,至於效率么,我想不置可否。


數據不超過66536行,excel vba就行。
超過了盡量用資料庫,寫sql比python簡單的多。

年前,有這麼個問題,需要把yahoo finance 網站上600000這支的股票每天收盤價格記錄並下載下來。


剛開始是想的用excel內置數據獲取加excel vba實現。

我花了一個小時的時間錄宏,
大致就是在打開excel之後,
定時去從網站獲取數據粘貼到另外的sheet頁裡邊,
基本實現了功能。
代碼如下:
***************************************************************************
Sub Macro2()
"
" Macro2 Macro
"
"
Dim 主菜單欄 As CommandBar
On Error Resume Next
Application.CommandBars("我的主菜單").Delete
Set 主菜單欄 = Application.CommandBars.Add
With 主菜單欄
.Visible = True
.Name = "我的主菜單"
.Position = msoBarTop
End With
"菜單恢復
"
DoEvents

Sheets("網站下載").Select
Range("A2:G2").Select
Selection.Copy
Sheets("數據表").Select
Range("A4180").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A4179").Select
Application.CutCopyMode = False
Selection.Copy
Range("A4180").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
ActiveWindow.ScrollRow = 4142
ActiveWindow.ScrollRow = 8
ActiveWindow.ScrollRow = 1
Rows("2:2").Select
Selection.Delete Shift:=xlUp
ActiveWindow.ScrollRow = 8
ActiveWindow.ScrollRow = 4126
ActiveWindow.ScrollRow = 4147
Range("H4179").Select
Application.OnTime Now + TimeValue("09:30:00"), "Macro1"
"定時每10秒執行一次,直到11點13分
"

End Sub
***********************************************************
Sub doevent()
Dim 主菜單欄 As CommandBar
On Error Resume Next
Application.CommandBars("我的主菜單").Delete
Set 主菜單欄 = Application.CommandBars.Add
With 主菜單欄
.Visible = True
.Name = "我的主菜單"
.Position = msoBarTop
End With
"菜單恢復
"

DoEvents
If Sheets("網站下載").Range("A2").Value = Sheets("數據表").Range("A4179").Value Then Exit Sub Else Application.OnTime Now, "Macro2"
"比較數據,如果相同則退出
"
End Sub
**************************************************************************

後來覺得這個方法不太好玩。就換了python2.7。
簡單說就是利用 urllib庫去取數然後再保存,還挺快。
畫圖就比較丑了,跟matlab一樣。

###################取數######################
import urllib
url = "http://chart.finance.yahoo.com/table.csv?"
url +="s=600000.SS"
url += "a=7b=4c=2000" #開始時間
url +="d=2e=16f=2016"#結束時間
url +="g=dignore=.csv"
#params=urllib.urlencode({})
connect =urllib.urlopen(url)
data = connect.read()
#print data
urllib.urlretrieve(url,"./msft.csv")
###################取數######################

####################繪圖##################
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

url = "http://chart.finance.yahoo.com/table.csv?"
url +="s=600000.SS"
url += "a=7b=4c=2000" #開始時間
url +="d=2e=16f=2016"#結束時間
url +="g=dignore=.csv"

data = pd.read_csv(url, parse_dates=["Date"])
data.plot(x="Date",y="Close")
plt.show()
####################繪圖##################


曾經用一下午幫一個朋友用vba做了一個小型ERP,能夠實現:訂單管理、庫存管理、銷售統計等功能。到現在都還能正常使用,給他省了一筆採購費。


先回答,我不懂大家說的Python,只是知道在現在的工作環境中,Excel 的 VBA非常好用,且綽綽有餘。
第一份實習,在公司各種已存在的表格里,學到了基本的EXCEL的東西,比如VLOOKUP,OFFSET,透視表,控制項之類的,已經各種格式等,發現特別好用;
第二份實習,將之前所學一一實踐並提高,給當時的同事姐姐們做了好多表格模板;
第三份實習,知道了一個叫MACRO的東西,儘管只是一個塗色+規範格式的小按鈕,但這讓我對EXCEL的理解產生了翻天覆地的變化,有開啟了一個新世界的感覺;
後來開始了工作,發現EXCEL+VBA的依賴度越來越大,就開始慢慢自己琢磨學習VBA,其實也沒有系統的學過,也就三腳貓的功夫解決解決燃眉之急或者是小型的需求,就如上面某個答主所說的「野路子選手」的那樣的,也就自己能看得懂,知道怎麼改。
自己上手寫代碼,不是因為找IT需要排隊或者流程長之類的原因,也不是要逞能什麼的,就是覺得業務和工作上的需求,只有自己最清楚,可以省略溝通的時間、避免溝通中的誤會和解釋、如果前端數據有變化或者後端要求有變化都能自己迅速的改變,而不會受制於他人。

最後,我是學金融做考核的,每天、每周、每月、每年都有一堆數據要處理分析。。。


推薦閱讀:

TAG:Python | Microsoft Excel | VBA | 數據處理 | Excel 使用 |