99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀Excel到底有多厲害?
Excel到底有多厲害?
2016-03-22
收藏
來自數(shù)據(jù)冰山,CDA以獲作者授權(quán)轉(zhuǎn)載
許多高級(jí)程序員瞧不上VBA。因?yàn)槌绦騿T是有鄙視鏈的:匯編 >C >C++ >Python >Java及C#及PHP(這三者相互撕) >VB >HTML。在這長(zhǎng)長(zhǎng)的鄙視鏈中,甚至都沒有VBA的位置。

可是,Excel+VBA是圖靈完備的(謝謝 @Octolet 的精辟總結(jié)),所以被程序員用來??岬母黝愋愿姓Z(yǔ)言能實(shí)現(xiàn)的大部分功能,Excel+VBA都能實(shí)現(xiàn),而且往往是以更高效更快捷的方式,在這里不談效率和優(yōu)雅。而且考慮到大部分普通群眾是沒有編程環(huán)境的(各種依賴各種包,各種OS各種編譯環(huán)境,還有IDE),然而使用VBA,只需要打開裝機(jī)自帶的Office,然后按下Alt+F11就自動(dòng)進(jìn)入編程和執(zhí)行環(huán)境;甚至可以更簡(jiǎn)單的通過錄制宏來解決寫程序的問題,只需要在簡(jiǎn)單的代碼基礎(chǔ)上修修補(bǔ)補(bǔ)就可以執(zhí)行。再考慮到VBA和Office各軟件的完美整合,所以在便捷性方面,VBA是無可比擬的。最后,Office+VBA的分享性和移植性很強(qiáng),任何測(cè)試通過的程序放到別的機(jī)器上也可輕易執(zhí)行;而其他程序,哪怕是一段最簡(jiǎn)單的“Hello World”,也不一定。因此本文討論各種通過Excel+VBA能實(shí)現(xiàn)的各種炫酷功能(也會(huì)拓展到Office+VBA),主要是為Professional Service以及各行各業(yè)不寫程序但是又嚴(yán)重依賴于Office的職場(chǎng)人士服務(wù)的。

曾經(jīng)有一個(gè)朋友和我說,“Excel根本不需要編程,像我這樣的Excel大??亢瘮?shù)和自定義函數(shù)能解決所有的問題?!睂?duì)于這樣的評(píng)論,我想起自己小學(xué)時(shí)的一段經(jīng)歷。因?yàn)椴荒芾斫馓摂?shù)i(i^2 = -1)的價(jià)值,問我爸i有卵用?我爸說,“等你長(zhǎng)大了,遇到更多的問題,就知道i的價(jià)值?!?/span>

1.自動(dòng)打印

剛進(jìn)職場(chǎng)的新人,只要爸爸不是李剛,基本都做過影帝影后(影=印,各種復(fù)印打印的體力勞動(dòng))。特別是咨詢投行服務(wù)行業(yè),在某次給客戶的大匯報(bào)或者大忽悠會(huì)議之前,花數(shù)小時(shí)或者整晚來打印數(shù)個(gè)文件,并不是天方夜譚。而且這件事情是對(duì)著同樣一堆不斷修改的文件,會(huì)經(jīng)常不斷重復(fù)發(fā)生。我加入BCG的第一個(gè)項(xiàng)目,就是幫助某大型企業(yè)從上到下設(shè)計(jì)KPI體系并實(shí)施。從上到下涉及到幾十個(gè)部門,大概有100多張的KPI表格需要完成,這些KPI表格分布在各個(gè)Excel文件里。我們4個(gè)咨詢顧問的任務(wù):

設(shè)定好KPI的基本格式,然后每個(gè)顧問負(fù)責(zé)幾個(gè)部門,在Excel里不斷修改KPI表格,打印出來后去各個(gè)當(dāng)事人及其領(lǐng)導(dǎo)那里討論并修改

