Это утилита, которую я использовал в прошлом. Он имеет немного внешнего интерфейса, позволяющего выбирать файлы, которые вы хотите объединить, но он должен предоставить вам код, который вы ищете. Удачи!
Public FirstRowUsed As Integer
Sub CreateInputFile()
Dim fs, f, s
Dim PathInfo As Variant
Dim TrueVar As Variant
Dim FileToOpen() As Variant
'screen.mousepointer = fmMousePointerHourglass
Application.Cursor = xlWait
FirstRowUsed = 3
LastRowUsed = ActiveSheet.UsedRange.Rows.Count
If LastRowUsed >= FirstRowUsed Then
ClearSheet = MsgBox("Clear Sheet?", vbOKCancel, "Current Data will be deleted")
If ClearSheet = 1 Then
x = Range(Cells(FirstRowUsed, 1), Cells(ActiveSheet.UsedRange.Rows.Count, 1)).Select
Selection.EntireRow.Delete
x = Range(Cells(FirstRowUsed, 1), Cells(FirstRowUsed, 1)).Select
Selection.Activate
Else
x = MsgBox("Process Terminated, No Action Taken.", vbOKOnly)
GoTo CreateInputFileExit
End If
End If
TrueVar = True
FileToOpen = Application _
.GetOpenFilename("Excel Files (*.xls;*.xlsx),*.xls;*.xlsx,(*.xlsx),*.xlsx", , "Select Files to Combine", , TrueVar)
On Local Error Resume Next
If UBound(FileToOpen) < 1 Then
x = MsgBox("Process Terminated", vbOKOnly)
GoTo CreateInputFileExit
Else
Set fs = CreateObject("Scripting.FileSystemObject")
Set FileInfo = fs.GetFile(FileToOpen(1))
TargetPath = fs.GetParentFolderName(FileToOpen(1))
End If
On Local Error GoTo 0
Set PathInfo = fs.Getfolder(TargetPath)
TargetPath = PathInfo.shortpath
Application.StatusBar = False
On Local Error Resume Next
Call GetFileInfo(FileToOpen())
Application.StatusBar = False
Application.ScreenUpdating = True
SendKeys "^{HOME}" 'Ctrl+Home
CreateInputFileExit:
Application.Cursor = xlDefault
End Sub
Sub GetFileInfo(FileToOpen() As Variant)
Dim Row As Double
Dim FileCtr As Double
Dim ReportInterval As Double
Dim fs, f, s
Dim FileInfo As Variant
Dim Ext As String
On Local Error Resume Next
Set fs = CreateObject("Scripting.FileSystemObject")
Row = FirstRowUsed
ReportInterval = 100
FileCtr = 0
For i = 1 To UBound(FileToOpen)
TotFileName = FileToOpen(i)
DirCheck = Dir(TotFileName)
DateOut = FileDateTime(TotFileName)
FileLength = FileLen(TotFileName)
If DirCheck > "" Then ' Eliminates Directory entries
Set FileInfo = fs.GetFile(TotFileName)
Ext = fs.GetExtensionName(TotFileName)
Pathname = fs.GetParentFolderName(TotFileName)
Filename = FileInfo.Name
Cells(Row, 1) = Pathname
Cells(Row, 2) = Filename
Cells(Row, 3) = DateOut
Cells(Row, 4) = FileLength
Cells(Row, 5) = TotFileName
Cells(Row, 6) = Ext
Row = Row + 1
FileCtr = FileCtr + 1
If FileCtr Mod ReportInterval = 0 Then
DoEvents
Application.ScreenUpdating = True
Cells(Row - 1, 1).Activate 'Makes the screen change a bit so the user knows it is working
Application.ScreenUpdating = False
Application.StatusBar = "File Names Processed so far: " & FileCtr
End If
End If
Next i
Application.StatusBar = False
End Sub
Sub MergeTheFiles()
Dim FileSheet As Worksheet
Dim TargetBook As Workbook
Dim SourceBook As Workbook
FileSheetNm = "FileList"
ActiveWorkbook.Worksheets(FileSheetNm).Activate
Set FileSheet = ActiveSheet
Set Targetworkbook = Workbooks.Add
MaxRow = FileSheet.UsedRange.Rows.Count
Numfiles = MaxRow - 2
For i = 3 To MaxRow
Sourcefile = FileSheet.Cells(i, 5)
Workbooks.Open Filename:=Sourcefile, UpdateLinks:=3, ReadOnly:=True
Set SourceWorkBook = ActiveWorkbook
TargetDirectory = FileSheet.Cells(i, 1)
Application.DisplayAlerts = False
For Each sh In SourceWorkBook.Worksheets
ShtNm = sh.Name
LastSheet = Targetworkbook.Worksheets.Count
sh.Copy After:=Targetworkbook.Sheets(LastSheet)
Set CurrSht = ActiveWorkbook.Worksheets(LastSheet + 1)
Set TrgtSht = ActiveWorkbook.Worksheets(1)
TrgtAddr = Cells(TrgtSht.UsedRange.Rows.Count + 1, 1).Address
With CurrSht
lRow = .Cells.Find(What:="*", _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
lCol = .Cells.Find(What:="*", _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
.Range(.Cells(1, 1), .Cells(lRow, lCol)).Copy Destination:=TrgtSht.Range(TrgtAddr)
End With
CurrSht.Delete
Next sh
Application.DisplayAlerts = True
SourceWorkBook.Close SaveChanges:=False
Next i
DateOfFile = Format(Date$, "yyyy-mm-dd")
TargetFileName = "$Date XYZ"
TargetFileName = Application.WorksheetFunction.Substitute(TargetFileName, "$Date", DateOfFile)
fileSaveName = Application.GetSaveAsFilename( _
InitialFilename:=TargetFileName, _
fileFilter:="Excel Files (*.xlsx), *.xlsx")
NewFileNameAndDir = fileSaveName
If InStr(UCase(NewFileNameAndDir), ".XLS") = 0 Then
If Right(NewFileNameAndDir, 1) = "." Then
NewFileNameAndDir = NewFileNameAndDir & "xlsx"
Else
NewFileNameAndDir = NewFileNameAndDir & ".xlsx"
End If
End If
ActiveWorkbook.SaveAs Filename:=NewFileNameAndDir, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
With Application
.Calculation = xlManual
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = False
With Application
.Calculation = xlAutomatic
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = False
ActiveWorkbook.Save
End Sub
'''