Merge Multiple Excel files into a Single File - Get Specific Column

Rumman Ansari   Software Engineer   2024-09-04 11:30:02   18  Share
Subject Syllabus DetailsSubject Details Login to Open Video
☰ TContent
☰Fullscreen

Table of Content:



Sub MergeExcelFiles()
    Dim Path As String
    Dim Filename As String
    Dim wbSource As Workbook
    Dim ws As Worksheet
    Dim newSheet As Worksheet
    Dim lastCol As Long
    Dim lastRow As Long
    Dim copyRange As Range
    Dim isFirstFile As Boolean
    Dim baseSheetName As String
    Dim sheetCounter As Integer
    isFirstFile = True

    ' Set the path to the folder containing the Excel files
    Path = "C:\Your\Folder\Path\Here\"  ' Update this to your folder path
    
    ' Get the first Excel file from the directory
    Filename = Dir(Path & "*.xlsx")
    
    ' Loop through all Excel files in the folder
    Do While Filename <> ""
        ' Open the current Excel file
        Set wbSource = Workbooks.Open(Path & Filename, ReadOnly:=True)
        
        ' Get the base sheet name from the file name (without extension)
        baseSheetName = Left(Filename, InStrRev(Filename, ".") - 1)
        sheetCounter = 1
        
        ' Loop through each sheet in the opened workbook
        For Each ws In wbSource.Sheets
            ' Copy all columns from the sheets in the first file
            If isFirstFile Then
                ws.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
                ' Rename the sheet based on the file name
                ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = baseSheetName & "_" & ws.Name
            Else
                ' Create a new sheet in the destination workbook
                Set newSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))

                ' Find the last row and column in the source sheet
                lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
                lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
                
                ' Copy only the columns from the second column onward
                Set copyRange = ws.Range(ws.Cells(1, 2), ws.Cells(lastRow, lastCol))
                copyRange.Copy Destination:=newSheet.Cells(1, 1)
                
                ' Rename the new sheet based on the file name and sheet counter
                newSheet.Name = baseSheetName & "_part_" & sheetCounter
                sheetCounter = sheetCounter + 1
            End If
        Next ws
        
        ' Close the source workbook without saving
        wbSource.Close False
        
        ' Move to the next file
        Filename = Dir()
        ' Set isFirstFile to False after the first file is processed
        isFirstFile = False
    Loop
    
    MsgBox "Sheets have been merged into this workbook."
End Sub

How It Works

  1. Naming the Sheets:

    • For the first file, the sheet names will be the original sheet name prefixed with the Excel file name.
    • For subsequent files, new sheets will be named based on the Excel file name, followed by "part" and a counter (e.g., "FileName_part_1").
  2. Base Sheet Name:

    • baseSheetName is derived from the filename of the Excel file (excluding the extension). This name is used as a prefix for the new sheet names.
  3. Sheet Counter:

    • sheetCounter is used to differentiate between multiple sheets copied from the same Excel file.

Steps to Use the Code

  1. Insert the VBA Code:

    • Open the VBA editor in Excel, insert a module, and paste the updated code.
  2. Set the Path:

    • Update the Path variable to point to the folder where your Excel files are stored.
  3. Run the Macro:

    • Press F5 or go to Run > Run Sub/UserForm to execute the macro.
  4. Save the Workbook:

    • After the macro completes, save your workbook. The sheets will be named according to the file they came from.

This will result in the merged workbook having sheets named based on the original Excel file names, allowing you to easily identify the source of each sheet.