Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8109623
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 6, 20262026-06-06T01:28:48+00:00 2026-06-06T01:28:48+00:00

Is there an alternative to using ActiveWorkbook and ActiveSheet in VBA when working with

  • 0

Is there an alternative to using ActiveWorkbook and ActiveSheet in VBA when working with multiple workbooks (copying from workbooks in a list to a master sheet) ? It is turning out to be more confusing than anything to know which workbook is open when working with multiple functions which need to use different workbooks. Is it a matter of code organization ?

For the moment I think I can manage by storing the activeworkbook’s name at the beginning of every function and restoring it, but it seems like a lot of work and probably a lot of processing time for not much results.

Ideas ?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-06T01:28:50+00:00Added an answer on June 6, 2026 at 1:28 am

    Typically when you work through a list you will use a workbook variable to open, manipulate and then close each book

    My code below is an example of work through and collate a directory of workbooks (similar to your list example). From Collating worksheets from one or more workbooks into a summary file

    Public Sub ConsolidateSheets()
        Dim Wb1 As Workbook
        Dim Wb2 As Workbook
        Dim ws1 As Worksheet
        Dim ws2 As Worksheet
        Dim ws3 As Worksheet
        Dim rng1 As Range
        Dim rng2 As Range
        Dim rng3 As Range
        Dim rngArea As Range
        Dim lrowSpace As Long
        Dim lSht As Long
        Dim lngCalc As Long
        Dim lngRow As Long
        Dim lngCol As Long
        Dim X()
        Dim bProcessFolder As Boolean
        Dim bNewSheet As Boolean
    
        Dim StrPrefix
        Dim strFileName As String
        Dim strFolderName As String
    
        'variant declaration needed for the Shell object to use a default directory
        Dim strDefaultFolder As Variant
    
    
     bProcessFolder = (MsgBox("Process a single folder (Yes)," & vbNewLine & "or single file (No)", vbYesNo, "Application Scope: Folder or single File") = vbYes)
        bNewSheet = (MsgBox("Extract all data to a single sheet (Yes)," & vbNewLine & "or a target file sheet for each source sheet (No)", vbYesNo, "Output Format: Single sheet or sheet by sheet collection") = vbYes)
        If Not bProcessFolder Then
            If Not bNewSheet Then
                MsgBox "There isn't much point creating a exact replica of your source file :)"
                Exit Sub
            End If
        End If
    
        'set default directory here if needed
        strDefaultFolder = "C:\temp"
    
        'If the user is collating all the sheets to a single target sheet then the row spacing
        'to distinguish between different sheets can be set here
        lrowSpace = 1
    
        If bProcessFolder Then
            strFolderName = BrowseForFolder(strDefaultFolder)
            'Look for xls, xlsx, xlsm files
            strFileName = Dir(strFolderName & "\*.xls*")
        Else
            strFileName = Application _
                          .GetOpenFilename("Select file to process (*.xls*), *.xls*")
        End If
    
        Set Wb1 = Workbooks.Add(1)
        Set ws1 = Wb1.Sheets(1)
        If Not bNewSheet Then ws1.Range("A1:B1") = Array("workbook name", "worksheet count")
    
        'Turn off screenupdating, events, alerts and set calculation to manual
        With Application
            .DisplayAlerts = False
            .EnableEvents = False
            .ScreenUpdating = False
            lngCalc = .Calculation
            .Calculation = xlCalculationManual
        End With
    
        'set path outside the loop
        StrPrefix = strFolderName & IIf(bProcessFolder, "\", vbNullString)
    
        Do While Len(strFileName) > 0
            'Provide progress status to user
            Application.StatusBar = Left("Processing " & strFolderName & "\" & strFileName, 255)
            'Open each workbook in the folder of interest
            Set Wb2 = Workbooks.Open(StrPrefix & strFileName)
            If Not bNewSheet Then
                'add summary details to first sheet
                ws1.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = Wb2.Name
                ws1.Cells(Rows.Count, "A").End(xlUp).Offset(0, 1) = Wb2.Sheets.Count
            End If
            For Each ws2 In Wb2.Sheets
                If bNewSheet Then
                    'All data to a single sheet
                    'Skip importing target sheet data if the source sheet is blank
                    Set rng2 = ws2.Cells.Find("*", ws2.[a1], xlValues, , xlByRows, xlPrevious)
    
                    If Not rng2 Is Nothing Then
                        Set rng1 = ws1.Cells.Find("*", ws1.[a1], xlValues, , xlByRows, xlPrevious)
                        'Find the first blank row on the target sheet
                        If Not rng1 Is Nothing Then
                            Set rng3 = ws2.Range(ws2.UsedRange.Cells(1), ws2.Cells(rng2.Row, "A"))
                            'Ensure that the row area in the target sheet won't be exceeded
                            If rng3.Rows.Count + rng1.Row < Rows.Count Then
                                'Copy the data from the used range of each source sheet to the first blank row
                                'of the target sheet, using the starting column address from the source sheet being copied
                                ws2.UsedRange.Copy ws1.Cells(rng1.Row + 1 + lrowSpace, ws2.UsedRange.Cells(1).Column)
                            Else
                                MsgBox "Summary sheet size exceeded. Process stopped on " & vbNewLine & _
                                       "sheet: " & ws2.Name & vbNewLine & "of" & vbNewLine & "workbook: " & Wb2.Name
                                Wb2.Close False
                                Exit Do
                            End If
                            'colour the first of any spacer rows
                            If lrowSpace <> 0 Then ws1.Rows(rng1.Row + 1).Interior.Color = vbGreen
                        Else
                            'target sheet is empty so copy to first row
                            ws2.UsedRange.Copy ws1.Cells(1, ws2.UsedRange.Cells(1).Column)
                        End If
                    End If
                Else
                    'new target sheet for each source sheet
                    ws2.Copy after:=Wb1.Sheets(Wb1.Sheets.Count)
                    'Remove any links in our target sheet
                    With Wb1.Sheets(Wb1.Sheets.Count).Cells
                        .Copy
                        .PasteSpecial xlPasteValues
                    End With
                    On Error Resume Next
                    Wb1.Sheets(Wb1.Sheets.Count).Name = ws2.Name
                    'sheet name already exists in target workbook
                    If Err.Number <> 0 Then
                        'Add a number to the sheet name till a unique name is derived
                        Do
                            lSht = lSht + 1
                            Set ws3 = Wb1.Sheets(ws2.Name & " " & lSht)
                        Loop While Not ws3 Is Nothing
                        lSht = 0
                    End If
                    On Error GoTo 0
                End If
            Next ws2
            'Close the opened workbook
            Wb2.Close False
            'Check whether to force a DO loop exit if processing a single file
            If bProcessFolder = False Then Exit Do
            strFileName = Dir
        Loop
    
        'Remove any links if the user has used a target sheet
        If bNewSheet Then
            With ws1.UsedRange
                .Copy
                .Cells(1).PasteSpecial xlPasteValues
                .Cells(1).Activate
            End With
        Else
            'Format the summary sheet if the user has created separate target sheets
            ws1.Activate
            ws1.Range("A1:B1").Font.Bold = True
            ws1.Columns.AutoFit
        End If
    
        With Application
            .CutCopyMode = False
            .DisplayAlerts = True
            .EnableEvents = True
            .ScreenUpdating = True
            .Calculation = lngCalc
            .StatusBar = vbNullString
        End With
    End Sub
    
    
    Function BrowseForFolder(Optional OpenAt As Variant) As Variant
    'From Ken Puls as used in his vbaexpress.com article
    'http://www.vbaexpress.com/kb/getarticle.php?kb_id=284
    
        Dim ShellApp As Object
        'Create a file browser window at the default folder
        Set ShellApp = CreateObject("Shell.Application"). _
                       BrowseForFolder(0, "Please choose a folder", 0, OpenAt)
    
        'Set the folder to that selected.  (On error in case cancelled)
        On Error Resume Next
        BrowseForFolder = ShellApp.self.Path
        On Error GoTo 0
    
        'Destroy the Shell Application
        Set ShellApp = Nothing
    
        'Check for invalid or non-entries and send to the Invalid error
        'handler if found
        'Valid selections can begin L: (where L is a letter) or
        '\\ (as in \\servername\sharename.  All others are invalid
        Select Case Mid(BrowseForFolder, 2, 1)
        Case Is = ":"
            If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid
        Case Is = "\"
            If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid
        Case Else
            GoTo Invalid
        End Select
    
        Exit Function
    
    Invalid:
        'If it was determined that the selection was invalid, set to False
        BrowseForFolder = False
    End Function
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Is there any alternative from using a loop in my code to execute a
Is there a better alternative to using Arrays.asList as a List bulk initializer? Of
From my understanding using .hide in jquery uses (css) {visibility:hidden;} is there an alternative
When communicating concurrency conflicts to your application layer, is there an alternative to using
Is there a simple alternative to using json_decode function in php versions prior to
Is there an alternative to using a jquery plugin to resize videos for mobile
I was wondering if there is an alternative to using the Javascript: document.documentElement.outerHTML that
Is there an alternative to using .Contains() to select objects in Entity Framework that
Is there any alternative for using a frame. I'm just a beginner and I
Is there a validated alternative to using role for XHTML 1.0 strict? For example,

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.