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代碼如下:

Sub
Value()

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 Applications

BASIC是一門古老的計算機語言,首次發表於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 10

1996年,微軟開發了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

除了分支之外,某一段代碼還可以反覆執行。最簡單的情況,例如列印5個"Hello"

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 Reference

3. 學習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了嗎,這就是上一步我們新建的按鈕的名稱,對照上張圖片
Sub xxx()
"代碼塊
End Sub

這就是一個宏 xxx為宏名 "代碼塊區域寫代碼

3.編寫代碼

VBA代碼編程我們還沒學 這裡我先用個簡單的例子給大家展示一下VBA的應用
Sub 按鈕1_Click()
MsgBox ("Hello VBA")
End Sub

在中間添加一行代碼: MsgBox ("Hello VBA")

然後回到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 If

If operator = "-" Then
Cells(4, 6) = Cells(4, 2) - Cells(4, 4)
End If

If operator = "*" Then
Cells(4, 6) = Cells(4, 2) * Cells(4, 4)
End If

If operator = "/" Then
Cells(4, 6) = Cells(4, 2) / Cells(4, 4)
End If

End 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) 都要用數字表示
這行代碼就是獲取了單元格C4中的運算符 然後把它賦值給了剛剛聲明的變數 operator 現在operator可能是 + - * / 中的任一個

If operator = "+" Then
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 If

file = 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 If

file = Dir
Loop

Do 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 If

If 語句已經講過了

&<&> 表示不等於
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 friendly

2. 建議直接去買一本講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,stackoverflow

2. 你自己錄製的宏

然後慢慢修改,保存自己的代碼以後復用。


就一個字,干。

有什麼問題就嘗試去解決啊,用宏錄製器把一些常用的操作錄一遍就知道了。

再就是看它自己的幫助文檔也很有用。

不要老想什麼快速學習的事,用得多了,解決的問題多了,自然就熟悉了。否則都不知道有哪些問題要解決,卯著學效率也不高。


推薦閱讀:

哪裡有免費的 Excel 教程?
CEO,財務總監,市場總監,採購總監,生產總監的工作分別是什麼?涉及到的電子表格(EXCEL)又有那些?
有哪些系統學習excel的書?
Microsoft Office 2013 有什麼新特性?現在都有哪些版本可供使用?
Excel 可以做出哪些財務模型?

TAG:MicrosoftOffice | MicrosoftExcel | VBA |