Excel VBA 7.17单个Excel 工作薄不连续表头数据的汇总
前景提要(文末提供源码下载)
前不久在上班的时候,忽然有小伙伴们对于说自己想要合并汇总单个Excel工作薄下指定工作表的的不连续字段的数据,我之前确实是写过工作薄规范数据的合并,但是翻翻之前的文章,在之前写Excel工作薄的时候,并没有涉及到指定字段的汇总的写法,正好也和工作表有关系,今天就一起分享下这个需求,算是第5系列的补充吧
场景模拟
依然还是用我们之前的三班的成绩的案例来分析,我们将数据扩展下,增加了PHP等语言,方面我们的进行不连续列的操作
代码区
首先,最直接的复制
Sub ss()
Dim rng As Range, arr, sth As Worksheet, sth1 As Worksheet
Set sth1 = ActiveSheet
Set sth = Worksheets.Add
sth.Name = "指定列汇总"
sth1.Activate
Set rng = Application.InputBox("区域", "标题", , , , , , 8)
arr = ActiveSheet.Rows(1)
k = k
For Each a In rng
k = k + 1
l = sth.Cells(1, Columns.Count).End(xlToLeft).Column
num = WorksheetFunction.Match(a, arr, 0)
sth1.UsedRange.Columns(num).Copy
If k = 1 Then
sth.Cells(1, l).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Else
sth.Cells(1, l + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If
Next a
End Sub
看看效果
成功的将不连续列复制了过来,并且存在公式的总分列也替换成为了数字,不会含有公式了。
然后是数组的方式
Sub arr()
Dim rng As Range, a As Range, trng As Range, arr(), arr1, sth As Worksheet
Set rng = Application.InputBox("区域", "标题", , , , , , 8)
arr1 = ActiveSheet.UsedRange.Rows(1)
l = Cells(Rows.Count, 1).End(xlUp).Row
k = 0
For Each a In rng
k = k + 1
num = WorksheetFunction.Match(a, arr1, 0)
ReDim Preserve arr(1 To l, 1 To k)
For i = 1 To l
arr(i, k) = ActiveSheet.UsedRange.Cells(i, num)
Next i
Next a
Set sth = Worksheets.Add
sth.Name = "汇总指定不连续列"
sth.Cells(1, 1).Resize(l, k) = arr
End Sub
看看效果
上面的复制粘贴的结果一样,都得到了我们想要的不连续数据,同时将方式转化成为了数值
代码分析
复制粘贴法
相信和我一起学习到这里,熟悉我写法风格的小伙伴们应该都能够理解最前面的这些简单的代码的内容了,今天我着重讲解下新的知识点。
sth.Cells(1, l).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
选择性粘贴,只粘贴数值,这样一来我们就可以避免公式给我们带来的烦恼了。大致效果相当于鼠标右键的这里
其实不需要记住那么多,记住逻辑结果就好,需要的时候直接更改下前面的位置区域直接套用
来看看数组的写法,关键代码就这一块
For Each a In rng
k = k + 1
num = WorksheetFunction.Match(a, arr1, 0)
ReDim Preserve arr(1 To l, 1 To k)
For i = 1 To l
arr(i, k) = ActiveSheet.UsedRange.Cells(i, num)
Next i
Next a
其实方法讲解起来也是非常的简单,遍历循环我们选中的单元格区域,即标头,然后找到该表头所在的行数
比方说PHP
我们来看看代码调试,num是不是等于4
然后我们将第4列的数据全部复制给数组
这样就一一的对应上了,其他的表头也是这样的操作逻辑的,最后新建一个工作表,将数组一次性写入,就完美的结束了
赞 (0)