VBA store cell reference in an array

gmittar

Board Regular
Joined
Sep 16, 2013
Messages
62
Hello,

I have a macro that one of you kind people helped me create. The Macro is used to compile a specific cell value in all files in a folder, and list the values on a new sheet. It works great and I use it all the time.

The problem is that all of the references (folder path, sheet target, cell target) are listed as part of the macro. I would like to externalize the references so that they can be changed without touching the macro. The folder path is pretty straightforward and I've already accomplished it. However, I'm having trouble pulling the sheet and cell reference out. I believe the issue is that the bit of code that I'm trying to replace executes when one of the target files is open and active, instead of the home file, so the external reference is referring to the target file instead of where the reference is listed in the home file.

I'm hoping to store the external reference earlier in the macro, before it starts opening target files, but have been unable to get it to work. Below is the code as I have it now (not working), the areas in question are in red.

Thank you!

Rich (BB code):
 'Copies the selected range from all workbooks in a specified folder into a new worksheet.  To Import YTD STR scoresSub Import_STR_YTD()
    Dim MyPath As String, FilesInPath As String
    Dim MyFiles() As String
    Dim SourceRcount As Long, FNum As Long
    Dim mybook As Workbook, BaseWks As Worksheet
    Dim sourceRange As Range, destrange As Range
    Dim rnum As Long, CalcMode As Long
    Dim celltoimport As String


    ' Change this to the path\folder location of your files.
    MyPath = Range("n3")
    
    celltoimport = Range("n4")


    ' Add a slash at the end of the path if needed.
    If Right(MyPath, 1) <> "" Then
        MyPath = MyPath & ""
    End If


    ' If there are no Excel files in the folder, exit.
    FilesInPath = Dir(MyPath & "*.xl*")
    If FilesInPath = "" Then
        MsgBox "No files found"
        Exit Sub
    End If


    ' Fill the myFiles array with the list of Excel files
    ' in the search folder.
    FNum = 0
    Do While FilesInPath <> ""
        FNum = FNum + 1
        ReDim Preserve MyFiles(1 To FNum)
        MyFiles(FNum) = FilesInPath
        FilesInPath = Dir()
    Loop


    ' Set various application properties.
    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
        .DisplayAlerts = False
        .AskToUpdateLinks = False
        
        
    End With


    ' Add a new workbook with one sheet.
    Set BaseWks = Worksheets("YTD RevPAR")
    rnum = 2
    
    
    
    ' clears old date to ensure that only new data remains after import.
    With BaseWks
        Range("b2").Select
        Range(Selection, Selection.End(xlDown)).Select
            Selection.ClearContents
        Range("c2").Select
        Range(Selection, Selection.End(xlDown)).Select
            Selection.ClearContents
    
    End With
    


    ' Loop through all files in the myFiles array.
    If FNum > 0 Then
        For FNum = LBound(MyFiles) To UBound(MyFiles)
            Set mybook = Nothing
            On Error Resume Next
            Set mybook = Workbooks.Open(MyPath & MyFiles(FNum))
            On Error GoTo 0


            If Not mybook Is Nothing Then
                On Error Resume Next


                ' sheet to copy from in each file - change to the sheet number being used.
                With mybook.Worksheets("Glance")
                ' Range to copy from each file
                    Set sourceRange = Range(celltoimport)
                End With


                If Err.Number > 0 Then
                    Err.Clear
                    Set sourceRange = Nothing
                Else
                    ' If source range uses all columns then
                    ' skip this file.
                    If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
                        Set sourceRange = Nothing
                    End If
                End If
                On Error GoTo 0


                If Not sourceRange Is Nothing Then


                    SourceRcount = sourceRange.Rows.Count


                    If rnum + SourceRcount >= BaseWks.Rows.Count Then
                        MsgBox "There are not enough rows in the target worksheet."
                        BaseWks.Columns.AutoFit
                        mybook.Close savechanges:=False
                        GoTo ExitTheSub
                    Else


                        ' Copy the file name in column A.
                        With sourceRange
                            BaseWks.Cells(rnum, "B"). _
                                    Resize(.Rows.Count).Value = MyFiles(FNum)
                        End With


                        ' Set the destination range.
                        Set destrange = BaseWks.Range("C" & rnum)


                        ' Copy the values from the source range
                        ' to the destination range.
                        With sourceRange
                            Set destrange = destrange. _
                                            Resize(.Rows.Count, .Columns.Count)
                        End With
                        destrange.Value = sourceRange.Value


                        rnum = rnum + SourceRcount
                    End If
                End If
                mybook.Close savechanges:=False
            End If


        Next FNum
        BaseWks.Columns.AutoFit
    End If


ExitTheSub:
    ' Restore the application properties.
    With Application
        .ScreenUpdating = True
        .Calculation = CalcMode
        .Calculation = xlCalculationAutomatic
        .EnableEvents = True
        .DisplayAlerts = True
        .AskToUpdateLinks = True
    End With
End Sub
 

Excel Facts

How can you automate Excel?
Press Alt+F11 from Windows Excel to open the Visual Basic for Applications (VBA) editor.
Hi,

From looking at your code, there is no apparent mistake ...

You need to make sure your cell N4 contains a valid string representing the address such as C2 ...

Hope this will help
 
Upvote 0
HI James,

Thanks for looking over the code. It does run without errors, but returns blanks instead of values. I've verified that the cell it refers to has the correct value. Is there a way that I need to represent the value in the cell reference? Right now it just says Q13, referring to cell Q13.

Thanks.
 
Upvote 0
You're missing a . from the start of Range
Code:
With mybook.Worksheets("Glance")
' Range to copy from each file
    Set SourceRange = [COLOR=#ff0000].[/COLOR]Range(celltoimport)
End With
 
Upvote 0
Glad we could help & thanks for the feedback.
 
Upvote 0

Forum statistics

Threads
1,223,231
Messages
6,170,884
Members
452,364
Latest member
springate

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top