Excel VBA 7.27按照报表名称提取指定字段,如果你还在手工填充数据,这里有你想要的
在昨天我们分享了关于工作表数据汇总的过程中,一种非常规但是又经常使用到的一种操作,就是从不规则的报表中提取我们需要的那一段规则数据,这样对于需要详细数据参考的时候,是很有帮助的,但是有时候,可能我们并不需要如此详细的数据,我们需要的仅仅是某个字段的数据,比方说总计,总和,总数,仅此而已,并且位置各不相同,那么在这样的情况下,如何将某个字段的数据抽取出来呢?
场景简介
我们在之前的总分数据表中增加一个字段,总分字段,并且针对所有的总分数据进行求和,得到每一周的总分

为了贴近真实的使用场景,我们这里将其中一个工作表的数据进行重新填充,并且删减部分数据,使得数据结果和字段位置和其他的都不同,如上图所示。
其中一个表有10行数据,但是另外一个表却有9行数据
而我们希望得到的效果是这样的

指定工作表的名称,从指定的工作薄中获取我们想要的字段的数据,如果为空,就跳过。
代码区
我们来看看代码
Sub test()
Dim pathn$, tirng As Range, rng As Range, a As Range, trng As Range, targetrng As Range, arr()
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = -1 Then
pathn = .SelectedItems(1)
End If
End With
Set tirng = Application.InputBox("请选择工作薄名称所在列", "工作薄名称确定", , , , , , 8)
Set rng = Application.InputBox("请选择要汇总字段所在列", "字段的确定", , , , , , 8)
k = 0
For Each trng In tirng
f = Dir(pathn & "\")
Do While f <> ""
fnmae = Split(f, ".")(0)
If fnmae = trng Then
Workbooks.Open pathn & "\" & f
j = 0
k = k + 1
For Each a In rng
For Each sth In ActiveWorkbook.Worksheets
With sth.UsedRange
Set targetrng = .Find(a, , , xlWhole)
If Not targetrng Is Nothing Then
j = j + 1
ReDim Preserve arr(1 To rng.Columns.Count, 1 To k)
arr(j, k) = targetrng.Offset(0, 1)
End If
End With
Next sth
Next a
ActiveWorkbook.Close False
End If
f = Dir()
Loop
Next trng
ActiveSheet.Cells(2, 2).Resize(UBound(arr, 2), UBound(arr)) = WorksheetFunction.Transpose(arr)
End Sub
依然是大家最喜欢的数组用法
先确定工作薄名称和要提取的字段名称

看看最终结果

副本3的第二周数据为空?为什么呢?
原来原始数据中,数据本身就是空的,非常完美

代码分析
本节的代码就比较的简单了,都是一些老面孔了,还是和大家说下数组在本案例中的构造方法吧
我们本节需要构造的依然是一个多维数据,怎么样的多维数组呢?
首先我们可以确定一点,就是一定有3个字段,就是第一周总分,第二周总分,以及第三周总分,这三个字段是固定的,不固定的就是不确定需要汇总多少个数据,只要有一个固定,我们就可以构造动态数组
ReDim Preserve arr(1 To rng.Columns.Count, 1 To k)
rng.Columns.Count
代表的就是三个字段的总数,因为我们在最开始将这三个字段赋值给了rng,k代表的就是我们正在读取第几个工作表,在读取第几个,那么就是第几列

以第二列为例,最终就是如此的效果
赞 (0)