Excel VBA 如何快速學習?
最討巧的方式是:
1)對想實現的功能手工操作一遍,同時錄製宏2)根據錄製的宏,更改參數及簡單修改代碼(加IF或者For循環)。下圖是我寫的第一個VBA代碼,準確說是拿Macro錄製後改出來的。
詳情見Excel 有哪些可能需要熟練掌握而很多人不會的技能? - 何明科的回答3)搜索引擎各種查,加上根據VBA的提示各種改。具體教程和案例,可以關注這個:粉絲回饋:程序讓你更性感 - 數據冰山 - 知乎專欄
————————————————————更多文章關注我的專欄:數據冰山 - 知乎專欄2016/9/27
過了這麼久才更新,內心很多小慚愧咆哮而過。
這次更新主要說一下循環,謝謝大家。
計算機之於人的優勢之一在於,可以準確而不厭煩地重複某種動作,Excel中的數據處理,有時正是需要重複某種操作,尤其是面對體量較大的基礎數據時。
奏是說,重複、枯燥滴數據處理,VBA快速又準確。也只有在這種情況下,才能在眾人的驚呼聲中完美裝那啥。
重複,在編程中奏是循環,指定範圍,然後對範圍中的對象進行既定的操作。主要是是如下三個問題:
1,如何指定範圍,奏是循環出現的範圍;
2,如何在範圍中定位對象,奏是指定需要操作的對象;
3,如何指定操作內容;
同志們,讓我們舉起一個活生生的小栗子:
話說「人民大食堂」是大家吃飯飯的地方,某一周吶,總共為大家提供五個菜,每人可以選四個,可選菜如下:
No.1 干煸菜花
No.2 香焗茄子
No.3 藕盒
No.4 烤串
No.5 涼拌藕
哈哈,其實是俺的私房菜,有圖有真相,大家賤笑啦。
有4人吃飯,分別是上官一,公孫二,司馬三和歐陽四,食堂堂主有一個神奇小表格,用來記錄大家一周內每天的選餐情況,至於他為啥記錄這東西,俺也不知道,可能他是個變態吧。
表格滴結構是下面這個樣子滴:
表1,「當日用餐情況」,用來記錄某日4個人的選餐情況,如下:
表2到表5,用於記錄4個同志一周內每天的選餐情況,每一列表示一天,如上官一同志的選餐情況如下,9/17日的選餐與表1中「B2」單元格的內容相對應:看來食堂堂主果然是個變態,他到底要實現什麼功能呢?奏是在表1的「B1」單元格中輸入9/12-9/18中的任一日期,嘎嘣一下就可以得到4個人這一天的選餐情況,信息就來源於後面的4個表格,俺想,這可能奏是大數據吧,不管你信不信,反正俺是信了。
關於如何實現這個功能,俺們有一個首先要面對滴問題,在循環的過程中,每一次操作的對象都是變化滴,之前俺們介紹的range("B2"),cells(2,2)神馬的就不靈了,他們都是從一而終滴正人小君君,俺們需要滴是善變滴,世界在變,俺們也在變滴那種,這可腫么辦捏?就在人民群眾提出迫切需要滴時候,一個無敵變色小龍龍粗線啦,它奏是編程界俗稱滴」變數「。
在程序語言中,俺們可以用字母或者字母滴組合表示變數.
舉個小栗子,指定字母」i「為變色小龍龍,一句話奏行(考慮到我們這個例子裡面,i主要代表1,2,3神馬的,我們把i定義為一個代表整數的變數),這句話奏是 Dim(定義) i as(作為) integer(整數),請自動忽略括弧中滴注釋,也奏是
Dim i as integer。
有了變數這個貨,俺們可以繼續討論大數據這個神奇滴東東咧,怎麼跟我們前面的三個問題相對應呢?堂主的變態小表格涉及兩個循環,分別來看一下對應的三個問題:
循環一是這樣滴:
"當日用餐情況"表中,需要為B2到B5單元格賦值,賦值的信息來源表根據A2到A5的值判斷,如為B3賦值時,A3值為「公孫二」,信息來源就是「公孫二」這個表格咧;
1,如何指定範圍,奏是循環出現的範圍;
循環一的操作範圍奏是"當日用餐情況"表中B2到B5,其中B不變,也就是列不變,行數從2變到5,利用變數「i」表示出來是這樣滴:
For i=2 to 5
Next i
奏用i來表示行數。
2,如何在範圍中定位對象,奏是指定需要操作的對象;
在指定的i=2 to 5的範圍內,i從2變到5,每次增加1,cells(i,2)就可以分別代表從B2到B5這幾個單元格了,所以上面這兩句話也就指定了俺們的操作範圍。
3,如何指定操作內容;
操作內容是在循環範圍內對指定的對象所做的操作,那麼應該寫在什麼地方呢,嘿嘿,當然就是For i=2 to 5和Next
i之間啦,因為這兩句之間就是俺們的操作範圍嘛。
循環一中對每一個對象的操作其實奏是另外一個循環,也奏是小堂主的循環二,這裡有一個嵌套結構。
循環二是這樣滴:
選定信息來源表後,如前面所說的B3的信息來源就是「公孫二」這個表格,對其A1到G1的值進行判斷,如其值與「當日用餐情況」表B1的內容相同,則將對應列設定為信息來源列,對選定列中的選餐信息進行整合併賦予「當日用餐情況」B3單元格。舉例:B1值為"2016/9/17",則將「公孫二」表格F列為信息來源列,對選餐信息進行整合併賦予「當日用餐情況」B3單元格,寫成「涼拌藕+藕盒+烤串+干煸菜花」。
俺們先來給這個循環定義變數,Dim j as integer,俺趕腳大家都理解這句話了,這個循環的三個關鍵問題該如何分析呢?
3.1,如何指定範圍,奏是循環出現的範圍;
循環二的操作範圍奏是信息來源表的A1到G1,其中1不變,也就是行數不變,列數從1變到7,利用變數「j」表示出來是這樣滴:
For j=1 to 7
Next j
奏用j來表示列數。
3.2,如何在範圍中定位對象,奏是指定需要操作的對象;
在指定的j=1 to7的範圍內,j從2變到7,每次增加1,cells(1,j)就可以分別代表從A1到G1這幾個單元格了,所以上面這兩句話也就指定了俺們的操作範圍。
3.3,如何指定操作內容;
這裡的操作需要判斷A1到G1的單元格值是否與「當日用餐情況」表B1的內容相同,如相同,則該列為信息來源列,通過宏錄製是無法實現判斷功能滴,這時候俺們有一句中英文結合的小咒語:
If the value of B2 in 」當日用餐情況「 sheet 等於 that of A1
to G1中的一個 in 信息來源表, then
幹活
end。
幹活的內容是啥呢? 「當日用餐情況」表Bi值設定為信息來源表中信息來源列j的第2行+第3行+第4行+第5行,翻譯成機器語言:
「當日用餐情況」表 滴 Bi單元格 滴 值為信息來源表 滴 J2 滴 值加J3 滴 值加J4 滴 值加J5 滴 值
翻譯成程序語言:
Sheets(「當日用餐情況」).cells(i,B).value=
sheets("信息來源表").cells(2,j).value+
sheets("信息來源表").cells(3,j).value+
sheets("信息來源表").cells(4,j).value+
sheets("信息來源表").cells(5,j).value
"信息來源表"這幾個字是變化滴,應該與「當日用餐情況」表的Ai值保持一致,所以表的名字應該是「Sheets(「當日用餐情況」).cells(i,1).value」,這樣程序應當作出相應修改,同時在幾個菜名中間加上「+」,這奏是最終的程序語言了:
Sheets(「當日用餐情況」).cells(i,B).value=
sheets(Sheets(「當日用餐情況」).cells(i,1).value).cells(2,j).value + 「+」
+sheets(Sheets(「當日用餐情況」).cells(i,1).value).cells(3,j).value+ 「+」
+sheets(Sheets(「當日用餐情況」).cells(i,1).value).cells(4,j).value+ 「+」
+sheets(Sheets(「當日用餐情況」).cells(i,1).value).cells(5,j).value
每個菜中間用「+」連接。
整個程序寫下來是下面這個樣子滴:
Dim i As Integer"定義變數i
Dim j As Integer"定義變數j
For i = 2 To 5"循環一的範圍
For j = 1 To 7"循環二的範圍
If
Sheets(Sheets("當日用餐情況").Cells(i,
1).Value).Cells(1, j) = Sheets("當日用餐情況").Cells(1,
2).Value Then"咒語開始
Sheets("當日用餐情況").Cells(i, 2).Value = _
Sheets(Sheets("當日用餐情況").Cells(i, 1).Value).Cells(2, j) + "+" _
+ Sheets(Sheets("當日用餐情況").Cells(i, 1).Value).Cells(3, j) + "+" _
+ Sheets(Sheets("當日用餐情況").Cells(i, 1).Value).Cells(4, j) + "+" _
+ Sheets(Sheets("當日用餐情況").Cells(i, 1).Value).Cells(5, j)"咒語中間的幹活內容
End If"咒語開始
Next j"循環二結束
Next I"循環一結束
通過這個小栗子,希望對大家理解循環能有一點兒幫助,關於VBA,還沒想好後面寫點兒什麼,如果大家有啥具體需求,可以提出來,我盡量用小栗子說明。
這些是VBA入門的基礎信息,大家賤笑啦,尤其是精通VBA的少俠們,俺這真真是班門擺弄斧子了,內心很多小慚愧咆哮而過,謝謝大家。
////////////////////////////////////////////////////////////////////////////////////////////////////////
2016/7/23
非常感謝大家的關注,那麼,更新來啦。
之前的內容是VBA的工作原理,了解了原理之後,嗨嗨,做點兒自己想做的吧。
馬上當家做主人啦,讓Excel幹啥,他奏得幹啥,對,奏是這種趕腳。先來分析一下,Excel的日常數據操作內容,根據俺這些年的人生經驗,主要是下面幾點:
一、指定需要進行操作的「Sheet」;
二、指定目標sheet中的操作區域,一般可以為某行、某列、某單元格,反正你選啥就是啥;
三、完成對指定區域的操作,比如輸入值或者函數、剪切複製神馬滴。
上面的這些內容,都可以通過VBA來完成,連動動手指這樣的活兒都不幹了,高品質懶人都是一勞永逸滴。
下面逐條分析一下吧,先聲明一下,每一個步驟的實現方法都有很多,我就撿喜歡的說吧。
一、指定需要進行操作的「Sheet」
每個Excel文件裡面都有很多shit,哎呀呀,口語不大好,說臭了,是有很多sheet,如何指定需要的sheet呢,這就需要分析一下每個sheet的關鍵參數,俺們還是來舉個小栗子吧。
話說「悟空」、「八戒」、「沙僧」是三個異父異母的親兄弟,悟空行大,順序號是1,八戒行二,順序號是2,沙僧行三,順序號是3,哥兒仨一個頭磕到地上,保著唐僧西天取經,唐和尚為了方便分配任務,給他們在生產大隊里設定了代號,悟空的代號是「潑猴」,八戒的代號是「獃子」,沙僧的代號是「老沙」。
現在御弟哥哥要殘忍滴給大家分配任務,分配形式是單獨面談,先是悟空,那麼唐長老怎麼叫他呢,肯定不是「大聖哥哥小親親」神馬的,前面交代的劇情裡面木有這個東東,正確滴打開方式有三種:
1,悟空
2,徒弟1
3,潑猴
再介紹下去,大家要進入劇情啦,還是回到VBA滴問題,實在想看劇情,請關閉知乎,打開電視。
三種表示方式,在Excel裡面都有體現,如下,黃圈圈是名字,大家都能看到;藍圈圈是代號,組織內可見,通過屬性窗口或者編程界面可見;綠線是序號,是排列順序。
在三個表格中,指定表格「悟空」的方法如下,分別與上述三種方式相對應:
1, Sheets("悟空"),名稱表示
2, Sheets(1),序號表示
3, 潑猴,代號表示
任選一種,指定表格滴任務就完成啦。
二、指定目標sheet中的操作區域
指定表格完成後,就該選擇操作區域了,可以是單元格,也可以是行或列。
單元格可以用cells表示,也可以用range表示,削微有一點區別,比如同樣表示單元格B2,使用cell表示為cells(2,2),使用range則表示為range("B2")。
行和列腫么表示捏?
如第一行,rows(1)或者rows("1:1")
如第一列,columns(1)或者columns("A:A")
還是那句話,有很多其他滴實現方式,還是撿我喜歡滴,好用滴說。
三、完成對指定區域的操作
指定了某一區域以後,就要進行我們要的操作啦。
那麼問題來了,我現在有明確的想法,要在第一個sheet的A1單元格中輸入「我要為張默文點贊」,完全不知道腫么寫呀,只知道指定sheet,指定單元格,然後捏?還是不會呀,我要的東西你帶來了嗎?
其實只要把「要在第一個sheet的A1單元格中輸入』我要為張默文點贊『」這句大白話翻譯一下就行咧,首先翻譯成機器語言,「第一個sheet 滴 單元格A1 滴 值為"我要為張默文點贊"」,然後翻譯成程序語言,指定sheet和單元格時,用前面講的方法,兩個斜體加粗的「滴」用「.」表示,就是程序語句啦,sheets(1).cells(1,1).value="我要為張默文點贊",最後面的.value="我要為張默文點贊"就是所說的特定操作啦。
對於不了解編程的同志,與其費力的介紹對象、屬性、方法神馬滴,還是這種方式簡單、直接一點兒,總有人喜歡簡單粗暴滴,程序員大哥大姐們又要賤笑啦。
那位看官說啦,俺們的需求可不只是輸入個「我要為張默文點贊」這麼簡單,俺們還要為張默文付出更多,我要把這句話加粗顯示,怎麼實現呢?我對你們那些黑話也不清楚呢,我哪知道這個操作怎麼用程序語言表示,木有關係,我們有法寶,「宏錄製」,大殺器呀。
方法我們之前介紹過啦,我先選中A1單元格,然後開始錄製,下面是我錄製的結果
Selection.Font.Bold=True,翻譯成機器語言,Selection(選中的內容,即A1單元格) 滴 Font(字體) 滴 Bolt(加粗)是True(真的),這樣我們就得到我們要的方法啦,也就是在「cells(A1).」的後面要加的東西。
讓我們從頭回顧一下,要在第一個Sheet的A1單元格中輸入「我要為張默文點贊」,並加粗顯示,該如何實現呢?
Step1,翻譯成機器語言
第一個sheet 滴 A1單元格 滴 值為「我要為張默文點贊」
A1單元格 滴 字體 滴 加粗是真的
Step2,翻譯成程序語言,
結合前面講的指定sheet和區域的方法以及錄製得到的操作方法,寫出代碼,用「.」代替「滴」
sheets(1).cells(1,1).value="我要為張默文點贊"
sheets(1).cells(1,1).Font.Bold=True
把這串代碼複製到宏1()中,執行以下,奏看到下面的結果啦
還有啥操作是不會滴,錄製奏行咧,這下大家滿意了吧,謝謝大家。
介紹到目前為止吶,對於如何把手動操作轉化為代碼,同志們大概可能也許應該有個認識啦,如果要實現超人滴功能,就要加一些循環、選擇神馬滴進去啦。
如果大家喜歡,咱們下回接著說。
謝謝大家。
////////////////////////////////////////////////////////////////////////////////////////////////////////2016/6/25看到這個問題,忍不住想跟大家分享一下Excel VBA從入門到卧室的學習過程,希望大家能夠喜歡。 入門滴話,可以參考下面滴步驟:一、理解Excel VBA的工作原理
對編程不熟悉的童鞋,想要快速學習Excel VBA,應充分理解程序的運行過程,將程序的運行過程與人工操作相對應,理解程序可代替人工操作的原理,才能自由控滴制VBA這個小機器,才能為所欲為、肆無忌憚,才能高高興興上班去,平平安安回家來。
利用Excel VAB完成某種功能,其實是一段程序在Windows中的執行過程,該執行過程可模擬人的操作行為,實現功能的自動化,也就是人工小智能,下面通過一段人的操作行為與代碼執行過程的對比,來介紹VBA的工作原理。
日常操作Excel,通常是對Excel中某一選定區域的操作,現假定需要實現的功能如下:將當前文件「Sheet1」中「A1」單元格的值設定為「100」。
人工操作的方法可按如下步驟完成:
1,將「sheet1」激活,設置為當前工作表;
2,選中單元格「A1」,將其設置為當前單元格;
3,在當前單元格「A1」中輸入「100」。
對應的VBA代碼如下:
SubValue()
Sheets("Sheet1").Select
Range("A1").Select
ActiveCell.Value = "100"
End
Sub
其中Sub Value()及End Sub兩句分別表示程序的開頭和結尾,與操作過程無對應關係。中間的三句代碼分別與人工操作的三個步驟相對應,選中「sheet1」,選中「A1」、設定選中的單元格值為「100」,如此分析可以看出,程序運行的每一步都是和人工操作相對應的。
二、獲取代碼
問題來了,俺還不會寫代碼,分析個屁屁呀,木有關係,代碼都是可以自動的生成的,只需找到「宏」這位小哥就行啦。不過,這位小哥是不會輕易跟你見面噠,需要在Excel中召喚一下,請看VCR,啊啊,木有VCR,慚愧呀。
1,在「工具欄」空白處右擊,粗線下面的彈出菜單,選擇「自定義功能區」;
2,在「開發工具」選項前的方框中打勾勾,選擇右下角的」確定「,完成。不用集齊龍珠,就這麼神奇滴成功啦。
此時,可看到工具欄中多出了一般人木有的「開發工具」選項。 現在,我們可以通過「宏」錄製的方式得到一段代碼了,一旦啟動宏錄製功能,你在Excel中所作的任何操作都會以VBA代碼滴形式如實噠記錄下來,要啟動錄製功能,只要單擊下面這個按鈕奏行了。 單擊「錄製宏」按鈕後,該按鈕變成了「停止錄製」。 同時跳出如下窗口,選擇「確定」即可。記錄開始後,俺做了如下操作:
1,在單元格「A1」中輸入「數字」;
2,在單元格「A2」中輸入「1」;
3,利用填充的方式,在「A2」到「A101」中輸入數字1到100;
4,選中A列
5,選中「篩選」功能;
6,僅顯示如下數字
"13" ,
"17", "21", "25", "32", "35",
"38", "43", "49", "5", "51",
"56", "6", "62", "63", "71", "75","77", "80", "85", "87",
"88", "94", "95", "97", "99"
該操作過程需要手動選擇列表中的每一個數字;
7,顯示結果如下:
完成上述操作後,選擇「停止錄製」按鈕,此時,我們已經得到了記錄上述操作過程的VBA代碼,代碼在哪裡捏?選擇「Visual Basic」按鈕即可,細心的童鞋一定也發現了裝×大法,「Alt+F11」。 在模塊1中可以看到,代碼是這個樣子滴:看官們可以自己分析一下這段代碼,看代碼是如何與俺的操作相對應滴。
Sub 宏1() " 程序開始
" 宏1 宏(注釋)
Range("A1").Select "選擇「A1」單元格(步驟1)
ActiveCell.FormulaR1C1 =
"數字" "在單元格「A1」中輸入「數字」(步驟1)
Range("A2").Select "選擇「A1」單元格(步驟2)
ActiveCell.FormulaR1C1 =
"1" "在單元格「A2」中輸入「1」(步驟2)
Selection.AutoFill
Destination:=Range("A2:A101"), Type:=xlFillSeries "利用填充的方式,在「A2」到「A101」中輸入數字1到100,Autofill(步驟3)
Columns("A:A").Select "選中A列(步驟4)
Selection.AutoFilter "選中「篩選」功能(步驟5)
ActiveSheet.Range("$A$1:$A$101").AutoFilter Field:=1,
Criteria1:=Array("13" _
, "17", "21",
"25", "32", "35", "38", "43",
"49", "5", "51", "56", "6",
"62", "63", "71", "75", _
"77",
"80", "85", "87", "88", "94",
"95", "97", "99"), Operator:=xlFilterValues "僅顯示選定的數字(步驟6)
End
Sub "程序結束
三、逐步分析代碼
那位說了,VBA代碼的運行過程,一般都是「嗖」一下,Done,俺怎麼知道俺的分析對不對呢,程序執行一步,俺就想看一下結果噻。
這個很簡單,使用程序的單步調試,讓程序按指揮,一步步運行,這樣滴描述,讓程序員大哥大姐們賤笑啦,哈哈。
下面,讓我們再次舉起剛才那個活生生、血淋淋的小栗子,現場直播一下程序的運行過程。
請大家同時打開Excel的工作表界面和VBA程序界面,最好並排顯示,就像俺這樣滴,這樣你就能一邊看控制程序單步運行,一邊看錶格中的運行結果啦。
如何開始程序捏?激活程序窗口,也就是點一下程序那半邊窗口滴意思。按一下鍵盤上滴「F8」,嗯,當前執行的語句好黃啊,從我按下「F8」的那一刻,他就變了,繼續按「F8」,程序就會逐句變黃,也奏是在逐句執行,這個時候觀察表格窗口,就能看到每一句代碼的運行結果。
比如,執行完步驟4時,整個畫面是這個樣子滴,這麼逐句滴分析下來,肯定能充分理解代碼滴含義咧。
總結一下,從一個木有啥編程經驗的VBA小白,想要快速學習VBA,很簡單,理解ta,得到ta,詳細分析ta,脫單有望啊。
今天先回答道這裡,如果大家喜歡呢,會繼續介紹。
謝謝大家。
""""""""""""""""" 以下所有文字均為答主手敲,轉載請註明出處和作者 """"""""""""""""""
如有條件的話,可以遵循以下的步驟學習:
1) 理解基本的語法,上機練習簡單的操作
2) 反覆閱讀理解有經驗人士的代碼3) 對於一些簡單的需求,可以試著自己解決4) 對於VBA而言,同一個目標可以有很多實現方法。故同樣的需求,可比較別人的實現方法和自己的實現方法,並加以比較評判5) 隨著學習的深入,評判、重寫自己的代碼"""""""""""""""""""""""""""""""""""""""" 我是正文 """"""""""""""""""""""""""""""""""""""""
1. 一點歷史VBA,全稱Visual Basic for Applications。從名稱上看,至少包含了3個歷史階段的產物,依次是- BASIC- Visual Basic- Visual Basic for ApplicationsBASIC是一門古老的計算機語言,首次發表於1964年。BASIC語言貼近於英語語法,使用者也不需要對計算機硬體知識(尤其是內存管理)有很多了解,故對於非專業程序員,也能極為迅速的上手。使用BASIC,計算機上需要安裝一個叫「BASIC解釋器」的軟體,將BASIC程序代碼翻譯為計算機能夠識別的機器指令。同時,BASIC解釋器通常帶有一個文本編輯環境供輸入代碼。隨著個人電腦的普及,BASIC解釋器通常是作為預裝軟體出現,故用戶開機就能用上BASIC。
用於MITS Altair 8800型個人電腦的BASIC解釋器是微軟公司的第一個產品,由比爾蓋茨等微軟創始人親自開發。此後,微軟的DOS和Windows 3系列、Windows 9X系列都預裝了BASIC解釋器(稱為QBasic)。從Windows 2000開始QBasic不再預裝,但是QBasic仍然可以運行於Windows 10之上(只限32位)。
QBasic 運行於Windows 10從BASIC的歷史可以看出,這門語言本來就是為非計算機專業人士準備的,而且微軟公司與之有不解的淵源。之後的發展也是如此。
計算機軟體進入到圖形用戶界面時代,微軟公司開發了可以編寫Windows圖形應用程序的新語言Visual Basic以及對應的開發軟體Visual Basic IDE(所以Visual Basic既指一門語言又指微軟為此提供的開發軟體)。新語言Visual Basic繼承了BASIC語言的關鍵字和語法,仍然保持易學易用的風格。儘管Visual Basic解釋器是Windows操作系統的一部分,然而想用Visual Basic開發軟體,仍然需要獨立購買和安裝Visual Basic IDE。
最後一個非.Net版本的 Visual Basic,即 Visual Basic 6 (1998)運行於Windows 101996年,微軟開發了Visual Basic Scripting Edition(即VBScript)。顧名思義,VBScript適合快速書寫類似批處理的腳本。VBScript的語法與Visual Basic一致。直到今天,Windows依然內置了VBScript解釋器,以及能夠直接解釋文本代碼的Windows腳本宿主。所以使用VBScript無需另外投資。
微軟的Office系列產品同樣集成了VBScript解釋器,並提供了語言操控Office軟體本身的能力。這個VBScript被稱之為Visual Basic for Applications(即VBA)。目前主要Office軟體都集成了VBA的解釋器和集成開發環境(類似於一個簡化版的Visual Basic IDE)。換句話說不僅在Excel里,Word、PowerPoint也可以用VBA。VBA的運行環境稱之為宿主(Host)。比如,你在Excel裡面使用了VBA,那麼Excel就是宿主。這個概念也適用於VBScript,對應的宿主可以認為是Windows本身(實際上是Windows的一個組件:Windows腳本宿主WSH)。
那麼從VBA的歷史上我們可以看到,它實際上是由兩部分組成的:一個是語言本身的特性,另外一個是宿主提供的功能。語言本身具有通用性,而宿主相關的部分和不同的宿主有關。這篇文章也會對應的分為兩個部分,即通用的VBScript和Excel VBA。
2. 學習VBScript
學習VBScript,你只需要Windows系統本身。我們使用的工具是系統自帶的命令提示符、記事本和Windows腳本宿主。
2.1 環境
首先我們建一個工作目錄。以下兩種操作均可:1.新建一個文件夾,按住Shift然後滑鼠右擊,選擇「在命令提示符中打開」2.按Windows +R,輸入cmd,回車。例如想建立的工作目錄為 C:Work,那麼就輸入mkdir C:Work
cd C:Work
以下假設我們的工作目錄是C:Work。
接下來可以寫程序了。在命令提示符下輸入notepad hello.vbs
當記事本提示你創建新文件時,選擇「是」
比如我們寫一個從1加到100的程序。在記事本里輸入dim i,sum
sum = 0
for i = 1 to 100
sum = sum + i
next
wsh.echo sum
按Ctrl+S保存。
回到命令提示符,輸入cscript hello.vbs
命令提示符會輸出一些版本信息,然後會出現結果5050。如果嫌版本信息太羅嗦,就加一個/nologo的選項:
cscript /nologo hello.vbs
因為Windows對擴展名為.vbs的文件進行了綁定,所以也可以直接運行
hello.vbs
輸出的形式略有不同,稍後解釋。
2.2 基本語法
變數:與數學上的變數意義相同。變數用來存儲數據。變數不得使用數字作為開頭,原則上不要使用中文作為變數的名字。應使用字母和數字、下劃線,例如sum、my_result_0等都可以。字面量:在代碼中可見的數據,例如整數、小數和雙引號包裹、可由任意字元組成的字元串。如100、"Hello"、"標題"等。運算:與數學上的運算意義相同。關鍵字:VBScript自帶的命令符號,不得用於變數名稱。VBScript不區分大小寫。通常第一個字母大寫。注釋:單引號"直到行尾的所有內容,VBScript均予以忽略。聲明一個變數使用Dim關鍵字。儘管變數在第一次賦值的時候會自動聲明,但努力養成明確聲明變數的好習慣。"我是注釋
dim x "聲明了變數x
dim i,j "聲明了變數i和j
用操作符=給變數賦值。=右側的表達式將被求值,然後賦予=左側的變數
可以把字面量、運算的結果或者函數返回的值賦給變數。=賦值只適用於整數、字元串等簡單類型的賦值。Option Explicit "強制要求變數使用之前必須聲明
dim my_result
my_result = 1 "賦予字面量1
"獲得函數的返回值
my_result = InputBox("輸入一個數字","我的程序")
my_result = my_result * 2 "獲得運算的結果
WScript.echo my_result
函數與數學上的多元函數意義相同。函數需要零個或多個參數,返回一個運算的結果。上面的代碼在調用一個函數InputBox,並賦予其2個字元串參數,以逗號隔開。當不需要返回值時,括弧可以省略。
InputBox是VBScript的內建函數,而這段代碼最後的WScript.echo看起來也是個函數。即WScript.echo(my_result)的簡寫。這個「函數」並不是VBScript提供的,而是Windows腳本宿主的功能。不得不在這裡介紹是因為需要有一個輸出數據的方法,而輸出數據的方法VBScript本身並沒有提供。事實上Windows腳本宿主對WScript.echo的解釋也有不同,當用cscript hello.vbs調用腳本宿主時,WScript.echo輸出到命令提示符;當用wscript hello.vbs,或者直接運行hello.vbs時,WScript.echo表現為彈出對話框。
前面提到的代碼都是逐條執行的。而條件分支的含義是根據數據的不同而選擇性的執行不同的代碼。舉例
dim age
age = InputBox("輸入年齡")
If age &> 18 Then
WScript.echo "成年"
Else
WScript.echo "未成年"
End If
關鍵字 If-Then-Else-End If形成了兩個分支,習慣上分支內部的代碼最好給予一些空格縮進。If後面的語句是所謂條件表達式。整個表達式會被求值,若為Ture,則運行Then之後的語句後跳至End If,否則跳過Then後面的語句,直接從Else開始直到End If。如果沒有Else分支,則直接跳至End If。故Else分支是可選的,當然可以有多個分支:
dim age
age = InputBox("輸入年齡")
If age &< 18 Then
WScript.echo "少年兒童"
ElseIf age &> 65 Then
WScript.echo "老年"
Else
WScript.echo "其他"
End If
實際上相當於嵌套的分支:
dim age
age = InputBox("輸入年齡")
If age &< 18 Then
WScript.echo "少年兒童"
Else
If age &> 65 Then
WScript.echo "老年"
Else
WScript.echo "其他"
End If
End If
dim i
for i = 1 to 5
WScript.echo "Hello",i
next
關鍵字 for-to-next創建了一個循環。循環變數i依次賦值為1、2、3、4、5,每次賦值後,for-next之間的代碼都會完整執行一次。
2.3 獲取幫助
以上只是談到了VBScript最最基本的用法,能夠覆蓋大概60%的常用情景。但完整使用VBScript需要掌握80%的功能。答主極為推薦的Tutorial是下面這個:VBScript Tutorial只需要閱讀VBScript Basics的部分,就可以掌握80%。如果遇到了非常疑難的問題,應該參考最權威的官方文檔(MSDN):VBScript Language Reference3. 學習Excel VBA
對於想要學習Excel VBA的非程序員朋友,可能遇到的最大的一個門檻就是「面向對象編程」的概念。但對於掌握VBA,對「面向對象編程」先能夠理解到以下程度就基本OK了:我家有一隻寵物貓。這裡,寵物是一個類(class),我家的貓是這個類的一個對象(object)。貓是白色的,白色就是這個對象的一個屬性(property)。我家貓去做絕育就是設置(property set)該對象的另外一個屬性。貓吃罐頭是在執行該對象的一個方法(method)。
可以認為,Excel以類庫(Class Library)的方式擴展了VBScript。在面向對象編程中,對於一個類庫有兩種使用的方式:1是對類進行繼承(例如,類「貓科動物」就是對類「哺乳動物」的繼承);2是對類進行例化而形成特定的對象(例如,養一隻貓)。對於Excel來說,絕大多數時候在使用第2種方式,即關心如何產生和使用對象。
對於某種功能,Excel將其設置為屬性還是設置為方法是有講究的,通常來說,對象自身的特性(標題、尺寸)等會被設置為屬性,而涉及對象與其他對象交互的功能會被設置為方法。並不是所有的面向對象系統都如此。
本部分我們將設定一個簡單的需求:在工作表中創建一個10x10的矩陣,每個元素都是1~100之間的一個隨機整數。
3.1 環境
有兩種方式可使用Excel VBA,一個是使用Windows VBS引入Excel對象,一個是在Excel內部編程。前一種的好處是,因為程序在Excel外部,故可以連續處理多個Excel文件。後一種的好處是有一個集成開發環境(Excel VBE)可以使用,便於調試,缺點是代碼分散,且Excel必須啟用宏。
下面分別討論。
3.2 示例
第一種方法,仍然使用本文第二部分的環境,用記事本新建一個文件,錄入以下代碼:Option Explicit
Dim app,workbook,sheet
Dim row,col
Set app = WScript.CreateObject("Excel.Application")
app.Visible = True
Set workbook = app.WorkBooks.Add
Set sheet = workbook.Worksheets(1)
"10x10 random value
For row = 1 To 10
For col = 1 To 10
sheet.Cells(row,col).Value = CInt(Int((100 * Rnd()) + 1))
Next
Next
Set sheet = workbook.Worksheets(2)
"10x10 random value
sheet.Range("A1:J10").Formula = "=Int(Rand() * 100 + 1)"
「WScript.CreateObject("Excel.Application")」 是Windows腳本宿主提供的方法(method)。
WScript就是Windows腳本宿主對象,方法在本質上是這個對象的成員函數。當你的電腦中安裝了Excel之後,會在系統資料庫中註冊叫做Excel.Application這樣一個服務。換句話說,WScript.CreateObject("Excel.Application")相當於「啟動Excel這個軟體」注意到這裡使用了Set關鍵字而不是直接賦值,這其中的原因是=只適用於簡單數值的賦值,但函數WScript.CreateObject("Excel.Application")的返回值是一個對象句柄。凡對象句柄之間的賦值都要用Set。
接下來設置這個app對象的屬性Visible為True,意為把Excel程序顯示出來。如果批量處理很多文件,則不用設置這個屬性,程序將在後台運行,不會跳出很多Excel來。
我們知道啟動Excel時會自動新建一個工作簿(WorkBook),但編程創建的App對象不會自動創建工作簿。Excel中,已經打開的工作簿構成了一個工作簿集合。在VBA裡面多個同類的對象通常被歸攏到一個集合(collection)當中,而集合本身也是一個對象。在Excel VBA中有各種各樣的集合,工作簿集合、工作表集合、圖形集合等。對於集合對象有一些統一的方法,例如Add方法的含義是,在該集合中添加一個對象,並返回它。那麼Set workbook = app.WorkBooks.Add這句話執行後,Excel就創建了一個新的WorkBook,程序獲得了一個workbook對象。
每一個workbook對象在創立後,它的WorkSheets集合會自動添加3個工作表(如同Excel新建工作簿一樣)可以通過調用worksheets方法來得到某個工作表。(註:Excel 2013以及後續,workbook對象在創立後只會自動添加一個工作表)
對於第一個工作表,我們設置了兩重循環為10x10的矩陣設置隨機值。CInt()、Int()和Rnd()函數是VBScript內建函數,具體用法可查閱MSDN。對於第二個工作表,我們利用Excel自帶的公式得到隨機值。這就是所謂「達成同樣的目標有不同的方法」。
以上我們的代碼都在Excel外部運行。Excel內部有VBA的集成開發環境,仍然以隨機數為例:
在Excel中按Alt+F11組合鍵呼出集成開發環境。左側的工程管理窗口會列出所有打開的工作簿,每一個工作簿對應一個VBAProject。每個VBAProject下除了列出所有的工作表獨有的代碼之外,還有一個ThisWorkbook的項目文件,代表這個工作薄範圍內的代碼。除此之外,VBAProject還可能有窗體、用戶自己開發的類等等。
Excel 2013 Visual Basic for Applications Develop Environment,與Visual Basic 6非常相似。Excel 2016 Visual Basic 編輯器(微軟:對你們蘋果用戶做到這份兒已經夠意思了,要啥自行車啊)。我們將代碼放進ThisWorkbook中。這個代碼被一個Sub子過程包裹,名字是我們自己起的。這段代碼和剛才的代碼稍有不同,首先,對於一個句柄變數,聲明時最好指定它的類型,其次,由於代碼已經位於Workbook內部,故無需創建Excel進程、也無需創建workbook對象。Worksheets成為「內建函數」。而CInt等VBScript內建函數此處仍可以使用。
按F5,由於整個代碼塊只有一個子過程,該唯一子過程會立即執行。如果關閉了VBA集成開發環境,則可以在Excel菜單中執行「運行宏」來執行這段代碼。
最後,由於Excel的安全策略,含有代碼的文件需要保存為.xlsm格式。
3.3 獲得幫助
學習Excel VBA較為正規的圖書是 John Green的 Excel 2007 VBA Programmer"s Reference,中文版由Excel Home翻譯為《Excel 2007 VBA參考大全》。這本書應至少閱讀完前7章。閱讀完前4章即可以嘗試解決工作中遇到的問題了。
MSDN的Object model reference (Excel 2013 developer reference) 相當於一本「詞典」,經常翻閱非常有好處。
4 寫在最後
經常使用Excel的人士普遍對Excel公式掌握的出神入化,但Excel VBA卻遵循著不一樣的思維方式——它更接近於Excel軟體自身的運行規律,而不是數據層面的特點。VBScript和Excel VBA的系統性非常強,一本系統性強、例子豐富的書籍必不可少,MSDN乃居家必備。
當然搜索引擎也是一個好助手,把你的問題用英文表述直接Google,通常會獲取豐富的答案。不能訪問Google也很難科學上網的朋友可以試試 AOL - News, Sports, Weather, Entertainment, Local Lifestyle ,aol的搜索後端是Google提供的。
眾所周知,百度的中文技術資源質量一向低下(百度 - 話題精華),因此:
無論任何時刻都不要使用百度無論任何時刻都不要使用百度無論任何時刻都不要使用百度無論任何時刻都不要使用百度無論任何時刻都不要使用百度(特別重要的事情說5遍)總算可以回答這個問題了。。
自從之前看了怎樣才算精通 Excel? - Microsoft Excel關於excel的這個回答。( ⊙ o ⊙ )覺得自己之前簡歷還寫精通office啥的簡直不能更傻。迅速從頭開始學習到現在進階到了vba。剛開始最好不要看書,書里的東西太過磨嘰,簡單粗暴的主需要幾點:1.了解對象,屬性,方法,事件,模塊,類模塊,窗體,等概念。了解變數的類型。2.了解工作表,工作簿,單元格,等表示方法。3.了解循環和判斷語句和msgbox。4.知道怎麼錄製宏。5.知道常用的一些控制項,標籤,文本框,複選框,多頁,combobox,listview等,知道這些窗體的常用屬性等。以上幾點會了就足夠玩出很多花樣了。像做個生日提醒,做了人事管理,工資表自動製作和拆分啥的,總之基本的需要基本可以滿足。像什麼find語句查找篩選定位什麼的我是沒特意記,想用的時候直接就錄製宏然後拷貝有用語句。。之後如果再想進階可以看看數組,學學優化下速度,菜單欄更改添加,還有正則表達式啥的。以上,我最初看了蘭色幻想的vba80集,但是個人感覺那個課程順序並不好。但是課程的東西還算挺全面的。還有excel論壇的VBA常用代碼Excel VBA常用技巧代碼解析-ExcelVBA程序開發-ExcelHome技術論壇 -只看這兩個足夠滿足一般需求了。上面的答主回答的都很好,其實無論是vba或者是其他的編程,關鍵是邏輯和思路,語言基本上都是相通的,在這裡給你推薦10本vba方面的書吧,找個一兩本自己喜歡的,然後照著去操作一下,基本上入門沒問題了,然後找點實戰項目自己挑戰一下,慢慢就可以提高的。
1、Writing Excel Macros with VBA
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227265799
2、Wiley Excel VBA Programming for Dummies
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227265782
3、VBA for Modelers-Developing Decision Support Systems
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227265765
4、Microsoft Excel 2013 Programming by Example with VBA,XML and ASP
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227264533
5、Mastering VBA for Microsoft Office 2016
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227264231
6、Made Simple VBA for Excel Made Simple
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227264109
7、Learning to Love Microsoft Excel Visual Basic for Applications (VBA) Today
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227264102
8、Excel VBA 24-Hour Trainer
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227263796
9、Excel VBA-for Non-Programmers in Everyday language
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227263738
10、VBA and Macros Microsoft Excel 2010
下載鏈接:https://u12517748.ctfile.com/fs/12517748-227265742
搭建系統知識結構
不管是學習vba還是其他編程知識,或者其他技能,最重要的是快速搭建自己對這門知識的系統思維和框架。
不管是看書別怕,Excel VBA其實很簡單 (豆瓣);
還是通過視頻學習Excel2010公式與函數_IT技能;最重要的是要選定一本或者一個課程,從頭到尾不中斷地學習,不要再太多的書籍或者課程中來回切換,要堅持系統地學習完一本書。這樣才能很快建立起對這門語言的系統思維,建立之後才可以往更深的地方學習和運用。
找到興趣小組和同類
http://club.excelhome.net/
學好一門編程語言,首先要做到以下20點:1.不要看到別人的回復第一句話就說:給個代碼吧!你應該想想為什麼。當你自己想
出來再參考別人的提示,你就知道自己和別人思路的差異。2.初學者請不要看太多太多的書那會誤人子弟的,先找本系統的學,很多人用了很久都是只對部分功能熟悉而已,不系統還是不夠的。3.看幫助,不要因為很難而自己是初學者所以就不看;幫助永遠是最好的參考手冊,雖然幫助的文字有時候很難看懂,總覺得不夠直觀。4.不要被對象、屬性、方法等辭彙所迷惑;最根本的是先了解最基礎知識。5.不要放過任何一個看上去很簡單的小問題--他們往往並不那麼簡單,或者可以引伸出很多知識點;不會舉一反三你就永遠學不會。6.知道一點東西,並不能說明你會寫腳本,腳本是需要經驗積累的。7.學腳本並不難,JSP、ASP、PHP等等也不過如此--難的是長期堅持實踐和不遺餘力的博覽群書;8.看再多的書是學不全腳本的,要多實踐9.把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡;10.學習腳本最好的方法之一就是多練習;11.在任何時刻都不要認為自己手中的書已經足夠了;12.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看;13.別指望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;14.請把書上的例子親手到電腦上實踐,即使配套光碟中有源文件;15.把在書中看到的有意義的例子擴充;並將其切實的運用到自己的工作中;16.不要漏掉書中任何一個練習——請全部做完並記錄下思路;17.當你用腳本到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請儘快將余下的部分粗略的完成以保證這個代碼的完整性,然後分析自己的錯誤並重新編寫和工作。18.別心急,寫腳本確實不容易;水平是在不斷的實踐中完善和發展的;19.每學到一個腳本難點的時候,嘗試著對別人講解這個知識點並讓他理解----你能講清楚才說明你真的理解了;20.記錄下在和別人交流時發現的自己忽視或不理解的知識點;
VBA 傻瓜入門教程 (裝逼指南 撩妹手冊)
#########################
2017-02-21號更
#########################
一、什麼是VBA(Visual Basic for Applications)
就是用代碼來代替人工操作Excel,說白了就是編程,編程,編程(但不難,請往下看,給你一個不同的Excel世界)
二、為什麼要學VBA
節約時間,解放雙手,釋放洪荒之力,在短暫的人生中裝次逼
三、VBA入門教程(以Excel2013為例)
1.調出 "開發工具" 選項卡
檢查工具欄是否有 "開發工具" 選項卡如果沒有看下面:
文件 —— 選項 —— 自定義功能區 :勾選右側的開發工具
2.插入一個按鈕
上圖的開發工作下的控制項處 點擊插入 選第一個按鈕:
此時按住滑鼠左鍵 在表格任意地方拖拽 拉出一個按鈕 此時會彈出對話框 點擊新建:
點擊新建之後 竟然彈出了下面這個東西 握草 這個是什麼 從來沒見過看到Sub 按鈕1_Click() End Sub 中的按鈕1_Click了嗎,這就是上一步我們新建的按鈕的名稱,對照上張圖片 看到Sub 按鈕1_Click() End Sub 中的按鈕1_Click了嗎,這就是上一步我們新建的按鈕的名稱,對照上張圖片
這就是一個宏 xxx為宏名 "代碼塊區域寫代碼
Sub xxx()
"代碼塊
End Sub
3.編寫代碼
VBA代碼編程我們還沒學 這裡我先用個簡單的例子給大家展示一下VBA的應用
在中間添加一行代碼: MsgBox ("Hello VBA")
Sub 按鈕1_Click()
MsgBox ("Hello VBA")
End Sub
然後回到Excel界面 點擊剛剛拖拽出的按鈕: 現在我們已經走完了VBA的所有步驟。
總結一下入門的步驟:
1.拖拽出一個按鈕 2.添加一行代碼 3.點擊按鈕 運行代碼
四.VBA裝逼教程(以Excel2013為例)
從第三步我們已經知道了VBA的大概流程了(雖說只是最簡單的) 下面就是要進入實用階段了 示例從簡單到複雜
每個示例都有代碼講解 示例之間重複的代碼只講解一次
########################################################################
## 示例一:將兩個單元格的內容進行四則運算(雖說這用Excel兩秒鐘就可以解決)
########################################################################
運算符可以選擇 + - * / 有關下拉框的製作百度之(這個不能裝逼 所以我不講) 然後點擊按鈕 得出結果
另外說一下怎麼輸入 + 號 = 號 只要在輸入之前輸入一個單引號即可: 』+ 表示字元串 + 單引號就是表示我們輸入的文本是字元串的加號 而不是操作運算符的 +
1.編寫代碼
我們需要獲取B4單元格的內容和D4單元格的內容以及C4單元格的運算符號 先看效果當更改C4中的操作符或者更改B4、D4中的數字時 點擊按鈕1 就會得出結果當更改C4中的操作符或者更改B4、D4中的數字時 點擊按鈕1 就會得出結果
代碼如下:
Sub 按鈕1_Click()
"聲明一個字元串 用來表示運算符 注釋使用 "
Dim operator As String"將C4單元格的運算符 賦值給 operator
operator = Cells(4, 3)"If 語句進行判斷
If operator = "+" Then
Cells(4, 6) = Cells(4, 2) + Cells(4, 4)
End IfIf operator = "-" Then
Cells(4, 6) = Cells(4, 2) - Cells(4, 4)
End IfIf operator = "*" Then
Cells(4, 6) = Cells(4, 2) * Cells(4, 4)
End IfIf operator = "/" Then
Cells(4, 6) = Cells(4, 2) / Cells(4, 4)
End IfEnd Sub
代碼講解:
Sub 按鈕1_Click()
End Sub
"聲明一個字元串 用來表示運算符 注釋使用 "
這個是固定的 就是說我是個宏 裡面包含的是代碼
Dim operator As String單引號用來表示注釋(是英文狀態下的單引號 English English English)
Dim 用來申明變數
operator就是變數名
As 就是"是"
String 字元串類型
放在一起就是:聲明了一個字元串類型的變數,這個變數叫做operator變數類型包含以下幾種(只是入門教程 我不寫全 只寫容易記的)
字元串型 String 就是咱們整天表示漢字 英文的那個類型
整數型 Integer 就是咱們表示 1 2 3 整數的那個類型 所以如果咱們想聲明一個age來表示一個人的年齡就可以這樣 Dim age As Integer
日期型 Date
貨幣型 Currency
……
就是開始選項卡哪些咱們平常用來更改單元格類型的東西
"將C4單元格的運算符 賦值給 operator
operator = Cells(4, 3)單元格的表示就是Cells(行號,列號) 如果你想表示A1單元格就是 Cells(1,1) 切記不是Cells(A,1) 都要用數字表示
If operator = "+" Then
這行代碼就是獲取了單元格C4中的運算符 然後把它賦值給了剛剛聲明的變數 operator 現在operator可能是 + - * / 中的任一個
Cells(4, 6) = Cells(4, 2) + Cells(4, 4)
End If我們先看:
If xxx = xxx Then
"代碼塊
End If
這個表示If判斷語句:
如果 是真的 然後
執行代碼
結束如果Cells(4, 6) = Cells(4, 2) + Cells(4, 4)
這句就是把兩個單元格相加 然後賦值給另外一個單元格示例一到此完成
###########################################################################
## 現在來個有難度的 不要求大家掌握 只是為了引出後面的教程
###########################################################################
###########################################################################
## 示例二 將3個Excel工作簿的第一張工作表複製到第四個工作簿中
###########################################################################
1.情景模擬
現在你收到了100個人交上來的個人信息表 你要做的只有一件事 把這100個工作薄打開 複製工作表到一個總的工作薄中 也就打開100次 關閉100次Excel 但也許你公司的員工會上千人
2.先上結果
本來目錄結構:要把excel1/excel2/excel3的第一個sheet複製到匯總表中要把excel1/excel2/excel3的第一個sheet複製到匯總表中
代碼運行結果Sheet1是匯總表本來就有的Sheet1是匯總表本來就有的
3.編寫代碼
這次代碼和上次就不一樣了
Sub 按鈕1_Click()
Dim path, file, count, wb As Workbook
"con 表示單元格內容
Dim i, con
"凍結屏幕,以防屏幕抖動
Application.ScreenUpdating = False
"在這裡輸入你的路徑,即你存放工作薄的文件夾
path = Application.ActiveWorkbook.path ""
file = Dir(path "*.xls*")
Do While file &<&> ""
If file &<&> ThisWorkbook.Name Then
Set wb = Workbooks.Open(path file)
count = ThisWorkbook.Sheets.count
"選中要複製的工作表
wb.Sheets(1).Select
"將要複製的工作表複製到匯總工作簿
wb.Sheets(1).Move After:=ThisWorkbook.Sheets(count)
"wb.Close savechanges:=False
End Iffile = Dir
Loop
Application.ScreenUpdating = True
End Sub咦 握草 這是什麼 怎麼沒數字 好像就還有個1我還認識 這是代碼嗎 好的 咱們一句一句的解釋
Sub 按鈕1_Click()
End Sub
這個就不講了……
Dim path, file, count, wb As Workbook聲明了四個變數 path/file/count/wb
這種是簡便寫法 每個變數用逗號分開
為什麼path fill count 這三個變數沒有As xxx ? 是可以不寫的 但最好寫上他們的類型
wb As Workbook 這個是什麼 這個就是工作薄類型 wb表示的是一個工作薄
Dim i, con
聲明了兩個變數 沒什麼好說的
"凍結屏幕,以防屏幕抖動
Application.ScreenUpdating = False代碼這麼長誰記得住? 沒事 這種查手冊就行 不需要記 只知道有這個東西就行
"在這裡輸入你的路徑,即你存放工作薄的文件夾
path = Application.ActiveWorkbook.path ""握草 這句這麼複雜
Application:就是指Excel這個應用 它包含一切 知道什麼叫App吧
ActiveWorkbook:Workbook就是工作薄 excel可以同時打開多個工作薄 那ActiveWorkbook是什麼意思呢 就是你正在操作的這個工作薄 類比word 我們可能同時打開了 N 個文檔 但處於編輯狀態的同時最多只有一個word文檔 這句話就是Excel打開的應用中 目前處於可編輯狀態 也就是在最上面的工作薄
path:就是工作目錄 你打開的這個工作薄在磁碟上可能是 D:Excel…… 就是指這個目錄文件夾 注意是包含工作薄的文件夾 不是工作薄的名字
:是字元串連接符 比如你想把兩個單元格中的字元串連在一起 比如示例一中 Cells(4, 6) = Cells(4, 2) Cells(4, 4) 則Cells(4,6) = 34 而不是3 + 4 = 7
file = Dir(path "*.xls*")
path "*.xls*":上面剛講了 的用法 這裡就是在你打開的這個工作薄所在的文件夾下 尋找後綴名為 *.xls* 的Excel文件 * 表示通配符 因為Excel文件的後綴名可以是.xls 和 .xlsx 所以用 *.xls* 來表示這句話的意思是取出文件夾下第一個excel文件的文件名 比如 lbw.xlsx
Do While file &<&> ""
If file &<&> ThisWorkbook.Name Then
Set wb = Workbooks.Open(path file)
count = ThisWorkbook.Sheets.count
"選中要複製的工作表
wb.Sheets(1).Select
"將要複製的工作表複製到匯總工作簿
wb.Sheets(1).Move After:=ThisWorkbook.Sheets(count)
"wb.Close savechanges:=False
End Iffile = Dir
LoopDo While file &<&> ""
"代碼塊
Loop這個表示 While 循環 意思是如果上一步的文件名不為空 就執行下面的代碼
If file &<&> ThisWorkbook.Name Then
Set wb = Workbooks.Open(path file)
count = ThisWorkbook.Sheets.count
"選中要複製的工作表
wb.Sheets(1).Select
"將要複製的工作表複製到匯總工作簿
wb.Sheets(1).Move After:=ThisWorkbook.Sheets(count)
"wb.Close savechanges:=False
End IfIf 語句已經講過了
&<&> 表示不等於
ThisWorkbook 表示這個代碼寫在的那個工作薄 和 activeWookbook 不同
Set wb = Workbooks.Open(path file)
path 與 file 已經講過 分別表示路徑和文件名 也已經說了 表示連接符 path file 就是完整的文件路徑名
Workbooks.Open() 表示要打開excel工作薄
wb是剛開始聲明的變數 但是這個地方為什麼要用 Set 因為wb不是普通的變數類型
count = ThisWorkbook.Sheets.count
這句話表示我們寫代碼的這個Excel工作薄 工作表的數量 然後賦值給count
wb.Sheets(1).Select
選中wb這個工作薄的第一個sheet
握草 有點亂!
ThisWorkbook 指的是咱們把代碼寫在的那個工作薄 也就是裡面有按鈕的那個工作薄 也就是匯總表這個工作薄
wb呢 是咱們用VBA打開的另外一個工作薄 他們兩個不是同一個 咱們正是要把wb中的第一個工作表複製到ThisWookbook中
wb.Sheets(1).Move After:=ThisWorkbook.Sheets(count)
這句代碼不解釋 就是複製給了ThisWorkbook示例二到此結束
示例二就只實現了一個功能 複製工作表 怎麼就那麼複雜呢 初學者看不懂沒關係 先了解一下 後面的例子會介紹什麼是Application Workbooks Workbook Worksheets Worksheet Range Cells ……
後面有時間更……
學習VBA的目的是為了實際應用,所以最好能夠在實踐中學習,採用問題驅動的方法學習,效率更高。1.首先要理解VBA的語言邏輯:要先對變數進行定義,讓計算機識別這些變數。常見的格式為Dim A as B, 其中A是你要用到的變數名稱,而B則是這個變數的類型,如string是文本型的,integer是整數,long是範圍比較廣的整數,variant則意味著計算機會自動匹配數據類型。然後,VBA是採用事件驅動的,基本語法為A.B a,b,c,...其中A 為對象,可以是你在上面定義的變數,也可以是內置的對象,如worksheets(1)之類的。而B表示一個動作,如open,close之類的,而後面的a,b,c...則是這個動作附加的條件,如路徑,密碼,只讀,這些都可以選的。最後,當程序運行之前,要debug,查找bug,從代碼的第一句到最後一句,慢慢的讀,將自己想像成笨拙的計算機,如果代碼沒問題的話,整個過程應該就像高山流水一般自然順暢。2.初學者可以用下面這篇文章入門,Excel 菜鳥談VBA最最基礎入門《原創》-ExcelVBA程序開發-ExcelHome技術論壇 -相當通俗易懂。3.要善於運用excel的錄製宏功能,許多操作都可以通過錄製宏的方式找到,免去了記憶那些代碼的辛苦。只是錄製出的代碼比較繁瑣,會有一些沒有用處的句子,可以自己刪去。4.遇到不懂的句子要善於運用F1,只需選中相應的部分,按F1,就有詳細的解釋。5.上述方法還不能解決問題的話,果斷百度吧。6.就我個人感覺,學不學VB對於VBA沒有顯著影響。
說一下我的情況,也比較不具有代表性。Excel VBA這東西,想做可以做出很多具有程序級別的東東來,我碰到過的大神是可以用vba寫出項目進度管理用的那種進度跟蹤工具,還有運用vba+vbs+wsh(Windows Script Host)寫出調用各種其他程序介面(比如瀏覽器)去執行自動化腳本的。之後我明白了,凡事電腦上可以用滑鼠+鍵盤完成的工作,vba都可以做到。
我沒有看任何的vba教材,我覺得快速學習vba的一個好辦法,就是先給自己設定一個目標,想要實現什麼功能,然後去找一份已經實現這個功能或者相近實現自己想要功能的vba代碼。直接看的別人寫好的vba程序,代碼一行一行看過去的。一旦碰到不明白的語法或者函數,馬上谷歌或者百度查找。直到把程序是要幹啥的看懂為止,然後運用自己已經看懂的去實現自己想要的效果,這樣子做雖然沒有看書一步一步的學過去系統,但是就達到自己想要的目的而言,是一個捷徑。差不多2周之後就能自己寫vba了。然後平時在多看看一些好的vba論壇,再加以系統學習,就可以學的還不錯了。由於我的vba技巧跟知識都是從日文網站上學習的,所以沒有可推薦性(除非懂日文),如果懂日文,會發現日文寫的vba教程都非常的詳細,幾乎每一篇都是站在學習者是零基礎的角度來寫的教材。。。
我用VBA最常用到的是查找跟匹配。所以我認為vba的重點在Find函數以及正則表達式上。呵呵,個人情況分享,不具有代表性,這是我寫的關於vba的幾篇小材料,歡迎交流:http://tosmatt.info/doku.php?id=code:vba:vba,不定期更新。正好這半年用了很多VBA:1. 那本《別怕》買來後看了覺得沒什麼太大的用處,光光解釋了一些初級的語句和函數,沒怎麼講演算法和編程的思路。實用性太低,覺得看完該不會的還是不會,對初學者並不user friendly2. 建議直接去買一本講VB的書,先把VB這種語言學會,找那種例子多一點的書。注意這裡說的不是一段一段的語句,而是一個一個有完整功能的project的例子的書。先看,看懂後嘗試自己去再現這個project,吃透一個了再去學下一個3. 等到完全把VB這種語言學會了,你就學會了VBA的後端的使用,那麼隨便找一本書,甚至隨便看看別人的程序,結合百度,以及錄製宏後看代碼,就能很快學會前端的語句4. 我自己就是高中學了很多VB,五六年後在工作中需要VBA了再去重新撿起來,看那本《別怕》看得雲里霧裡,反而感覺是看別人寫的程序學得更快5. 其實要把Excel VBA用好,最好是把Access也學一下,把database轉存,能有效避免後期速度越來越慢的問題
其實VBA快速入門一點也不難,可以這麼說:如果你用VBA只是為了整整資料庫,clean clean data。那麼花個幾天掌握一些基本語法,會用loop就能基本解決你所有要求。
或者花幾個小時現看看loop怎麼寫,if 語句怎麼寫,dim怎麼用。具體的語句可以用到去google上查,查多了,研究多了自然就脫離google了。
我就是機緣巧合需要clean一個20000多行的數據需要用vba,然後一開始就是google上搜一長串自己的task然後選代碼。自己研究他們的語句啥意思,不會的就去MS搜,然後clean了不少dataset之後,基本上現在都是自己寫的。
雖然代碼比較笨,不高端,但是起碼可以用啦好開心(^-^)。然後順便學會了SQL,R,sqldf有人推薦《別怕》這本書,但是我覺得這本書過於通俗化:大家的理解力其實沒那麼差。EXCELHOME論壇的VBA版塊,有常用VBA技巧,可以下載下來,自己試著去敲代碼。等有了基礎的認知後,可以買本系統的VBA進階教程。
錄製宏、修改宏挺取巧的,符合快准狠的訴求。
1.找本教材,對照著練習。推薦這本別怕,Excel VBA其實很簡單 (豆瓣)下一步這本Excel VBA程序開發自學寶典 (豆瓣)2.日常工作中遇到處理大型運算、重複操作、簡化公式等問題設法用VBA解決。3.多使用Excel自帶幫助功能或者在Excelhome論壇查找你需要的答案。
這裡可以給你一些關於vba的excel小技巧
和一位初次使用EXCEL的朋友聊天,
她說EXCEL簡單!
不就是輸入一些數字和文字,
然後調整下格式,
例如:對齊點,加個邊框,然後列印下,搞定,SO easy!
一聽,就知道對excel的使用不多,
剛好忙,
讓她解決下有人問到的問題,
順便幫我的忙,結果她看完後說,
看來EXCEL也不簡單!
然後你們懂的,死活要我教她怎麼做!
好吧,我只能教她了!
在教她的時候我把問題跟她分析了下,
那麼是什麼問題讓我的朋友改變了點自己的想法呢?
是什麼問題,讓她想學習下呢?
給大家分享下這個問題!
大家可以看下圖1.
要求實質:將不同列內容進行合併!
這個要求就像歌曲「香水有毒」唱到的那樣,
我的要求並不高,
待我像……….!
停…..
stop
瘋了嗎?
問題忘了,
進入主題先!
咳咳! 好的,大家看這個問題!
注意點有兩點 ---》
其一:不同的內容要自帶列標題開頭(比如姓名:阿湃洋),
其二:各個數據之間要有空格!
那麼怎麼解決呢?
方法1:自己手寫,憑藉自己打字速度快!NO!NO!上千條,會死人的!
方法2:公式。函數PHONETIC!
方法3:VBA自動化代碼!
累死人的第一個,還是狗帶吧!
第二方法不錯,操作之前,我們對數據進行處理,
添加不同的開頭+冒號(:)+@/0+空格。
採用自定義添加開頭,操作看慢圖1演示;
補充點:如果是處理文本或字母,自定義用 @代替內容,反之用0代替。
採用保留內容,操作看慢圖2演示;
補充點:複製數據後,剪貼板會有數據!
採用 【PHONETIC】函數,操作看慢圖3演示。
當然,當然,還有我們的VBA呢?
在解決這類有明確操作步驟,重複性的工作看它的效果吧!
第三方法:VBA 的文本組合 代碼
效果慢圖如下:
好,今天就到這裡,EXCEL涵蓋多個模塊,
學好函數,
學好數據處理,
學好圖表,
學好VBA,
學好建模等等,
都會對你的職場產生巨大的影響!
如果你完全0基礎,建議你先學VB語法,然後再學習excel組件裡面的基本對象,比如sheet,range等。然後,要是想快速掌握,只有自己親手做做。不會的時候搜索一下基本都能找到代碼案例。如果問題很偏門根本搜不到案例,可以去excelhome這個論壇去提問。
有需求才會有學習的動力,平常工作中需要處理大量數據,套路較多,就想著能不能一鍵搞定,於是開始接觸VBA,算是從這裡起步的,學了差不多一個月的樣子,之前想要功能都已經實現了,比如批量整理數據並修改格式,導入數據,自製菜單控制項,批量列印等等,想想還蠻有成就感的。
我是跟著自學網曾老師的視頻來學的,老師積澱深厚,講的很全很細,比較基礎但也夠用,學完後就直接在工作中試用,進步很快。
視頻excel基礎教程Excel VBA基礎教程
也有下蘭色幻想的視頻,感覺比自學網的難些,可以用來進階複習,練習課件不錯呢。
蘭色幻想vba從入門到進階80集完整版.zip_免費高 速下載
LOOK:
1.基礎很重要,不建議從錄宏開始學習。搞清楚變數,對象的方法屬性及事件等概念,掌握循環語句,工作簿和工作表操作,單元格操作。學到這就已經能解決很多問題了。
2.多練,看只能提高學習效率,真正要將這些知識轉化為自己的東西,就要不斷的練習,特別是將其應用到日常工作中。
3.如果碰到不懂的東西就先問身邊同事,沒人懂就百度,像excelhome論壇很多大神的,沒有他們解決不了的,只有你想不到的哈。
4.在解決問題的過程中你會積累很多技巧,最好將這些知識點保存起來,比如為知啊印象啊。
在工作中主表有90M多,並且結構複雜,寫了一個插入新ITEM的代碼運行一次要十多分鐘,但也才三十幾條數據啊,並且很容易崩潰,感覺表格一大條件一多,vba就不行了,但用VBA來處理一些輔助報表(&<20M)還是很快的。
最後,如果你工作中經常用到excel的話,學下VBA還是很有必要的。
。。。。。。。。。。更新。。。。。。。。
20170329更新
嘿嘿,下面是我做的一個課件,有興趣的可以看一下哦
EXCEL VBA工作應用經典十例 - 網易雲課堂
干中學,學中干。我基本上沒有怎麼學過VBA,僅僅只有一些Basic語言的基礎,以及大學計算機課上的一些微末的VB知識(基本上不記得學過啥了)我對對象沒有理解,對類也不理解。當我有什麼需求的時候,我就會去百度,比如要實現某個需求,應該使用什麼語句。干中學,學中干。其實很多東西都是在這種場景下學會的。比如while do語句,do until語句;(for next 語句是最早的,當然不算了)j在整個過程當中,會不斷發現新的東西。會有一種探索的感覺。我自己也買過VBA的書,沒用,根本不看。我個人認為:從基礎開始學起,萬丈高樓平地起,一步一個腳印是傳統的學習方法。這種方法最大的好處是讓你的知識成為一個系統,儘可能減少遺缺。但是會很煩悶。但是反過來,我們從上往下學。可能可以讓整個過程變得更加有趣一些。(你會讓你的學習從一開始就能見效,這是激勵一個人不斷學習的有效方法)
先最好有一點點的編程基礎。例如Visual Basic,或者Python,我認為,掌握一門編程語言是非常有用的技能。然後學習VBA中一些例如if,for,while的使用區別,學習錄製錄製宏。
然後,你的主要的宏的代碼主要來源是
1. google,stackoverflow2. 你自己錄製的宏然後慢慢修改,保存自己的代碼以後復用。就一個字,干。
有什麼問題就嘗試去解決啊,用宏錄製器把一些常用的操作錄一遍就知道了。
再就是看它自己的幫助文檔也很有用。
不要老想什麼快速學習的事,用得多了,解決的問題多了,自然就熟悉了。否則都不知道有哪些問題要解決,卯著學效率也不高。推薦閱讀:
※哪裡有免費的 Excel 教程?
※CEO,財務總監,市場總監,採購總監,生產總監的工作分別是什麼?涉及到的電子表格(EXCEL)又有那些?
※有哪些系統學習excel的書?
※Microsoft Office 2013 有什麼新特性?現在都有哪些版本可供使用?
※Excel 可以做出哪些財務模型?
TAG:MicrosoftOffice | MicrosoftExcel | VBA |