简体   繁体   中英

VBA Copy Error, Import Multiple Worksheets into Central Workbook Database

I'm attempting to create a centralized database that imports the same tab (named "Import") from multiple workbooks into a tab on a different workbook. I am new to VBA, and modifying others' code from here VBA Import multiple sheets into Workbook and here https://danwagner.co/how-to-combine-data-from-multiple-sheets-into-a-single-sheet/ .

I'm running into runtime error 91 when the code is attempting to copy from the "Import" tab on the source worksheet to the "Data" tab on the destination worksheet (see following code):

rngSrcCountry.Copy Destination:=rngDstDatabase

Any suggestions as to how I can improve my code to effectively copy the "Import" tab from multiple workbooks into the "Data" tab on a separate workbook? Thanks in advance for your help!

Sub InsertDatabase()

Dim FileNames As Variant 'Group of files to be looped through
Dim FileName As Variant 'Country of focus (file open)
Dim ActiveCountryWB As Workbook 'Active workbook of country
Dim wksSrcCountry As Worksheet 'Import worksheet in country
Dim wksDstDatabase As Worksheet 'Data worksheet in database
Dim rngSrcCountry As Range 'Range of data in import worksheet
Dim rngDstDatabase As Range 'Range of data in data worksheet in database
Dim lngSrcLastRow As Long
Dim lngDstLastRow As Long

'Set destination reference
Set wksDstDatabase = ThisWorkbook.Worksheets("Data")

MsgBox "In the following browser, please choose the Excel file(s) you want     
to copy data from"
FileNames = Application.GetOpenFilename _
(Title:="Please choose the files you want to copy data FROM", _
FileFilter:="All Files (*.*),*.*", _
MultiSelect:=True)

If VarType(CountriesGroup) = vbBoolean Then
    If Not CountriesGroup Then Exit Sub
End If

'Set initial destination range
Set rngDstDatabase = wksDstDatabase.Cells(lngDstLastRow + 1, 1)

'Loop over all files selected by user, and import the desired "Import" sheet
For Each FileName In FileNames

'Set country workbook references
Set ActiveCountryWB = Workbooks.Open(FileName)
Set wksSrcCountry = ActiveCountryWB.Sheets("Import")

'Identify last occupied row on import sheet
lngSrcLastRow = LastOccupiedRowNum(wksSrcCountry)

'Store source data
With wksSrcCountry
    Set rngSrcCountry = .Range(.Cells(1, 1), .Cells(lngSrcLastRow, 20))
    rngSrcCountry.Copy Destination:=rngDstDatabase
End With

'Redefine destination range now that new data has been added
lngDstLastRow = LastOccupiedRowNum(wksDstDatabase)
Set rngDstDatabase = wksDstDatabase.Cells(lngDstLawRow + 1, 3)

Next FileName

End Sub

Public Function LastOccupiedRowNum(Sheet As Worksheet) As Long
Dim lng As Long

If Application.WorksheetFunction.CountA(Sheet.Cells) <> 0 Then
    With Sheet

       lng = .Cells.Find(What:="*", _
                          After:=.Range("A1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlValues, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
    End With
Else
    lng = 1
End If
LastOccupiedRowNum = lng
End Function

Your code is using variables before they are defined. The below line needs to be above any other code that is trying to reference "LngDstLastRow", otherwise, it wont know what lngDstLastRow (it is defaulting to nothing)

lngDstLastRow = LastOccupiedRowNum(wksDstDatabase)

Specifically, the above line needs to be placed above the following line:

Set rngDstDatabase = wksDstDatabase.Cells(lngDstLastRow + 1, 1)

Otherwise, you are feeding a undefined variable into another variable, which means your code would translate as follows: Set rngDstDatabase = wksDstDatabase.Cells( nothing + 1,1).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM