我有一个当前的项目,要求我打开一个Excel文档,找出该文档的格式(“标题”是什么样的A:A内容),然后弄清楚它是否遵循新的文档布局格式化,并转换必要的数据以符合新的格式。
我必须为成千上万的文件执行此操作,因此我希望尽可能多地自动执行发现部分,并且计划只需要为某些内容类型编写一些一次性解决方案(具有特定数据的文档,需要保留作为新格式的例外)。
这是我正在尝试做的事情的背景。我已经到了尝试在每张表中填充行A:A的内容数组,但我的ReDim语句失败,因为我保证我做错了。
以下是我从表格中得到的内容:
For Each Sht In SourceWorkbook.Sheets
Sht.Activate
SourceHeaderCount = ActiveSheet.UsedRange.Columns.Count
Set SourceHeaderRange = Sht.Range("A1:A" & SourceHeaderCount)
ReDim Preserve SourceHeaders(0 To UBound(SourceHeaders) + SourceHeaderCount)
SourceHeaders(UBound(SourceHeaders)) = SourceHeaderRange
Next Sht
同样,我的想法是获取A:A(仅使用内容)的内容,以便我有一个文件列表,然后将该列表与我需要的列表进行比较,然后从那里我需要创建子函数来处理每种类型的转换。首先,我需要知道文件的内容。我有什么想法可以使这项工作?我认识到这种方法在面对非标准化数据时存在缺陷(比如a2未被使用但是使用了a3?)但是出于上下文的目的,假设所有文档都易于使用,并且没有真正奇怪的数据方案担心。
感谢您的帮助!
答案 0 :(得分:1)
我发现在将一些具有相似(但不符合)布局的工作表聚合到一个通用工作表时,逐砖方法需要更长时间,但它是最彻底的。在下文中,每个排序的工作表都检查每个列标题标签,以查看它是否已存在于目标工作表中。如果没有,则将其插入第1行的最右端,然后循环继续。
Dim r As Long, c As Long, tr As Long, tc As Long, ws As Worksheet, wst As Worksheet
Set wst = Sheets("All_of_Them")
For Each ws In Worksheets
With ws
If .Name <> wst.Name Then
With .Cells(1, 1).CurrentRegion
tr = wst.Cells(1, 1).CurrentRegion.Rows.Count + 1
For c = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column
If Not CBool(Application.CountIf(wst.Rows(1), .Cells(1, c).Value)) Then
wst.Cells(1, .Columns.Count).End(xlToLeft).Offset(0, 1) = .Cells(1, c).Value
End If
tc = Application.Match(.Cells(1, c).Value, wst.Rows(1), 0)
.Columns(c).Offset(1, 0).Copy Destination:=wst.Cells(tr, tc)
Next c
End With
End If
End With
Next ws
Set wst = Nothing
以上内容应该可以轻松扩展到一个或多个文件夹中的多个工作簿。目标工作表可以作为空白工作表开始,并且随着带有顺序工作表的新标题标签的引入,将构建聚合列标题标签。