excel - VBA将数据从文件夹合并到Excel中的单个工作表
问题描述
我刚刚从这个论坛找到了下面的 vba 代码,并试图包含要复制的 excel 文件的列标题,但没有运气。请帮忙。
Sub ConsolidateWorkbooks()
Dim FolderPath As String, Filename As String, sh As Worksheet, ShMaster As Worksheet
Dim wbSource As Workbook, lastER As Long, arr
'adding a new sheet on ThisWorkbook (after the last existing one)
Set ShMaster = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Sheets.count))
Application.ScreenUpdating = False
FolderPath = "P:\FG\03_OtD_Enabling\Enabling\Teams\Enabling_RPA\Other Automations\Excel Merge Several Files\Data\"
Filename = Dir(FolderPath & "*.xls*")
Do While Filename <> ""
'set the workbook to be open:
Set wbSource = Workbooks.Open(Filename:=FolderPath & Filename, ReadOnly:=True)
For Each sh In ActiveWorkbook.Worksheets 'iterate between its sheets
lastER = ShMaster.Range("A" & rows.count).End(xlUp).row 'last empty row
'put the sheet range in an array:
arr = sh.Range(sh.UsedRange.cells(1, 1).Offset(1, 0), _
sh.cells(sh.UsedRange.rows.count - sh.UsedRange.row + 1, _
sh.UsedRange.Columns.count)).Value
'drop the array content at once:
ShMaster.Range("A" & lastER).Resize(UBound(arr), UBound(arr, 2)).Value = arr
Next sh
wbSource.Close 'close the workbook
Filename = Dir() 'find the next workbook in the folder
Loop
Application.ScreenUpdating = True
End Sub
解决方案
合并工作簿
这将仅复制每个工作簿的每个第一个工作表的标题。
如果您打算复制每个工作表的标题,它会变得简单得多,即变得
surg
多余:srCount
sIsFirstWorksheet
For Each sws In swb.Worksheets Set srg = sws.UsedRange dCell.Resize(srg.Rows.Count, srg.Columns.Count).Value = srg.Value Set dCell = dCell.Offset(srg.Rows.Count) Next sws
如果您希望数据集之间有一个或多个空行,您可以轻松实现一个常量(例如
Const Gap As Long = 1
)并将其添加到“偏移部分”:Set dCell = dCell.Offset(srCount + Gap)
Option Explicit
Sub ConsolidateWorkbooks()
Const ProcTitle As String = "Consolidate Workbooks"
Const sFolderPath As String = "P:\FG\03_OtD_Enabling\Enabling\Teams\" _
& "Enabling_RPA\Other Automations\Excel Merge Several Files\Data\"
Const sFilePattern As String = "*.xls*"
' Source (Are there any files?)
Dim sFileName As String: sFileName = Dir(sFolderPath & sFilePattern)
If Len(sFileName) = 0 Then
MsgBox "No files to process.", vbCritical, ProcTitle
Exit Sub
End If
Application.ScreenUpdating = False
' Destination (Workbook - Worksheet - Range (First Cell))
Dim dwb As Workbook: Set dwb = ThisWorkbook
Dim dws As Worksheet ' note 'Worksheets vs Sheets':
Set dws = dwb.Worksheets.Add(After:=dwb.Sheets(dwb.Sheets.Count))
Dim dCell As Range
Set dCell = dws.Cells(dws.Rows.Count, 1).End(xlUp).Offset(1)
' Source (Variables)
Dim swb As Workbook
Dim sws As Worksheet
Dim surg As Range
Dim srg As Range
Dim srCount As Long
Dim sFilePath As String
Dim sIsFirstWorksheet As Boolean
Do While Len(sFileName) > 0
sFilePath = sFolderPath & sFileName
Set swb = Workbooks.Open(Filename:=sFilePath, ReadOnly:=True)
sIsFirstWorksheet = True
For Each sws In swb.Worksheets
Set surg = sws.UsedRange
If sIsFirstWorksheet Then ' copy headers
srCount = surg.Rows.Count
Set srg = surg
sIsFirstWorksheet = False
Else ' don't copy headers
srCount = surg.Rows.Count - 1
Set srg = surg.Resize(srCount).Offset(1)
End If
dCell.Resize(srCount, srg.Columns.Count).Value = srg.Value
Set dCell = dCell.Offset(srCount)
Next sws
swb.Close SaveChanges:=False
sFileName = Dir
Loop
'dwb.Save
Application.ScreenUpdating = True
MsgBox "Workbooks consolidated.", vbInformation, ProcTitle
End Sub
推荐阅读
- python - requests.exceptions.MissingSchema:无效的 URL 'channel_url':未提供架构。也许您的意思是 http://channel_url?
- c# - 为什么我在此 XDocument 的第二次迭代中再次获得第一个节点
- algorithm - 这个算法问题的研究领域是什么?
- javascript - 如何从堆中删除未安装的组件?
- permalinks - 如何使用带有普通永久链接的 Woocommerce REST API?
- asp.net-mvc - IdentityServer4 用户管理与单独的 MVC 客户端 (AspNetIdentity)
- flutter - 流未在另一个流侦听功能中更新
- c# - '在 Visual Studio 2019 中找不到本地数据库选项'
- spring - 将对象列表分页到 Angular 7
- jsonschema - api-blueprint 没有正确显示嵌套的“一个”属性