接上文……▼ 寫給VBA初學(xué)者的隨筆: 相信, 實(shí)踐, 理解(一) 寫給VBA初學(xué)者的隨筆: 相信, 實(shí)踐, 理解(二) 新手學(xué)習(xí)的幾點(diǎn)建議 1:調(diào)試 經(jīng)??吹叫率謱W(xué)習(xí)了很長(zhǎng)時(shí)間的VBA之后仍然不會(huì)使用調(diào)試功能,一遇到問題馬上就請(qǐng)教他人,這樣不利于自身的成長(zhǎng)。調(diào)試非常重要,是學(xué)習(xí)代碼本身 三個(gè)窗口,三個(gè)功能鍵: 地方窗口,立即窗口,觀察窗口,F1(幫助),F2(屬性方法),F8(分步執(zhí)行) 途中診斷: 斷點(diǎn),stop等等。 2:分拆 (1)語句分拆 長(zhǎng)而難懂的句子分拆成基本單元,利用調(diào)試功能一個(gè)個(gè)解決,很容易就理解了它的含義。 如:intRow=Range('A'&Rows.Count).end(xlup).row 立即窗口:?Rows.Count Range('A'&Rows.Count).Select Range('A'&Rows.Count).End(xlup).Select ?Range('A'&Rows.Count).End(xlup).row 用眼睛都可以看到每一步Excel選中的哪個(gè)單元格,那么自然就不難理解了。這個(gè)小范例同時(shí)揭示了學(xué)習(xí)程序過程中一個(gè)非常重要的方面:動(dòng)手嘗試。 (2)子程序分拆 把一個(gè)冗長(zhǎng)的程序按照功能拆分成一個(gè)個(gè)相對(duì)獨(dú)立的子程序來調(diào)用,使得程序具有一定程度的組織性,結(jié)構(gòu)性,規(guī)整性大大提高了代碼的可維護(hù)性,擴(kuò)展性,重用性。這是貫穿程序語言發(fā)展的一條主線,因?yàn)樗苯又赶蛄顺绦蜷_發(fā)的終極目的之一:開發(fā)效率。 3:耐心 學(xué)習(xí)目的明確≠急于求成。無論學(xué)習(xí)目的如何直接和明確,學(xué)習(xí)的過程仍然不是一蹴而就的,'捷徑'只能是建立在扎實(shí)的階梯式基礎(chǔ)上。有些新手基本代碼還沒寫利落就開始用界面寫'系統(tǒng)',甚至還沒學(xué)會(huì)調(diào)試,結(jié)果是步履維艱,一步一問,三步一錯(cuò),無以為繼。還有的朋友學(xué)習(xí)VBA是為了研究彩票,還沒學(xué)習(xí)一星期就開始寫各種計(jì)算方法,自然處處遇'難',大挫學(xué)習(xí)興趣,隨之放棄。抱著明確的目的學(xué)習(xí)是好事,不管目的是否'明智'(這是另外一個(gè)話題),但明確的目的不等于'急功近利'。學(xué)習(xí)的進(jìn)程總是遵循漸進(jìn)式的規(guī)律,跳躍式的一夜暴富只能是空中樓閣,所以耐心在學(xué)習(xí)過程中就顯得尤為重要。 單獨(dú)說說效率和速度的問題。程序的效率大致包含兩層含義 (1):執(zhí)行效率; (2)開發(fā)效率。 執(zhí)行效率又可分為時(shí)間效率和空間效率,空間效率不在本貼討論范圍內(nèi),所以執(zhí)行效率簡(jiǎn)化為速度來討論。之所以單獨(dú)拿出來說這個(gè)問題是因?yàn)檎搲芏嗵釉?速度'追逐上所表現(xiàn)出的'熱忱'比較極端,走的路比較偏執(zhí),希望初學(xué)者能夠以一個(gè)相對(duì)平和的心態(tài)來看待效率。 執(zhí)行效率與開發(fā)效率,從字眼上分析就知道,程序的最優(yōu)目標(biāo)是兩者并重。遺憾的是兼顧并非常態(tài),凸出一者的同時(shí)往往傷害到另一者。當(dāng)兩者出現(xiàn)矛盾時(shí),職業(yè)代碼工人較為普遍接受的原則是:'只有在必須考慮速度的時(shí)候才優(yōu)化執(zhí)行效率,否則以開發(fā)效率為重'。 換句話說,只有在不得不考慮優(yōu)化速度的時(shí)候執(zhí)行效率的目標(biāo)高于開發(fā)效率因?yàn)橐WC功能性,有效性。否則只考慮開發(fā)效率不考慮執(zhí)行效率。職業(yè)程序員和職業(yè)'玩家'在這個(gè)問題的認(rèn)識(shí)上經(jīng)常會(huì)產(chǎn)生分歧。 注重效率的程序員 設(shè)身處地的想一下,職業(yè)程序員在意的是什么?他們?cè)谝獾氖强焖?順利的完成工作,在意的是軟件的穩(wěn)定性,有效性盡量避免老板和客戶找他們的麻煩,最終目的就是掙錢,吃飯,養(yǎng)家?;ㄙM(fèi)幾個(gè)小時(shí)來提速幾個(gè)程序模塊,工資沒多一分錢,延誤了進(jìn)度,工期老板肯定不干?;谶@樣的原因,他們順理成章的注重與可維護(hù)性,穩(wěn)定性,擴(kuò)展性,重用性相關(guān)的開發(fā)效率。 追逐'手筋'的'玩家'~ 相比較而言,職業(yè)'玩家'寫代碼并非為了工作,沒有項(xiàng)目壓力,無需考慮開發(fā)時(shí)間,開發(fā)成本,追逐的是華麗的'手筋',以及速度飆升所帶來的愉悅。其次,速度本身的屬性決定了它是一把極其規(guī)范,可量化的標(biāo)尺?;谒俣葹闃?biāo)準(zhǔn)的代碼具有極強(qiáng)的博弈性和競(jìng)技性,不僅可以獨(dú)樂還可以眾樂。 '有意義'和'無意義' 前邊我們就曾提過'有意義的快'和'無意義的快','有意義的快'可以包括兩種情況分別稱作'根本性速度提升'和'規(guī)模型速度提升'。 插播小故事:'這事兒不賴我' 在VBA中當(dāng)遇到速度慢的不可忍受的情況時(shí),粗略的說可從以下幾點(diǎn)入手: (1)合理化數(shù)據(jù)源的結(jié)構(gòu); (2)用數(shù)組一次讀寫單元格內(nèi)容,避免頻繁操作單元格對(duì)象; (3)查詢搜索改用Collection或字典。 所謂'規(guī)模型速度提升'是指對(duì)于應(yīng)用頻次高的問題,可以考慮一次優(yōu)化速度,應(yīng)用無數(shù)次,追求規(guī)模效應(yīng)降低開發(fā)效率損失。至于'非根本性速度提升' 用一句話來總結(jié):'程序的本質(zhì)是用機(jī)器來解放勞動(dòng)力,而不是用勞動(dòng)力解放機(jī)器!' 本來想寫很多內(nèi)容,一來由于沒什么初學(xué)者看所以無收獲可言;二來如果深入的話恐會(huì)戕害一些壇友的感情;三來目前此帖已有萬余字,再多就不像帖子了。再深入展開下去實(shí)屬下下策,故此樓略顯單薄,但基本意思都點(diǎn)到了。剩下關(guān)于算法和數(shù)據(jù)結(jié)構(gòu)的認(rèn)識(shí)和態(tài)度在本樓沒有提及。 到該結(jié)束的時(shí)候了,想必大家能理解本貼的態(tài)度:不褒不貶。你用,或者不用它,你喜歡,或者不喜歡它,它就在那里,不遠(yuǎn)不近,無所謂“強(qiáng)'無所謂”弱'。 一致性,對(duì)稱性是匹配的原則。對(duì)稱匹配,你收獲你想要的,Excel,VBA發(fā)揮應(yīng)有的效力;反之,錯(cuò)位匹配引發(fā)牽強(qiáng)附會(huì),捉襟見肘。既然談過了VBA的定位,自然不可避免的要談一下對(duì)其宿主Excel的認(rèn)識(shí)。話題就從這里開始吧...... 靈活是把雙刃劍 相比VBA而言,Excel的邊緣性更強(qiáng)。相信大家都積累了多年的使用經(jīng)驗(yàn),是Excel的行家里手,提及某某功能如何實(shí)現(xiàn)均可娓娓道來。如果問一個(gè)這樣的問題:'Excel到底是什么?'一言以畢之,'電子表格工具'。這種定義只是給Excel起了個(gè)別名(alias),不是一種理解,認(rèn)識(shí)和定位。曾經(jīng)問過自己這個(gè)問題,我發(fā)現(xiàn)自己答不上來或者說自己的能力不足以回答這個(gè)問題。 邊緣性強(qiáng)主要表現(xiàn)在使用范圍廣泛,尤其它還是一款不斷升級(jí)的產(chǎn)品并且有諸多第三方插件對(duì)其進(jìn)行功能擴(kuò)展,這時(shí)候你會(huì)發(fā)現(xiàn)無論怎么回答這個(gè)問題都是錯(cuò)的,難免給初學(xué)者造成'Excel無所不能'的錯(cuò)覺。但如果不能予以概念上的定位,就無法回答'適度'使用的問題,結(jié)果就是一切和表格有關(guān)的工作都用Excel來做。 Excel簡(jiǎn)單易用,功能強(qiáng)大,所見即所得(這可是個(gè)不得了的特點(diǎn)),這些都是耳熟能詳?shù)奶攸c(diǎn)。個(gè)人認(rèn)為Excel最大的特點(diǎn)來自于靈活: (1)自由設(shè)計(jì)用戶自己的藍(lán)圖,天馬行空,個(gè)性十足; (2)Excel分享了數(shù)據(jù)庫的一些特點(diǎn),具有一定程度的記錄和數(shù)據(jù)存儲(chǔ)的功能。雖然可以說Excel缺乏關(guān)系結(jié)構(gòu),但由于靈活的特點(diǎn),可以用工作表打造出關(guān)系結(jié)構(gòu); (3)通過各種計(jì)算和圖表功能,提供多視角數(shù)據(jù)體驗(yàn); (4)騰挪空間廣闊,運(yùn)用水平差異大。 然而靈活性并非是無成本的,靈活的同時(shí)就意味著規(guī)范性差,同樣功能的表格10個(gè)人設(shè)計(jì)出12樣兒來,格式,表頭,結(jié)構(gòu),實(shí)現(xiàn)方式等等花樣百出。 規(guī)范性差導(dǎo)致用戶交流困難,隨著邏輯業(yè)務(wù)設(shè)計(jì)復(fù)雜程度不斷提高,有效性控制繁雜,錯(cuò)誤幾率增大,急劇加重了設(shè)計(jì)者的負(fù)擔(dān)。邏輯業(yè)務(wù)關(guān)系越復(fù)雜設(shè)計(jì)成本的增長(zhǎng)幅度就越大(呈非線性增長(zhǎng)態(tài)勢(shì))。前些日子看到一位壇友希望把一套表格封裝,表格集成了一套用公式表達(dá)的復(fù)雜邏輯業(yè)務(wù)關(guān)系。其實(shí)這套關(guān)系本身就是一道加密壁壘,把其中的邏輯梳理清楚比破解還費(fèi)勁。 個(gè)人的一點(diǎn)看法:既然很難在概念上抽象化Excel的定位,只好用一條條描述性的特征來概括Excel,但這種列舉是無法窮盡的。 從正面說: (1)Excel'適用'于:邏輯業(yè)務(wù)關(guān)系相對(duì)簡(jiǎn)單,數(shù)據(jù)規(guī)模不大,一鍋端式的集成應(yīng)用;(可惜無法量化定義'簡(jiǎn)單','規(guī)模') (2)對(duì)于業(yè)務(wù)邏輯復(fù)雜,規(guī)模較大的數(shù)據(jù),Excel'適合'充當(dāng)數(shù)據(jù)庫和用戶之間的緩沖層(buffer)。致力于數(shù)據(jù)的展示,整理,綜合,'分析'等體現(xiàn)靈活性的職責(zé)。 從反面說:(表象) (1)避免用Excel設(shè)計(jì)大規(guī)模業(yè)務(wù)關(guān)系復(fù)雜的'系統(tǒng)'; (2)避免大量數(shù)據(jù)存儲(chǔ)造成Excel文件尺寸過大;(動(dòng)輒幾十上百M(fèi)的Excel文件經(jīng)常能夠看到) (3)避免大量公式集成,重算可以導(dǎo)致文件打開速度過慢,運(yùn)行速度過緩; (4)避免搭建Excel文件系統(tǒng);(幾十上百Excel文件組成的文件集也是屢見不鮮) (5)...... 上述情況可以適當(dāng)考慮使用數(shù)據(jù)庫的功能,畢竟他們之間是有本質(zhì)區(qū)別的。這里只是以我的觀點(diǎn)來看待Excel,“不適合'不代表Excel不能做到,最終的評(píng)判要交給用戶,誰用誰有話語權(quán)而不是設(shè)計(jì)者和所謂規(guī)范的探索者。在能意識(shí)到'隱患'的條件下,如果您覺得好用,完全可以避免庸人自擾式的思考,堅(jiān)持走自己的路。 既然Excel的特點(diǎn)是靈活,我們就以一個(gè)靈活的態(tài)度來認(rèn)識(shí)和對(duì)待它好了。 至此關(guān)于Excel和VBA的話題就告一段落了,最后再補(bǔ)充一句: 對(duì)于業(yè)務(wù)部門職員來說,Excel,VBA解決工作中的問題真的是夠用了,也是很好的選擇。如果不夠用說明您的工作應(yīng)該是由IT部門來完成的工作。業(yè)務(wù)部門的員工扛著VBA去干IT部門的工作,無論是工具和還是工作內(nèi)容都錯(cuò)位的離譜。 最后收錄一些經(jīng)典語錄。既然是收集,就是一個(gè)開放和相對(duì)漫長(zhǎng)的過程,先把帖子的架子搭完,對(duì)觀眾有個(gè)交代, 【存在即合理】 【細(xì)節(jié)決定成敗】 【不管什么,只要學(xué)好了都牛】 ............... 【吾生也有涯,而知也無涯】《莊子》 【在EH人眼里,Excel就是一部游戲機(jī)】 |
|