一、簡(jiǎn)單演示 和 代碼展示
B1 這個(gè)單元格,寫數(shù)據(jù)源的路徑。
第 2 行是表頭,A 列獲取文件名,B2 到 H2 是需要獲取數(shù)據(jù)在數(shù)據(jù)源中的單元格位置。
假如,我們現(xiàn)在需要額外提取一些新的單元格數(shù)據(jù),直接在第 2 行后面,寫上目標(biāo)單元格就可以,無需修改代碼。
二、新對(duì)象/方法的介紹
1. 小下劃線 _ 和單引號(hào) '
分別為代碼分行連接符,和注釋符。
2. DIR (pathname)
◆返回一個(gè) String,用以表示一個(gè)文件名、目錄名或文件夾名稱。
◆在第一次調(diào)用 Dir 函數(shù)時(shí),必須指定 pathname。Dir 會(huì)返回匹配 pathname 的第一個(gè)文件名。
再一次調(diào)用 Dir,如果沒有使用參數(shù),會(huì)返回匹配之前 pathname 的下一個(gè)文件名。
如果已沒有合乎條件的文件,則 Dir 會(huì)返回一個(gè)零長(zhǎng)度字符串 ('')。一旦返回'',并要再次調(diào)用 Dir 時(shí),就必須指定 pathname,否則會(huì)產(chǎn)生錯(cuò)誤。
◆ pathname支持用通配符 * 或者 ?指定多個(gè)文件,比如,*.xls*——所有版本的Excel文件,*.*——所有類型的文件。
3. Do While/Until
Loop
當(dāng)條件為 True 時(shí)(While),或直到條件變?yōu)?True 時(shí)(Until),重復(fù)執(zhí)行。
常見的結(jié)構(gòu)還有:
Do
Loop While/Until
Do
Exit Do
Loop
等等靈活的用法。
4. For i = (開始) to (結(jié)束) [Step 步長(zhǎng)]
Next
指定次數(shù)來重復(fù)執(zhí)行,變量 i 的變化范圍,就是執(zhí)行的次數(shù)。to后面還可以加step,指定步長(zhǎng),也就是每次 i 變化量,這個(gè)變化量,可以取負(fù)值。不指定的時(shí)候,默認(rèn)為 1 。
5. Formula
設(shè)置單元格的公式,'=(具體公式)' 的形式,可以跟變量靈活組合,比如類似 '=(公式前半)' & (變量1) & '(公式后半)' & (變量2) 的形式。
6. .Value = .Value
左邊的是需要賦值的變量,右邊是取值。作用就是把公式去掉,只保留單元格的值。
7. Instr (前者,后者)
從前者中找后者,返回找到的位置,如果找不到,返回 0 。
8. If (條件) Then
(結(jié)果)
End If
當(dāng) (結(jié)果) 跟 If 在同一行,End If 不用寫,就是這樣:If (條件) Then (結(jié)果)
還有 Else 的用法,當(dāng)條件/結(jié)果的語句都很短的時(shí)候,也可以放在同一行,就是這樣:If (條件) Then (結(jié)果1) Else: (結(jié)果2) 。注意,Else 后面有個(gè) : 。
三、執(zhí)行思路及過程分析
【1】確認(rèn)目的
我們需要把目標(biāo)文件夾里面的所有 Excel 文件的某些單元格取值,匯總在同一張表里。
下數(shù)據(jù)源的為——
子表名字是 Report,A1 到 H15 是數(shù)據(jù),我們把數(shù)據(jù)的內(nèi)容設(shè)置成單元格的地址,除了第 1 列,取名為 列頭,這樣方便我們獲取數(shù)據(jù)以后,進(jìn)行驗(yàn)證。
【2】Do循環(huán)實(shí)現(xiàn)多個(gè)文件的循環(huán),F(xiàn)or循環(huán)實(shí)現(xiàn)同一個(gè)文件多個(gè)單元格的循環(huán)
前面2個(gè)命令行,分別是獲取最大的行號(hào)和列號(hào),這個(gè)在上期有比較詳細(xì)的介紹。
通過 Dir 函數(shù),fName 獲得 Cfolder 這個(gè)路徑下第一個(gè) Excel 文件的文件名,所以,fName <> '' 為真,執(zhí)行 Do 里面的語句。
Range 這一行,在 A 列最大內(nèi)容行 rmax 的下一行 rmax 1,寫入 fName 的內(nèi)容,也就是文件名。
后面的 For 循環(huán),從第 2 列到最大列,分別進(jìn)行取值。
這里,我們先把后面這句 Value = Value 變成注釋,再次執(zhí)行,看看生成的公式是怎么樣的——
='G:\Excel 教程\WE003 數(shù)據(jù)提?。ú淮蜷_數(shù)據(jù)源)\E003 111\[數(shù)據(jù)源A.xlsx]Report'!F3
我們看到,其實(shí)就是直接用 = ,關(guān)聯(lián)到另外一個(gè)文件的對(duì)應(yīng)的單元格。
我們把公式跟代碼進(jìn)行對(duì)比——
Report 是子表的名字,由于獲取數(shù)據(jù)時(shí),不打開數(shù)據(jù)源,這個(gè)子表名字需要在代碼中提前寫入。
總的來說,就是用 & 把變量和公式里面的一些特殊符號(hào)連起來就可以了。
For 結(jié)束以后,一行的內(nèi)容就寫完了,rmax 自加 1 ,下一個(gè)文件的內(nèi)容,就會(huì)寫在下一行。這里,我們也可以把 rmax 語句,寫在 Do While 循環(huán)的第一句,每次讓系統(tǒng)去計(jì)算當(dāng)前最大行號(hào),這樣的話,就可以省略掉 rmax = rmax 1 。
然后,Dir 不帶任何參數(shù)運(yùn)行,返回的是下一個(gè)文件名,如果已經(jīng)是最后一個(gè)文件了,就返回一個(gè) '' 給fName,也就不滿足 Do 循環(huán)的條件,跳出 Do 循環(huán)。
整個(gè)程序也就結(jié)束了。
【3】功能引申。
第1個(gè)功能,為什么我們用 cmax ,而不是直接指定列數(shù)。好處在于我們可以隨時(shí)增減我們想要獲取的單元格數(shù)量,而不需要對(duì)宏進(jìn)行任何修改。
剛才我們?cè)诘谝徊糠忠呀?jīng)進(jìn)行了示范。
第2個(gè)功能引申,就是這個(gè)注釋的這個(gè) If 條件了。假如,我們的目標(biāo)文件夾除了我們需要的數(shù)據(jù)源,還有一些其它的 Excel 表,比如我們?cè)谀繕?biāo)文件夾新建一個(gè) Excel 文件,運(yùn)行起來就會(huì)出錯(cuò)。
為什么呢,因?yàn)槲覀児竭@里指定了目標(biāo) Excel 表的子表名字:Report,這個(gè)雜七雜八(za qi za ba)的表格并沒有 Report 這個(gè)子表,運(yùn)行就會(huì)出錯(cuò)。
為了避免這種情況,我們就加個(gè) If 條件,對(duì) Excel 文件先進(jìn)行一個(gè)判斷,我們這里用的是對(duì)名字進(jìn)行篩選。
四、本期宏完整展示
五、后話
關(guān)注我的頻道,方便找到對(duì)應(yīng)的 視頻版 鏈接以及更新內(nèi)容。
聯(lián)系客服