Home > Software engineering >  Splitting Sheets with Same Name Range in One Excel Workbook - Excel VBA
Splitting Sheets with Same Name Range in One Excel Workbook - Excel VBA

Time:11-21

I have some Excel workbooks which contains more than 100 sheets. The sheet names like below;

  • TTBMA2453_Speclist, TTBMA2454_Speclist, TTBMA2455_Speclist and goes on..
  • WBXXTTBMA2453_Featurelist, WBXXTTBMA2454_Featurelist, WBXXTTBMA2455_Featurelist and goes on..
  • WBXXTTBMA2453_Corelist, WBXXTTBMA2454_Corelist, WBXXTTBMA2455_Corelist and goes on..

I want to split all spec, feature and corelist sheets which are starting with same speclist name in the same workbook and merge/save to another Excel workbook in a specific file using Excel VBA.

(e.g combining TTBMA2453_Speclist, WBXXTTBMA2453_Featurelist WBXXTTBMA2453_Corelist and copy them as new workbook with original sheets)

Please find the code sample I have. This code splits sheets of the same name (which I added manually) into workbooks. However, this code does not re-merge the sheets in a different workbook and sheet names are entered manually. So, that's not what I want.

Sub SplitEachWorksheet()
  Dim FPath As String
  FPath = Application.ActiveWorkbook.Path
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Dim ws As Worksheet
  Dim fnameList, fnameCurFile As Variant
  Dim countFiles, countSheets As Integer
  Dim wksCurSheet As Worksheet
  Dim wbkCurBook, wbkSrcBook As Workbook
  
  For Each ws In ThisWorkbook.Worksheets
    If Left$(ws.Name, 9) = "TTBMA2453" Then ' <--- added an IF statement
        ws.Copy
        
        Application.ActiveWorkbook.SaveAs Filename:=FPath & "\" & ws.Name & ".xlsx"
        Application.ActiveWorkbook.Close False
        
    End If
    
  Next
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  
End Sub

CodePudding user response:

Option Explicit

Sub SplitEachWorksheet()

    Dim wb As Workbook, wbNew As Workbook, ws As Worksheet
    Dim num As Collection, n, dict As Object
    Dim FPath As String
    
    FPath = Application.ActiveWorkbook.Path
    
    Set num = new Collection
    Set dict = CreateObject("Scripting.Dictionary")
    Set wb = ThisWorkbook
    For Each ws In wb.Worksheets
       If ws.Name Like "*_Speclist" Then
           num.Add Left(ws.Name, Len(ws.Name) - 9)
       End If
       dict.Add ws.Name, ws.Index
    Next
    
    ' check sheets
    Dim msg As String, s As String
    For Each n In num
        s = "WBXX" & n & "_Corelist"
        If Not dict.exists(s) Then
            msg = msg & vbLf & s & " missing"
        End If
       
        s = "WBXX" & n & "_Featurelist"
        If Not dict.exists(s) Then
            msg = msg & vbLf & s & " missing"
        End If
    Next
    If Len(msg) > 0 Then
       MsgBox msg, vbCritical
       Exit Sub
    End If
    
    ' check workbooks
    Application.ScreenUpdating = False
    For Each n In num
        wb.Sheets(n & "_Speclist").Copy
        Set wbNew = ActiveWorkbook
        wb.Sheets("WBXX" & n & "_Featurelist").Copy after:=wbNew.Sheets(1)
        wb.Sheets("WBXX" & n & "_Corelist").Copy after:=wbNew.Sheets(2)
        wbNew.SaveAs Filename:=FPath & "\" & n
        wbNew.Close False
    Next
    Application.ScreenUpdating = True
    
    ' result
    MsgBox num.Count & " worksbooks created in " & FPath, vbInformation
End Sub
  • Related