闲来无事,今天打算再来一波。
工作表拆分,相信网络上一定有相当多的版本,但是我今天展示的版本,基本上没有人展示过,不信我们走着瞧!
首先,我们来看数据源及需求:
要求:
1、按年度将本工作表进行拆分,每个年度以文件单独存在;
2、保留表头1-3行的格式不变。
要求1我们先不说,先说要求2,保留格式这条。为了达成这个需求,我们可以将此表格复制一份空表作为模板,这样的话,格式就完全保留了。如下图:
解题思路:
1、将不同年度的商品明细全部单独放置一个数组中;
2、循环年度个数,同时复制模板并另存为文件,同时将每个数组的数据清单放入单元格中,并设置格线。
难点:
1、有多少个年度未知,那么我们需要多少个数组呢?如果有100个年度,我们就要定义100个数组么?
2、怎样将数据放入对应的数组?
今天,数组嵌套数组、字典数组通通上马,让大家明白,原来数组还可以这样用。说多了无用,直接上代码!!
大家可以复制以下代码,并模拟做一个同样的数据源表,赶快试一试吧。
Sub 工作表拆分的数组嵌套解法() Application.ScreenUpdating = False Dim d As New Dictionary Dim dic() As New Dictionary Dim brr(1 To 4000, 1 To 11) '已知每个年度的产品将不会超过4000 Dim arrResult() Dim arrData As Variant Dim iRow As Integer, wbk As Workbook Dim i As Integer, x As Integer Dim n As Integer, k As Integer, iPerRow As Integer With Sheet4 '指向数据源 iRow = .Range("a65536").End(xlUp).Row arrData = .Range("a4:k" & iRow).Value For i = 1 To UBound(arrData) If d.Exists(arrData(i, 4)) = False Then n = n + 1 d(arrData(i, 4)) = n 'n用于记录有多少个年度 ReDim Preserve arrResult(1 To n) arrResult(n) = brr '重点,将一数组装入另一数组 ReDim Preserve dic(1 To n) As New Dictionary '用数组字典记录每个年度有多少条记录 End If k = d(arrData(i, 4)) '取得第几位的年度 dic(k)(arrData(i, 4)) = dic(k)(arrData(i, 4)) + 1 '记录有多少行 iPerRow = dic(k)(arrData(i, 4)) '取得此行数 For x = 1 To UBound(arrData, 2) arrResult(k)(iPerRow, x) = arrData(i, x) '第几个嵌套数组的某行取值 Next x Next i End With If n > 0 Then '当年度数大于0时 For i = 1 To n Sheet5.Copy Set wbk = ActiveWorkbook wbk.SaveAs ThisWorkbook.Path & "\" & d.Keys(i - 1) & ".xls", xlNormal '存为03格式,要加格式参数 wbk.ActiveSheet.Range("a4").Resize(dic(i).Items(0), 11) = arrResult(i) Call SetFormat(wbk.ActiveSheet.Range("a4").Resize(dic(i).Items(0), 11)) wbk.Close True Next i End If Application.ScreenUpdating = TrueEnd SubPublic Sub SetFormat(rg As Range) '设置格式 With rg .Borders.LineStyle = 1 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .ShrinkToFit = True End WithEnd Sub
注意:请将拆分模板单独放一个文件下面,以下是拆分之后的文件目录!
我们随便打开一个文件,看里面的内容是否拆分正确。
很简单的吧。
要想将VBA运用于我们的工作中,数组和字典的各种用法我们必须要学习透。
有人会说,干吗不用ADO,干吗不SQL?
中国人的做表习惯,各种合并单元格,各种格式不统一,这些都是SQL的拦路虎。除非是你自己做小系统,否则,我们还是不要去想SQL吧。
下面是代码的截图,大家可以参考一下排版格式。
大家若有任何疑问,请留言给我,我会一一解答的。