-
1 # Excel技術分享
-
2 # Excel自力更生
新手學習Excel VBA的幾點建議,你不妨過來
1:除錯
經常看到新手學習了很長時間的VBA之後仍然不會使用除錯功能,一遇到問題馬上就請教他人,這樣不利於自身的成長。除錯非常重要,是學習程式碼本身
不可或卻的一部分。是診斷,梳理程式碼邏輯的過程,可以避免邏輯錯誤的重複性發生。善用除錯新手很多的問題都可以得到解決,即可擺脫對他人的依賴性,自身又得到長足的進步,一舉兩得。
三個視窗,三個功能鍵:
地方視窗,立即視窗,觀察視窗,F1(幫助),F2(屬性方法),F8(分步執行)
途中診斷:
斷點,stop等等。
2:分拆
(1)語句分拆
長而難懂的句子分拆成基本單元,利用除錯功能一個個解決,很容易就理解了它的含義。
如: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選中的哪個單元格,那麼自然就不難理解了。這個小范例同時揭示了學習程式過程中一個非常重要的方面:動手嘗試。
(2)子程式分拆
把一個冗長的程式按照功能拆分成一個個相對獨立的子程式來呼叫,使得程式具有一定程度的組織性,結構性,規整性大大提高了程式碼的可維護性,擴充套件性,重用性。這是貫穿程式語言發展的一條主線,因為它直接指向了程式開發的終極目的之一:開發效率。
3:耐心
學習目的明確≠急於求成。無論學習目的如何直接和明確,學習的過程仍然不是一蹴而就的,"捷徑"只能是建立在紮實的階梯式基礎上。有些新手基本程式碼還沒寫利落就開始用介面寫"系統",甚至還沒學會除錯,結果是步履維艱,一步一問,三步一錯,無以為繼。還有的朋友學習VBA是為了研究彩票,還沒學習一星期就開始寫各種計算方法,自然處處遇"難",大挫學習興趣,隨之放棄。抱著明確的目的學習是好事,不管目的是否"明智"(這是另外一個話題),但明確的目的不等於"急功近利"。學習的程序總是遵循漸進式的規律,跳躍式的一夜暴富只能是空中樓閣,所以耐心在學習過程中就顯得尤為重要。
單獨說說效率和速度的問題。程式的效率大致包含兩層含義
(1):執行效率;
(2)開發效率。
執行效率又可分為時間效率和空間效率,空間效率不在本貼討論範圍內,所以執行效率簡化為速度來討論。之所以單獨拿出來說這個問題是因為論壇很多帖子在"速度"追逐上所表現出的"熱忱"比較極端,走的路比較偏執,希望初學者能夠以一個相對平和的心態來看待效率。
執行效率與開發效率,從字眼上分析就知道,程式的最優目標是兩者並重。遺憾的是兼顧並非常態,凸出一者的同時往往傷害到另一者。當兩者出現矛盾時,職業程式碼工人較為普遍接受的原則是:"只有在必須考慮速度的時候才最佳化執行效率,否則以開發效率為重"。
換句話說,只有在不得不考慮最佳化速度的時候執行效率的目標高於開發效率因為要保證功能性,有效性。否則只考慮開發效率不考慮執行效率。職業程式設計師和職業"玩家"在這個問題的認識上經常會產生分歧。
注重效率的程式設計師
設身處地的想一下,職業程式設計師在意的是什麼?他們在意的是快速,順利的完成工作,在意的是軟體的穩定性,有效性儘量避免老闆和客戶找他們的麻煩,最終目的就是掙錢,吃飯,養家。花費幾個小時來提速幾個程式模組,工資沒多一分錢,延誤了進度,工期老闆肯定不幹。基於這樣的原因,他們順理成章的注重與可維護性,穩定性,擴充套件性,重用性相關的開發效率。
追逐"手筋"的"玩家"~
相比較而言,職業"玩家"寫程式碼並非為了工作,沒有專案壓力,無需考慮開發時間,開發成本,追逐的是華麗的"手筋",以及速度飆升所帶來的愉悅。其次,速度本身的屬性決定了它是一把極其規範,可量化的標尺。基於速度為標準的程式碼具有極強的博弈性和競技性,不僅可以獨樂還可以眾樂。
"有意義"和"無意義"
前邊我們就曾提過"有意義的快"和"無意義的快","有意義的快"可以包括兩種情況分別稱作"根本性速度提升"和"規模型速度提升"。
插播小故事:"這事兒不賴我"
某日一油漆工找到一份新工作:刷馬路中間的白線。
於是油漆工把一個油漆桶放到了起點上開始工作了。
第一天,油漆工刷了300米,老闆大喜,誇獎油漆工:"工作很出色!"
第二天,油漆工刷了150米,老闆不露聲色,鼓勵油漆工:"工作乾的不錯!"
第三天,油漆工刷了30米,老闆大怒,吼道:"今天只刷了第一天的1/10,到底怎麼回事?"
油漆工回答:"這事兒不賴我呀!我每天距離油漆桶越來越遠了啦!"
這個小故事形象的描繪了這樣一個事實:改變工作方式可以帶來根本性的效率提高。在遇到類似於上述情況時,初學者可考慮最佳化程式碼提升速度。
在VBA中當遇到速度慢的不可忍受的情況時,粗略的說可從以下幾點入手:
(1)合理化資料來源的結構;
(2)用陣列一次讀寫單元格內容,避免頻繁操作單元格物件;
(3)查詢搜尋改用Collection或字典。
所謂"規模型速度提升"是指對於應用頻次高的問題,可以考慮一次最佳化速度,應用無數次,追求規模效應降低開發效率損失。至於"非根本性速度提升"
的例子可以在論壇看到很多,諸如迴圈是用指數索引快?還是ForEach索引快?等等,這裡就不一一列舉了。
用一句話來總結:"程式的本質是用機器來解放勞動力,而不是用勞動力解放機器!"
本來想寫很多內容,一來由於沒什麼初學者看所以無收穫可言;二來如果深入的話恐會戕害一些壇友的感情;三來目前此帖已有萬餘字,再多就不像帖子了。再深入展開下去實屬下下策,故此樓略顯單薄,但基本意思都點到了。剩下關於演算法和資料結構的認識和態度在本樓沒有提及。
到該結束的時候了,想必大家能理解本貼的態度:不褒不貶。你用,或者不用它,你喜歡,或者不喜歡它,它就在那裡,不遠不近,無所謂“強"無所謂”弱"。
一致性,對稱性是匹配的原則。對稱匹配,你收穫你想要的,Excel,VBA發揮應有的效力;反之,錯位匹配引發牽強附會,捉襟見肘。既然談過了VBA的定位,自然不可避免的要談一下對其宿主Excel的認識。話題就從這裡開始吧......
靈活是把雙刃劍
相比VBA而言,Excel的邊緣性更強。相信大家都積累了多年的使用經驗,是Excel的行家裡手,提及某某功能如何實現均可娓娓道來。如果問一個這樣的問題:"Excel到底是什麼?"一言以畢之,"電子表格工具"。這種定義只是給Excel起了個別名(alias),不是一種理解,認識和定位。曾經問過自己這個問題,我發現自己答不上來或者說自己的能力不足以回答這個問題。
邊緣性強主要表現在使用範圍廣泛,尤其它還是一款不斷升級的產品並且有諸多第三方外掛對其進行功能擴充套件,這時候你會發現無論怎麼回答這個問題都是錯的,難免給初學者造成"Excel無所不能"的錯覺。但如果不能予以概念上的定位,就無法回答"適度"使用的問題,結果就是一切和表格有關的工作都用Excel來做。
Excel簡單易用,功能強大,所見即所得(這可是個不得了的特點),這些都是耳熟能詳的特點。個人認為Excel最大的特點來自於靈活:
(1)自由設計使用者自己的藍圖,天馬行空,個性十足;
(2)Excel分享了資料庫的一些特點,具有一定程度的記錄和資料儲存的功能。雖然可以說Excel缺乏關係結構,但由於靈活的特點,可以用工作表打造出關係結構;
(3)透過各種計算和圖表功能,提供多視角資料體驗;
(4)騰挪空間廣闊,運用水平差異大。
然而靈活性並非是無成本的,靈活的同時就意味著規範性差,同樣功能的表格10個人設計出12樣兒來,格式,表頭,結構,實現方式等等花樣百出。
規範性差導致使用者交流困難,隨著邏輯業務設計複雜程度不斷提高,有效性控制繁雜,錯誤機率增大,急劇加重了設計者的負擔。邏輯業務關係越複雜設計成本的增長幅度就越大(呈非線性增長態勢)。前些日子看到一位壇友希望把一套表格封裝,表格集成了一套用公式表達的複雜邏輯業務關係。其實這套關係本身就是一道加密壁壘,把其中的邏輯梳理清楚比破解還費勁。
個人的一點看法:既然很難在概念上抽象化Excel的定位,只好用一條條描述性的特徵來概括Excel,但這種列舉是無法窮盡的。
從正面說:
(1)Excel"適用"於:邏輯業務關係相對簡單,資料規模不大,一鍋端式的整合應用;(可惜無法量化定義"簡單","規模")
(2)對於業務邏輯複雜,規模較大的資料,Excel"適合"充當資料庫和使用者之間的緩衝層(buffer)。致力於資料的展示,整理,綜合,"分析"等體現靈活性的職責。
從反面說:(表象)
(1)避免用Excel設計大規模業務關係複雜的"系統";
(2)避免大量資料儲存造成Excel檔案尺寸過大;(動輒幾十上百M的Excel檔案經常能夠看到)
(3)避免大量公式整合,重算可以導致檔案開啟速度過慢,執行速度過緩;
(4)避免搭建Excel檔案系統;(幾十上百Excel檔案組成的檔案集也是屢見不鮮)
(5)......
上述情況可以適當考慮使用資料庫的功能,畢竟他們之間是有本質區別的。這裡只是以我的觀點來看待Excel,“不適合"不代表Excel不能做到,最終的評判要交給使用者,誰用誰有話語權而不是設計者和所謂規範的探索者。在能意識到"隱患"的條件下,如果您覺得好用,完全可以避免庸人自擾式的思考,堅持走自己的路。
既然Excel的特點是靈活,我們就以一個靈活的態度來認識和對待它好了。
至此關於Excel和VBA的話題就告一段落了,最後再補充一句:
對於業務部門職員來說,Excel,VBA解決工作中的問題真的是夠用了,也是很好的選擇。如果不夠用說明您的工作應該是由IT部門來完成的工作。業務部門的員工扛著VBA去幹IT部門的工作,無論是工具和還是工作內容都錯位的離譜。
最後收錄一些經典語錄。既然是收集,就是一個開放和相對漫長的過程,先把帖子的架子搭完,對觀眾有個交代,
【存在即合理】
<評>:理解"合理"的著眼點才能正確的認識,對待,運用好這種存在。一言以畢之不是試圖掩蓋存在本質的藉口就是盲信。
【細節決定成敗】
<評>:方向決定"成"是否有意義。
【不管什麼,只要學好了都牛】
<評>:憤~青的態度抹殺客觀存在的差異性。
只要聽到"不管....只要....就...."的句子就是錯的?
-
3 # 中英文雙語閱讀
想要快速學會VBA,可以先熟悉VBA的最基礎的語法,怎麼錄製宏。例如,學會錄製宏,學習迴圈結構,學習判斷語句等,之後就是修改自己錄製的宏,學習批次處理。
-
4 # 風行office
從我個人學習VBA的經驗來看,學習VBA,首先就要學會使用錄製宏這個功能,這個可以解決工作中大部分問題。
其次,找一本VBA的書,從基本語法,數字型別,基本語句(迴圈,陣列,字典,正則,事件)慢慢積累。
最重要的要有物件思維,VBA有EXCEL物件,Range物件,Sheet物件等等。
學會積累和修改程式碼,遇到比較好的程式碼可以收藏起來。
比如:
開啟指資料夾下的檔案:
Sub FindFile()
Dim path, name, fileName As String
name = "CSV" "要查詢的資料夾
path = ThisWorkbook.path & "\" & name & "\" "拼接資料夾下的路徑
fileName = Dir(path & "*.csv") "查詢資料夾下是csv字尾的檔案
Do While fileName <> "" "停止條件是資料夾下沒有了檔案
Workbooks.Open (path & fileName) "開啟檔案
fileName = Dir "找到下一下檔案
Loop
End Sub
查詢單元格內容:
sum test()
Dim rs As Range
With Range("A1:C30") "查詢的區域
Set rs = .Find(2) "查詢單元內容是2的,返回單元格物件
If Not rs Is Nothing Then "如果查詢到單元格內容是2的就遍歷
Do
rs.Value = "修改了"
"rs.Interior.ColorIndex = 3 "單元格背景色
rs.Interior.Color = RGB(255, 220, 210)
Set rs = .FindNext(rs) "找到下一個單元格
Loop While Not rs Is Nothing
End If
End With
End sub
高階篩選:根據條件區域來篩選並複製:
Sheets("DATA").Columns("A:D").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("B1:C2"), CopyToRange:=Range("A4"), Unique:=False
隱藏偶數行:
ActiveSheet.UsedRange.Rows.Count //最後下到上第一個非空行
For i = ActiveSheet.UsedRange.Rows.Count To 2 Step -1
If i Mod 2 = 0 Then Rows(i).Hidden = True
Next i
這樣,把常用的的VBA程式碼儲存下來,把每條語句加上註釋,多多使用。
好多程式碼都是可以套用的,不用背程式碼。只要多蒐集整理,用的時候能找到就行。
-
5 # 神奇的VBA
VBA學習主要分為兩塊,
VBA基礎語法
Excel常用物件(單元格區域物件, 工作表物件,工作簿物件,應用程式物件等等)的方法屬性和事件
學習可以透過影片,書籍或者外掛進行。影片網上很多, 也可以購買影片教程。
書籍我推薦, ExcelHome出品的,Excel VBA其實很簡單這本書,還是很不錯的。
具體學習,一定要動手多抄抄程式碼, 抄完執行看看, 多總結!結合自己本職工作,多實踐!
回覆列表
帶著問題學習是最快的,如果要從頭開始學,花費的時間必然不少。可以在百度中輸入自己的問題描述,再在問題後加上vba,一般不麻煩的問題都有百度結果可以參考了。比如搜尋,多工作表彙總 vba。
vba中很重要的一步是要學會除錯,別人寫的程式碼有時候不明白為什麼這麼寫,或者自己改的程式碼執行出錯,透過除錯才能發現數據異常而後改正。