手把手教你VBA
十天前,餅乾在大家的幫助下,找到了需要幫助的小夥伴
很多人關心
他們的問題解決了沒有?
Of course!
只是
餅乾在整理問題的過程中發現
雖然大家都知道
VBA 是解決 Excel 重複操作問題的最佳方式之一
但很多小夥伴苦於沒有代碼基礎而上不了手
那麼,餅乾就想通過這個案例和大家聊一聊
如何寫一段自己的VBA?
餅乾認為只要三步
- 拆解問題
- 尋找套路
- 重組代碼
先一起看下小夥伴的問題
V001:葉女士 | 銀行
將一份EXCEL根據 "分支行" 欄位拆分成多份獨立的 EXCEL
拆解
抽象一下葉女士的問題
將1份X行的Excel拆分成Y份
可以這樣拆解
- 根據分支行新建Excel
- 複製粘貼至對應Excel
當然,這樣拆解是寫不出代碼的!
一般來說,有效的拆解是這樣的
拆解到每個步驟,並標註出操作次數
用循環提取次數,每個操作只做一次
比如這樣:
1. 排序-1次
對A列進行簡易排序2. 新建文件夾-1次 -文件夾路徑:當前路徑 -文件夾名稱:拆分結果對文件夾已存在的處理
-用戶選擇繼續或退出3. 循環-Y次1. 新建Excel-1次2. 複製粘貼-1次 複製粘貼表頭 複製粘貼內容-計算內容範圍3. 保存並關閉Excel-1次-保存的路徑:拆分結果-保存的名稱:具體分支行
當然
如果和餅乾一樣是老司機的話完全可以跳過
套路
如果你拆分得比較好的話,你會發現
你的每個小目標早有人寫好了套路
什麼?
看不懂別人的代碼?
所有 "." 讀成 「的」
所有 "=" 讀成 「是」
是的,你已經吃下了翻譯魔芋
- 排序
使用自定義排序,詳細的語法可以參考:
一張圖教你用VBA自定義排序
- 新建文件夾
把路徑設在當前文件夾,就只有文件夾名字一個地方要改了
Dim iPath As StringniPath = ThisWorkbook.Path & "拆分結果"nMkDir iPathniPath = iPath & ""n
文件夾已存在時的處理
MsgBox對話框交互,也只有提示信息一個地方要改
Dim iPath As StringniPath = ThisWorkbook.Path & "拆分結果"nIf Dir(iPath, vbDirectory) = "" Thenn MkDir iPathnElseIf MsgBox(" 目標文件夾已存在,若繼續操作將覆蓋同名文件,是否繼續?", vbOKCancel) = vbCancel Thenn Exit SubnEnd IfniPath = iPath & ""n
- 循環框架
循環框架是這篇文章最難的地方了
難就難在這個套路不太常用
雙變數單循環框架,其實很適合處理區間長度的問題
j 是首行,i 是尾行,循環操作後 j = i + 1
j = 2nFor i = 2 To ActiveSheet.[A1].CurrentRegion.Rows.Countn If ActiveSheet.Range("A" & i) <> ActiveSheet.Range("A" & i + 1) Thenn do Sthn j = i + 1n End IfnNextn
下面兩段都是在這個循環內的
- 新建/關閉Excel
新建、保存和關閉都只有一行
Dim iWkb As WorkbooknSet iWkb = Workbooks.AddniWkb.SaveAs iPath & ActiveSheet.Range("A" & i).ValueniWkb.Close Falsen
保存的時候記得加上文件名
- 複製粘貼
使用了 Resize 進行了範圍的重選,複製粘貼可以參考
九九乘法表?三行就夠了!
ActiveSheet.[A1].Resize(1, 3).Copy [A1]nActiveSheet.Range("A" & j).Resize(i - j + 1, 3).Copy [A2]n
聰明的小夥伴一定能看出來
如果要拆分 N 列,只要把 Resize 的第2個參數改成 N 就可以了
而把 Resize 改成 EntireRow 就可以進行整行的拆分
重組
把套路根據拆解拼起來
屬於你的VBA代碼就出爐了
放大看效果(動圖裡只留了5個分支行)
在我的公眾號
餅乾數數 CookieData
回復
報表拆分
看看你和餅乾寫得是不是一樣
推薦閱讀:
※VBA 如何把字元串轉換為可執行語句?
※有哪些學習vba的好書推薦?現在學習vba是否有些過時?現在比較好的操縱word和excel的方式有哪些?
※請各位VBA大神救命!?
TAG:MicrosoftExcel | VBA |