每周把所有的Excel文件中的KPI表格歸集在一起,按順序分部門打印出來,并需要多份,找負(fù)責(zé)該項(xiàng)目的HR頭兒匯報(bào)進(jìn)度和情況

這里面有個(gè)費(fèi)時(shí)費(fèi)力的環(huán)節(jié),每周需要在多個(gè)Excel文件中找出目標(biāo)Worksheet,然后選定合適的區(qū)域作為輸出的表格,按照一定的格式和一定的順序,打印出這100多張表格。之前我們?nèi)菓{借人力,每周由一個(gè)Analyst把所有最新的Excel文件收集在一起,然后挨個(gè)打開文件選中合適的Worksheet,選中區(qū)域設(shè)置好格式進(jìn)行打印。每進(jìn)行一次,幾乎耗費(fèi)一兩個(gè)小時(shí),還不能保證不出錯(cuò)。

于是寫下了我的第一個(gè)VBA程序,而且基本上是宏錄制之后來改的,沒有使用參考書及搜索引擎,全靠F1和自動(dòng)提示,所以貼出來特別紀(jì)念一下。實(shí)現(xiàn)的功能就是將上述的人肉實(shí)現(xiàn)的功能全部自動(dòng)化。按下一個(gè)妞,就慢慢等著打印機(jī)按順序出結(jié)果吧。


后來這個(gè)程序的升級(jí)版是:調(diào)度多臺(tái)打印機(jī),進(jìn)一步提高效率,以及將打印機(jī)卡紙?jiān)斐申?duì)列錯(cuò)誤的概率降到極小的范圍內(nèi)。

2.制作圖表及GIF動(dòng)畫

圖表制作是每個(gè)Office一族的必備任務(wù),制得一手好表格,絕對(duì)是升職加薪和偷懶放風(fēng)的利器。在回答(黃燜雞米飯是怎么火起來的? – 何明科的回答),就利用Excel+VBA做出數(shù)張炫酷的信息地圖,利用VBA為每個(gè)省的圖形涂色。

(涂色部分來自于網(wǎng)上的一段程序,制作GIF動(dòng)畫的是自己完成的)
同時(shí),為了進(jìn)一步增強(qiáng)炫酷結(jié)果,還利用VBA將這些連續(xù)變化的圖表做成了GIF動(dòng)畫,可惜知乎不支持GIF的顯示。

3.制作復(fù)雜的分析圖表

下圖是研究各個(gè)車型之間的用戶相互轉(zhuǎn)換關(guān)系,因?yàn)橐獙⒁痪S的轉(zhuǎn)化率向量,變成兩維的矩陣,所以使用了如下的復(fù)雜公式。


同時(shí)為了用顏色的深淺來表示轉(zhuǎn)化率的大小關(guān)系而便于比較,使用了VBA對(duì)下面的矩陣進(jìn)行著色。當(dāng)然有人肯定會(huì)說可以使用條件化格式,但是使用VBA保持了最高靈活度和效率。



4.根據(jù)格式化信息,生成標(biāo)準(zhǔn)的word文件

這是幫朋友實(shí)現(xiàn)的一個(gè)項(xiàng)目,他們實(shí)驗(yàn)室是研究某類事故并對(duì)重大事故進(jìn)行鑒定,最后發(fā)布word版的正式報(bào)告。之前的工作流程是在專業(yè)的軟件中完成計(jì)算和仿真,最后按照正式報(bào)告八股文的行文,把各種關(guān)鍵信息填進(jìn)去,最后寫成word文件。寫報(bào)告的過程枯燥而沒有技術(shù)含量,但卻要反復(fù)進(jìn)行。通過下圖的Word+VBA,完成主要的交互界面并連接計(jì)算軟件。在通過簡(jiǎn)單的交互獲取主要信息后,在后臺(tái)完成計(jì)算并將主要信息填寫入八股文的word模版,最終完成報(bào)告,同時(shí)將結(jié)構(gòu)化的信息存入Access數(shù)據(jù)庫(kù)。


