一小時(shí)搞定簡單VBA編程 Excel宏編程快速上手

Excel宏編程可以快速完成批量表格操作:復(fù)制粘貼芍秆、數(shù)據(jù)過濾等契沫,宏代碼基于VB語言實(shí)現(xiàn)欺旧,有基礎(chǔ)的編程經(jīng)驗(yàn)就能快速閱讀。下面是我的學(xué)習(xí)筆記让网。

1. Excel VBA編輯界面

(進(jìn)入路徑: sheet名稱 --> 鼠標(biāo)右鍵菜單 --> 查看代碼)

2. 輸入代碼方法:

在VBE編輯器的代碼模塊中輸入VBA代碼呀忧,通常有以下幾種方法:
■ 手工鍵盤輸入;
■ 使用宏錄制器溃睹,即選擇菜單“工具——宏——錄制新宏”命令而账,將所進(jìn)行的操作自動(dòng)錄制成宏代碼;
■ 復(fù)制/粘貼代碼因篇,即將現(xiàn)有的代碼復(fù)制后泞辐,粘貼到相應(yīng)的代碼模塊中;
■ 導(dǎo)入代碼模塊:文件-->導(dǎo)入文件 **不用的模塊可以:文件-->移出模塊

3. VB代碼閱讀掃盲

(1) 模塊聲明:

Sub sName() ... End Sub
Sub xxxxx()
XXXXXXXXX
End Sub

(2) 變量聲明:

Dim sPara As sType
Dim para1, para2, para3
Dim para4 As workbook, para5 As String
Dim G As Long

(3) 選擇結(jié)構(gòu):

With ... End With
If condition Then ... End If
With Workbooks(1).ActiveSheet
For G = 1 To Sheets.Count
Wb.Sheets(G).UsedRange.Copy       .Cells(.Range("B65536").End(xlUp).Row + 1, 1)
Next
WbN = WbN & Chr(13) & Wb.Name
Wb.Close False
End With

(4) 循環(huán)結(jié)構(gòu)

Do While condition ... Loop
For i = 0 to 100 ... Next

(5) 輸出Log:

MsgBox sString

解析拷貝路徑下所有Excel到一個(gè)工作表下的示例:


