vbaexcelexcel-2007xlm

Copy data from closed workbook based on variable user defined path


I have exhausted my search capabilities looking for a solution to this. Here is an outline of what I would like to do:

I've come across some references to ADO, but I am really not familiar with that yet.

Edit: I have found a code to import data from a closed file. I will need to tweak the range to return the variable results.

    Private Function GetValue(path, file, sheet, ref)

    path = "C:\Users\crathbun\Desktop"
    file = "test.xlsx"
    sheet = "Sheet1"
    ref = "A1:R30"

     '   Retrieves a value from a closed workbook
    Dim arg As String

     '   Make sure the file exists
    If Right(path, 1) <> "\" Then path = path & "\"
    If Dir(path & file) = "" Then
        GetValue = "File Not Found"
        Exit Function
    End If

     '   Create the argument
    arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
    Range(ref).Range("A1").Address(, , xlR1C1)

     '   Execute an XLM macro
    GetValue = ExecuteExcel4Macro(arg)
End Function

Sub TestGetValue()

    path = "C:\Users\crathbun\Desktop"
    file = "test"
    sheet = "Sheet1"

    Application.ScreenUpdating = False
    For r = 1 To 30
        For C = 1 To 18
            a = Cells(r, C).Address
            Cells(r, C) = GetValue(path, file, sheet, a)
        Next C
    Next r

    Application.ScreenUpdating = True
End Sub

Now, I need a command button or userform that will immediately prompt the user to define a file path, and import the data from that file.


Solution

  • I don't mind if the files are opened during process. I just didn't want the user to have to open the files individually. I just need them to be able to select or navigate to the desired files

    Here is a basic code. This code asks user to select two files and then imports the relevant sheet into the current workbook. I have given two options. Take your pick :)

    TRIED AND TESTED

    OPTION 1 (Import the Sheets directly instead of copying into sheet1 and 2)

    Option Explicit
    
    Sub Sample()
        Dim wb1 As Workbook, wb2 As Workbook
        Dim Ret1, Ret2
    
        Set wb1 = ActiveWorkbook
    
        '~~> Get the first File
        Ret1 = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", _
        , "Please select first file")
        If Ret1 = False Then Exit Sub
    
        '~~> Get the 2nd File
        Ret2 = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", _
        , "Please select Second file")
        If Ret2 = False Then Exit Sub
    
        Set wb2 = Workbooks.Open(Ret1)
        wb2.Sheets(1).Copy Before:=wb1.Sheets(1)
        ActiveSheet.Name = "Blah Blah 1"
        wb2.Close SaveChanges:=False
    
        Set wb2 = Workbooks.Open(Ret2)
        wb2.Sheets(1).Copy After:=wb1.Sheets(1)
        ActiveSheet.Name = "Blah Blah 2"
        wb2.Close SaveChanges:=False
    
        Set wb2 = Nothing
        Set wb1 = Nothing
    End Sub
    

    OPTION 2 (Import the Sheets contents into sheet1 and 2)

    Option Explicit
    
    Sub Sample()
        Dim wb1 As Workbook, wb2 As Workbook
        Dim Ret1, Ret2
    
        Set wb1 = ActiveWorkbook
    
        '~~> Get the first File
        Ret1 = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", _
        , "Please select first file")
        If Ret1 = False Then Exit Sub
    
        '~~> Get the 2nd File
        Ret2 = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", _
        , "Please select Second file")
        If Ret2 = False Then Exit Sub
    
        Set wb2 = Workbooks.Open(Ret1)
        wb2.Sheets(1).Cells.Copy wb1.Sheets(1).Cells
        wb2.Close SaveChanges:=False
    
        Set wb2 = Workbooks.Open(Ret2)
        wb2.Sheets(1).Cells.Copy wb1.Sheets(2).Cells
        wb2.Close SaveChanges:=False
    
        Set wb2 = Nothing
        Set wb1 = Nothing
    End Sub