有多张表格,每张表格的格式不同有的10列,有的12列,且顺序也不同等等,但是都包含需求的几列数据,因此希望可以通过VBA 实现按照汇总表定义好的5个列标题进行数据提取,将文件夹下的每个excel文件中每个表格中与汇总表确认列标题名称相同的内容复制到汇总到汇总表中,不需要计算,只需要提取数据一次汇总到汇总表中
如下示意图,按照列标题BCDA 的顺序一次在每个工作簿中提取对应的数据。
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下,可以这样试一下:
以下是一个VBA示例代码,可以实现按照汇总表定义的列标题名称,在每个工作簿中提取对应的数据,然后将数据汇总到汇总表中。
Sub ExtractData()
Dim folderPath As String
folderPath = "C:\Data\" '替换为实际文件夹路径
Dim summarySheet As Worksheet
Set summarySheet = ThisWorkbook.Sheets("汇总表") '替换为实际汇总表工作表名称
Dim headerNames(1 To 5) As String
headerNames(1) = "B"
headerNames(2) = "C"
headerNames(3) = "D"
headerNames(4) = "A"
headerNames(5) = "E" '替换为实际需要提取的列标题名称
Dim rowIndex As Integer
rowIndex = 2 '替换为实际汇总表数据开始行号
Dim fileName As String
fileName = Dir(folderPath & "*.xlsx")
Do While fileName <> ""
Dim wb As Workbook
Set wb = Workbooks.Open(folderPath & fileName)
For Each ws In wb.Worksheets
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row '替换为实际数据最后一行行号
Dim headerRow As Range
Set headerRow = ws.Rows(1)
Dim headerIndex(1 To 5) As Integer
For i = 1 To 5
headerIndex(i) = WorksheetFunction.Match(headerNames(i), headerRow, 0)
Next i
For i = 2 To lastRow
Dim rowData(1 To 5) As Variant
Dim rowValid As Boolean
rowValid = True
For j = 1 To 5
If IsError(ws.Cells(i, headerIndex(j))) Then
rowValid = False
Exit For
End If
rowData(j) = ws.Cells(i, headerIndex(j)).Value
Next j
If rowValid Then
summarySheet.Cells(rowIndex, 1).Value = fileName
For j = 1 To 5
summarySheet.Cells(rowIndex, j + 1).Value = rowData(j)
Next j
rowIndex = rowIndex + 1
End If
Next i
Next ws
wb.Close SaveChanges:=False
fileName = Dir()
Loop
End Sub
这段代码首先定义了一个文件夹路径和汇总表工作表对象,以及需要提取的列标题名称。然后,它使用Dir函数遍历文件夹中的所有Excel文件,并逐个打开每个文件,提取每个工作表中与汇总表确认列标题名称相同的内容,并将数据复制到汇总表中相应的位置。
请根据实际情况修改代码中的文件夹路径、汇总表工作表名称、需要提取的列标题名称、汇总表数据开始行号等参数。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这是一个比较复杂的VBA程序,需要涉及到文件夹的读取、遍历文件、打开文件、读取对应的sheet、读取对应的列等等操作。以下是一个示例程序,可以自行修改其中的路径、文件名、列名称等等信息。
Sub extractData()
Dim folderPath As String, filePath As String, fileName As String
Dim wb As Workbook, ws As Worksheet, wsSummary As Worksheet
Dim lastRow As Long, i As Long
Dim colB, colC, colD, colA, colE As Integer
'设置列名称对应的列数
colB = 2
colC = 3
colD = 4
colA = 1
colE = 5
'打开汇总表
Set wsSummary = ThisWorkbook.Sheets("汇总表")
'设置文件夹路径
folderPath = "C:\Users\UserName\Documents\"
'列标题名称
Dim colNameB, colNameC, colNameD, colNameA, colNameE As String
colNameB = "B列名称"
colNameC = "C列名称"
colNameD = "D列名称"
colNameA = "A列名称"
colNameE = "E列名称"
'遍历文件夹下的所有文件
filePath = folderPath & "*.xlsx"
fileName = Dir(filePath)
Do While fileName <> ""
Set wb = Workbooks.Open(folderPath & fileName)
'遍历工作簿中所有sheet
For Each ws In wb.Worksheets
'在当前sheet中查找对应的列标题,找到列数并复制数据
If findColumn(ws, colNameB) <> -1 And _
findColumn(ws, colNameC) <> -1 And _
findColumn(ws, colNameD) <> -1 And _
findColumn(ws, colNameA) <> -1 And _
findColumn(ws, colNameE) <> -1 Then
lastRow = ws.Cells(ws.Rows.Count, colB).End(xlUp).Row
For i = 2 To lastRow
wsSummary.Cells(wsSummary.Rows.Count, colB).End(xlUp).Offset(1, 0).Value = ws.Cells(i, colB).Value
wsSummary.Cells(wsSummary.Rows.Count, colC).End(xlUp).Offset(1, 0).Value = ws.Cells(i, colC).Value
wsSummary.Cells(wsSummary.Rows.Count, colD).End(xlUp).Offset(1, 0).Value = ws.Cells(i, colD).Value
wsSummary.Cells(wsSummary.Rows.Count, colA).End(xlUp).Offset(1, 0).Value = ws.Cells(i, colA).Value
wsSummary.Cells(wsSummary.Rows.Count, colE).End(xlUp).Offset(1, 0).Value = ws.Cells(i, colE).Value
Next i
End If
Next ws
wb.Close
'继续查找下一个文件
fileName = Dir
Loop
End Sub
Function findColumn(ws As Worksheet, colName As String) As Integer
'查找列标题名称为colName的列数
findColumn = -1
For i = 1 To ws.Range("A1").End(xlToRight).Column
If ws.Cells(1, i).Value = colName Then
findColumn = i
Exit Function
End If
Next i
End Function
需要注意的是,这个程序仅适用于汇总表和各个工作簿中数据都在第一行开始的情况。如果有其他情况的话,需要自行修改程序中的变量和程序逻辑。
如果我的回答解决了您的问题,请采纳!