希望有機(jī)會(huì)和 @Raymond Wang 和 @金有元 等大律師合作,將Termsheet的書寫及Termsheet到SPA及M&A等的法律文件書寫工作徹底自動(dòng)化。

5.通過Excel管理分布的任務(wù)流

通過Excel管理分布的任務(wù)流,并將Excel表格輸出到Powerpoint。

這是協(xié)助某國(guó)際大型汽車制造廠完成新品牌及其新款車型上市,面臨車型即將斷檔的窘境,該新車型的上市非常關(guān)鍵,不能錯(cuò)失時(shí)間節(jié)點(diǎn)。然而,新車型上市涉及到無數(shù)分支:制造、產(chǎn)品、市場(chǎng)、渠道、營(yíng)銷、公關(guān)、財(cái)務(wù)等等,同時(shí)還要協(xié)調(diào)歐洲的兩個(gè)總部以及中國(guó)的兩個(gè)分部。這次咨詢的核心任務(wù)就是項(xiàng)目管理,總控整個(gè)大項(xiàng)目的進(jìn)度,并每周向中國(guó)區(qū)的CEO匯報(bào)進(jìn)度并發(fā)掘出易出現(xiàn)問題的關(guān)鍵節(jié)點(diǎn)以調(diào)配資源。我們4個(gè)咨詢顧問分配下去各自負(fù)責(zé)幾個(gè)部門或者項(xiàng)目分支,和團(tuán)隊(duì)一起規(guī)劃流程、畫甘特圖、確認(rèn)里程碑及時(shí)間點(diǎn)、安排負(fù)責(zé)人等等。當(dāng)每天回到辦公室大家將進(jìn)度匯總在一起的時(shí)候發(fā)現(xiàn)了挑戰(zhàn)及難點(diǎn),每條任務(wù)線并不是獨(dú)立發(fā)展的,而是各條任務(wù)線交織在一起并互相影響。

某些核心人員在多個(gè)任務(wù)線出現(xiàn)。比如:負(fù)責(zé)預(yù)算的財(cái)務(wù)人員,幾乎要出現(xiàn)在各條線中負(fù)責(zé)相關(guān)預(yù)算的審批環(huán)節(jié)

某些任務(wù)線的里程碑是其他任務(wù)線里程碑的必要條件而相互關(guān)聯(lián)。比如:新車的下線時(shí)間影響發(fā)布會(huì)的時(shí)間,相關(guān)法規(guī)測(cè)試的通過又影響車輛的下線時(shí)間等等

當(dāng)任務(wù)線增多以及任務(wù)線之間的交叉越發(fā)頻繁的時(shí)候,匯總的任務(wù)將會(huì)幾何級(jí)數(shù)增加,這就是我們?cè)陧?xiàng)目過程中遇到的問題。于是我利用Excel+VBA完成了這個(gè)工作的自動(dòng)化。主要實(shí)現(xiàn)的功能:

自動(dòng)將4個(gè)顧問手中分散的Excel文件匯集在一起形成一個(gè)大的總表,如下圖

各顧問手中的表格是按照部門維度來劃分的,匯總后需要按照不同的維度來輸出不同類型的表格,比如:按任務(wù)線輸出表格、按責(zé)任人輸出表格、所有延誤任務(wù)的表格、所有需要資源重點(diǎn)投入任務(wù)的表格等等



 
在此基礎(chǔ)之上,還要將上面提到的各種維度下的所有表格(大概有200多張),按要求格式粘貼到PPT中,每周提交給中國(guó)區(qū)的總部進(jìn)行匯報(bào)和評(píng)估。密密麻麻的表格如下圖。于是,我又寫了一個(gè)程序?qū)xcel中的表格輸出到Powerpoint中,將一個(gè)秘書每次需要數(shù)小時(shí)才能完成的工作,簡(jiǎn)化成了一鍵發(fā)布,并可以在Excel中完成對(duì)PPT的更新。



 
這個(gè)項(xiàng)目的程序量不小,近似于寫了一個(gè)迷你版的Microsoft Project來進(jìn)行項(xiàng)目管理。



