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 IfEnd WithSet tirng = Application.InputBox("请选择工作薄名称所在列", "工作薄名称确定", , , , , , 8)Set rng = Application.InputBox("请选择要汇总字段所在列", "字段的确定", , , , , , 8)k = 0For 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() LoopNext trngActiveSheet.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)

相关推荐