Excel VBA 5.24 空行+合计字段+标尾+字段不同 VBA没有搞不定的
一起学习,一起进步~~
今天我们继续前进,上一节呢,我们针对行的学习了关于工作簿中含有合计字段,含有空行,还有标尾的情况下,要如何汇总工作簿的数据,看着上面这么多的干扰因素,可想而知,能够用VBA合并这样的工作簿,能够节省我们多少的工作量啊,不过呢,也是有一些小伙伴表示,他们的工作场景,比我上一节的场景还要复杂一点,复杂在哪里呢?
字段不同!
字段不同的工作簿如何汇总,我们在之前已经学习了,应该是在本章的第6节,那么是不是可以用相同的办法来实现今天的场景呢?
当然可以,本节的代码,我们就是效仿之前的方法,在上一节的代码的基础上,继续完善
场景说明
其实最近有不少的小伙伴反馈,之前的代码,跟着视频学,还是能够看到的懂,也知道每一句代码的作用的
但是换个场景,就不知道要怎么写了。比方说今天的场景,其实也知道应该可以用到之前的那段代码和方法,但是并不知道要怎么用,怎么写
这里还是牵扯到一个问题,学VBA一定要多写多练
代码区
Sub test24()
Dim sth As Worksheet, rng1 As Range, rng As Range, urng As Range, sbook As Workbook, sb As Workbook, arr, arr1, arrt()
Set sbook = ThisWorkbook
pathn = ThisWorkbook.Path
Set rng1 = Application.InputBox("请选择表头区域", "表头区域的确认", , , , , , 8)
arr1 = rng1
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
arr = .Rows(1)
l2 = UBound(arr, 2)
Set rng = .Find(What:="合计", LookIn:=xlValues, _
LookAt:=xlWhole, SearchDirection:=xlPrevious)
rngRow = rng.Row
End With
If l > rngRow Then
For i = 1 To l2
On Error Resume Next
num = WorksheetFunction.Match(arr(1, i), arr1, 0)
If Err.Number = 0 Then
ReDim Preserve arrt(1 To rngRow - 2, 1 To 9)
For j = 1 To rngRow - 2
arrt(j, num) = Cells(j + 1, num)
Next j
End If
Next i
Else
For i = 1 To l2
On Error Resume Next
num = WorksheetFunction.Match(arr(1, i), arr1, 0)
If Err.Number = 0 Then
ReDim Preserve arrt(1 To l - 1, 1 To 9)
For j = 1 To l - 1
arrt(j, num) = Cells(j + 1, i)
Next j
End If
Next i
End If
ActiveWorkbook.Close True
ActiveSheet.Cells(l1 + 1, 1).Resize(UBound(arrt), 9) = arrt
Erase arrt
End If
line:
f = Dir()
Loop
End Sub
代码看起来很长是不是,但是不要方
我们仔细看看代码,其实基本框架都是上一节的代码,只有两部分是今天新增的代码块
还是来看看代码的效果
代码解析
完美
看看上面的动图效果,每一次代码的执行,都能够得到一个结果,并且是在指定的字段汇总指定的数据,没有的字段,都是数据为空,不会出现混乱和干扰的情况
因为基本的主框架,是我们之前上一节的代码,所以本节就不在过多的浪费时间是说了,今天我们直奔重点,来看看到底是如何实现的
一看代码就知道,我们这里使用了动态数组的
同时搭配数组的匹配方法,match方法不知道大家是否还记得
通过match方法,我们可以成功的得到当前打开的活动工作簿的标头在汇总版的工作簿中的
然后就可以在对应的数组中写入对应的数据了,比方说num=5,那么就是在动态数组中的第5个位置写入数据
这里需要区分的就是是否有空行,有空行和没有空行,最后一个非空单元格的位置是不一样的,所以也导致数组的最大下标会有所不同,这是我们上一节的知识,两节的知识点,一结合,完美。
==============================