最后,下圖中密密麻麻的PPT每周需要更新一次,每次都是快100張的工作量,然而基本上都是靠Excel來自動(dòng)完成更新的。因?yàn)镻PT的模版每次變化不大,我將這些模版記錄下來,每周更新的時(shí)候只要根據(jù)Excel中最新的數(shù)據(jù)更改PPT中的數(shù)據(jù)即可。



6.根據(jù)結(jié)果倒推假設(shè)

一般的Financial Model都是根據(jù)重重假設(shè)計(jì)算最終結(jié)果。而在為某頂級(jí)手機(jī)品牌服務(wù)的過程中,我們卻遭遇了逆向的尷尬。本來是根據(jù)地面銷售人員的一定服務(wù)水平,計(jì)算所需要的銷售人員數(shù)量;結(jié)果在項(xiàng)目過程中,總部已經(jīng)確定好了銷售人數(shù)的Head Count,轉(zhuǎn)而要求我們根據(jù)HC確定服務(wù)水平。然而,服務(wù)水平不是一個(gè)單變量,是由零售店的覆蓋率、銷售拜訪頻率、拜訪中的服務(wù)深度等多重因素來決定的,同時(shí)還可以根據(jù)一線至無線城市來變化。于是只好再次寄出Excel+VBA法寶。先根據(jù)常規(guī)思路建立好Financial Model,得出HC的初步結(jié)果。然后寫VBA程序,根據(jù)不同的情景、不同的優(yōu)先級(jí)以及不同的權(quán)重來調(diào)節(jié)零售店的覆蓋率、銷售拜訪頻率、拜訪中的服務(wù)深度等多因素,同時(shí)設(shè)定這幾大因素的可接受范圍,逐步逼近HC的預(yù)設(shè)值。



如果沒有程序,以前基本是靠人工手動(dòng)調(diào)節(jié)來湊結(jié)果,而且因?yàn)楦鞣N情景的不同,還需要多次調(diào)節(jié)。而通過程序,基本是自動(dòng)完成,還可智能得設(shè)置優(yōu)先級(jí)及權(quán)重,無需人工參與。

7.海量下載Bloomberg數(shù)據(jù)并完成分析

通過Bloomberg的VBA API,海量下載數(shù)百只目標(biāo)股票的tick data以及order book。



并根據(jù)實(shí)現(xiàn)構(gòu)建好的數(shù)學(xué)模型,在后臺(tái)完成計(jì)算,將上述的實(shí)時(shí)數(shù)據(jù)轉(zhuǎn)化成每只股票實(shí)時(shí)的trading cost,實(shí)時(shí)展現(xiàn)在交易員最常用的Excel界面中,方便交易員評(píng)估當(dāng)下的交易成本以便于優(yōu)化交易策略。


8.結(jié)  語(yǔ)

計(jì)算了一下,我在BCG做了三年咨詢顧問,大概寫了幾萬行VBA程序(都是自己手工輸入的,沒有復(fù)制拷貝和系統(tǒng)自動(dòng)生成),每個(gè)項(xiàng)目一千至幾千行程序不等。最后將Excel用成了中控界面,類似EMACS,在Excel可以隨意操控全公司的打印機(jī)、Word、Powerpoint等等,自動(dòng)完成各種任務(wù)以及數(shù)據(jù)更新和抓取。因?yàn)镋xcel的數(shù)據(jù)更結(jié)構(gòu)化,所以將其作為中控平臺(tái),比Word和Powerpoint更有優(yōu)勢(shì)。

最后,這些程序中的一些公共模塊,打包給了BCG Global IT,BCG給了我一個(gè)Sponsorship去Stanford GSB讀書。程序的注釋行里面有我?guī)讉€(gè)好朋友、親人及導(dǎo)師的名字,祝他們一生平安。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }