最近我們都在學(xué)習(xí)工作簿的匯總和合并操作,不過(guò)可能是因?yàn)槲业拇竽X細(xì)胞比較有限,所涉及的場(chǎng)景比較少,小伙伴們也是提出了一些新的場(chǎng)景要求,所以,這里我們作為新番的形式,和大家分享。
好,進(jìn)入正題,今天我們要合并的工作簿的場(chǎng)景呢,是這樣的
有空行,又有合計(jì)字段,還有最后還有合并單元格的頁(yè)尾。
當(dāng)然我們并不需要合并這些空行,頁(yè)尾了,我們需要的僅僅是中間的數(shù)據(jù)部分,那么面對(duì)今天這樣的場(chǎng)景,我們要如何合并呢?
既然已經(jīng)有了空行,那么我們這里肯定不能使用Useadrange了,因?yàn)檫@個(gè)時(shí)候的使用區(qū)域,明顯包含了空行和頁(yè)尾的那些部分
而我們需要的僅僅是中間的核心數(shù)據(jù)。
不過(guò)我們可以觀察到,數(shù)據(jù)中既然有合計(jì)字段,合計(jì)字段是數(shù)據(jù)源和其他的頁(yè)尾標(biāo)識(shí)區(qū)域的分水嶺
發(fā)現(xiàn)了這一點(diǎn),那么問(wèn)題就簡(jiǎn)單了很多了,我們只需要獲得合計(jì)這個(gè)字段所在的單元格行數(shù),然后就可以將整個(gè)數(shù)據(jù)源一分為二了。
一分為二之后呢?
我們就會(huì)得到兩個(gè)區(qū)域,從上圖中可以看到,有些區(qū)域是有空行的,那么這樣的情況下,又要如何操作呢?
so easy!
你獲得A列的最后一個(gè)非空單元格不就可以了嗎?
如果非空單元格的行數(shù)大于合計(jì)的行數(shù),那就是說(shuō)明有空格了。
OK,有了思路,那么直接看代碼
Sub test23()
Dim sth As Worksheet, rng As Range, urng As Range, sbook As Workbook, sb As Workbook
Set sbook = ThisWorkbook
pathn = ThisWorkbook.Path
f = Dir(pathn & "\")
Do While f <> ""
l1 = Cells(Rows.Count, 1).End(xlUp).Row
If f <> "5-23.xlsm" Then
For Each sb In Workbooks
If sb.Name = f Then
GoTo line
End If
Next sb
Workbooks.Open (pathn & "\" & f)
l = Cells(1, 1).End(xlDown).Row
With ActiveSheet.UsedRange
Set rng = .Find(What:="合計(jì)", LookIn:=xlValues, _
LookAt:=xlWhole, SearchDirection:=xlPrevious)
rngRow = rng.Row
End With
If l > rngRow Then
Set urng = Range(Cells(2, 1), Cells(rngRow - 1, 5))
urng.Copy sbook.Worksheets(1).Cells(l1 + 1, 1)
Else
Set urng = Cells(2, 1).Resize(l - 1, 5)
urng.Copy sbook.Worksheets(1).Cells(l1 + 1, 1)
End If
ActiveWorkbook.Close True
End If
line:
f = Dir()
Loop
End Sub
看看效果
OK 直接進(jìn)入代碼
其實(shí)說(shuō)到底,今天的代碼并沒(méi)有太多的知識(shí)點(diǎn)
都是我們之前套用的模板,不過(guò)這里稍微做了一點(diǎn)修改而已
VBA最大的好處,就是這里,一個(gè)輪子,可以循環(huán)使用多次,只要場(chǎng)景對(duì)的上就OK
今天主要來(lái)學(xué)習(xí)一個(gè)方法,就是單元格的查找
Set rng = .Find(What:="合計(jì)", LookIn:=xlValues, _ LookAt:=xlWhole, SearchDirection:=xlPrevious)
就是他
單元格的查找,大家肯定非常的熟悉,CTRL+F誰(shuí)不會(huì)呢?
不過(guò)今天我們的這個(gè)查找,有點(diǎn)意思,他是倒序查找,從單元格UsedRange的最后面往前面找
這樣的好處是什么呢?
我們可以看到合計(jì)都是出現(xiàn)在頁(yè)尾的,那考慮到數(shù)據(jù)量的問(wèn)題,肯定是從最后面查找的更快啦,從前面要遍歷的單元格,可能會(huì)很多,導(dǎo)致代碼執(zhí)行時(shí)間過(guò)長(zhǎng),所以這里是執(zhí)行的倒序查找。
找到了這個(gè)合計(jì)之后,就可以按照我們上面說(shuō)的,和A列的最后非空單元格進(jìn)行對(duì)比了。
如果大于
合計(jì)這一行,往上移動(dòng)一行,所得到的這個(gè)區(qū)間,就是我們要的核心數(shù)據(jù)
如果小于
那就和合計(jì)的位置沒(méi)有關(guān)系了,直接去最后一個(gè)非空單元格網(wǎng)上的一個(gè)連續(xù)區(qū)域即可。
本次的代碼看起來(lái)很簡(jiǎn)單,但是思路和方法才是最重要的,當(dāng)然方法也不是唯一的,小伙伴們有什么其他的思路呢?
本節(jié)課的案例源碼已經(jīng)上傳,需要的小伙伴后臺(tái)私信“5-23-X1”,希望大家多支持~~,多多關(guān)注 ~ ~
好了,明晚21:00,準(zhǔn)時(shí)再見(jiàn)!
因?yàn)楣娞?hào)沒(méi)有留言功能(開(kāi)的比較晚),所以建立一個(gè)線下微信群,主要為大家提供一個(gè)交流的平臺(tái),同時(shí)大家也可以提一些對(duì)公眾號(hào)的意見(jiàn)和看法,大家一起學(xué)習(xí),一起進(jìn)步。
聯(lián)系客服