Sub 合并當(dāng)前目錄下所有工作簿的全部工作表()  #模塊名稱
Dim MyPath, MyName, AWbName         #變量聲明
Dim Wb As workbook, WbN As String
Dim G As Long
Dim Num As Long
Dim BOX As String
Application.ScreenUpdating = False          #停止屏幕刷新
MyPath = ActiveWorkbook.Path                #獲取當(dāng)前工作文件路徑
MyName = Dir(MyPath & "\" & "*.xls")        #獲取當(dāng)前文件名(截取字符串)
AWbName = ActiveWorkbook.Name           #獲取當(dāng)前BookName
Num = 0                             #準(zhǔn)備進(jìn)入循環(huán)處理
Do While MyName <> ""                   #第一個(gè)循環(huán)體:遍歷所有文件 終止條件是 文件名為空
If MyName <> AWbName Then               #條件:文件名當(dāng)前激活文件不同
Set Wb = Workbooks.Open(MyPath & "\" & MyName)      # 設(shè)置工作表的名稱(當(dāng)前Sheet Name)
Num = Num + 1                       #計(jì)數(shù)用于輸出
With Workbooks(1).ActiveSheet
.Cells(.Range("B65536").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
#賦值語句:激活Sheet的A列最后一個(gè)單元格賦值為MyName去掉‘.xls’的部分
#Left 截取字符串 去掉了'.xls'
#workbooks(n) 為取工作簿 的寫法
#A65535(一個(gè)極大數(shù))單元格向上惜犀,最后一個(gè)非空的單元格的行號
For G = 1 To Sheets.Count                   #嵌套循環(huán)體:遍歷文件的所有Sheets
Wb.Sheets(G).UsedRange.Copy .Cells(.Range("B65536").End(xlUp).Row + 1, 1)   
    #賦值所有內(nèi)容到以結(jié)束內(nèi)容空一行開始的表格中
Next                                    #且套循環(huán)體結(jié)束                            
WbN = WbN & Chr(13) & Wb.Name           # & 為合并字符串的符號       
Wb.Close False                          #對于文件操作結(jié)束铛碑,關(guān)閉Excel文件
End With                                #退出第二個(gè)判斷
End If                              #退出第一個(gè)判斷
MyName = Dir                            #怎么拿到第二個(gè)bookName
Loop                                    #循環(huán)體結(jié)束
Range("B1").Select                      #選中B1
Application.ScreenUpdating = True           #允許Excel屏幕刷新
MsgBox "共合并了" & Num & "個(gè)工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
End Sub

常用模塊:

  1. 把一個(gè)workBook的一塊表格拷貝到另一個(gè)WorkBook中的一般化方法:
    上面的代碼中是一種簡單的實(shí)現(xiàn):拷貝所有內(nèi)容到空行區(qū)域
    需要將拷貝的內(nèi)容和粘貼的位置控制更加精準(zhǔn)控制:

拷貝指定位置到指定位置:
Workbooks("工作簿1.xls").Sheet1.Range("A1:C50").Copy ThisWorkbook.Sheet2.Range("A1")

  1. 找到粘貼位置:
    b=sheet2.[BI].end(xlToLeft).row+1 獲取最后一次編輯的各自的列號虽界!
    .Range("B65536").End(xlUp).Row + 2 最后一次編輯的格子的行號
    A1 直接編輯
    .Cells(nRowNo, nColNo)
    ...

一個(gè)將多個(gè)相同格式表格合并生成橫表的例子:

Sub 合并當(dāng)前目錄下所有工作簿的全部工作表()
 
Dim MyPath, MyName, AWbName
Dim Wb As Workbook, WbN As String
Dim G As Long
Dim Num As Long
Dim BOX As String
Dim HasTitil As Boolean
Dim LastRange As String
Dim CurRowNo As Long
 
Application.ScreenUpdating = False
MyPath = ActiveWorkbook.Path
MyName = Dir(MyPath & "\" & "*.xls")
AWbName = ActiveWorkbook.Name
Num = 0
HasTitil = False
 
With Workbooks(1).ActiveSheet
.Cells(1, 2) = "Cor.Name"
Do While MyName <> ""
If MyName <> AWbName Then
Set Wb = Workbooks.Open(MyPath & "\" & MyName)
Num = Num + 1
.Cells(1, Num + 2) = Left(MyName, Len(MyName) - 4)
 
If HasTitil <> True Then
 
Wb.Sheets(1).Range("A4:B43").Copy .Cells(2, 1)
Wb.Sheets(1).Range("E4:F43").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
Wb.Sheets(2).Range("A5:B73").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
Wb.Sheets(2).Range("E5:F73").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
Wb.Sheets(3).Range("A4:B32").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
Wb.Sheets(3).Range("E4:F32").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
Wb.Sheets(4).Range("A5:B100").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
 
HasTitil = True
End If
 
CurRowNo = 2
Wb.Sheets(1).Range("D4:D43").Copy .Cells(CurRowNo, Num + 2)
CurRowNo = CurRowNo + 40
Wb.Sheets(1).Range("H4:H43").Copy .Cells(CurRowNo, Num + 2)
CurRowNo = CurRowNo + 40
Wb.Sheets(2).Range("D5:D73").Copy .Cells(CurRowNo, Num + 2)
CurRowNo = CurRowNo + 69
Wb.Sheets(2).Range("H5:H73").Copy .Cells(CurRowNo, Num + 2)
CurRowNo = CurRowNo + 69
Wb.Sheets(3).Range("D4:D32").Copy .Cells(CurRowNo, Num + 2)
CurRowNo = CurRowNo + 29
Wb.Sheets(3).Range("H4:H32").Copy .Cells(CurRowNo, Num + 2)
CurRowNo = CurRowNo + 29
Wb.Sheets(4).Range("D5:D100").Copy .Cells(CurRowNo, Num + 2)
 
Wb.Close False
End If
MyName = Dir
Loop
 
End With
 
Range("B1").Select
Application.ScreenUpdating = True
End Sub
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汽烦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子莉御,更是在濱河造成了極大的恐慌撇吞,老刑警劉巖俗冻,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牍颈,居然都是意外死亡迄薄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門煮岁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讥蔽,“玉大人,你說我怎么就攤上這事画机∫鄙。” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵步氏,是天一觀的道長响禽。 經(jīng)常有香客問我,道長荚醒,這世上最難降的妖魔是什么芋类? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮界阁,結(jié)果婚禮上侯繁,老公的妹妹穿的比我還像新娘。我一直安慰自己泡躯,他們只是感情好巫击,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著精续,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粹懒。 梳的紋絲不亂的頭發(fā)上重付,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音凫乖,去河邊找鬼确垫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帽芽,可吹牛的內(nèi)容都是我干的删掀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼导街,長吁一口氣:“原來是場噩夢啊……” “哼披泪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搬瑰,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤款票,失蹤者是張志新(化名)和其女友劉穎控硼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艾少,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卡乾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缚够。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔妨。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谍椅,靈堂內(nèi)的尸體忽然破棺而出误堡,到底是詐尸還是另有隱情,我是刑警寧澤毯辅,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布埂伦,位于F島的核電站,受9級特大地震影響思恐,放射性物質(zhì)發(fā)生泄漏沾谜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一胀莹、第九天 我趴在偏房一處隱蔽的房頂上張望基跑。 院中可真熱鬧,春花似錦描焰、人聲如沸媳否。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽步绸。三九已至,卻和暖如春瓤介,著一層夾襖步出監(jiān)牢的瞬間吕喘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工刑桑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氯质,地道東北人祠斧。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜓陌。 傳聞我的和親對象是個(gè)殘疾皇子觅彰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.1 VBA是什么 直到90年代早期,使應(yīng)用程序自動(dòng)化還是充滿挑戰(zhàn)性的領(lǐng)域.對每個(gè)需要自動(dòng)化的應(yīng)用程序,人們不得...
    浮浮塵塵閱讀 21,756評論 6 49
  • VBA訂制工具欄 http://club.excelhome.net/thread-1047254-1-1.htm...
    大海一滴寫字的地方閱讀 2,246評論 0 0
  • 本例為設(shè)置密碼窗口 (1) If Application.InputBox(“請輸入密碼:”) = 1234 Th...
    浮浮塵塵閱讀 13,650評論 1 20
  • 靜靜地坐在昏暗之中 看蝙蝠引出了夜的清涼 妄想著揮拳 把這初夏的日子擊倒 來享受濃稠時(shí)光的汁液
    長恨水流閱讀 138評論 0 1
  • 北宋時(shí)钮热,蘇東坡被官員告發(fā)填抬,說他的詩諷刺新政隧期,有不臣之心飒责,皇帝判蘇東坡下獄仆潮,聽候發(fā)落。 “不臣之心”性置,在舊社會(huì)是極大...
    熊群閱讀 879評論 0 8