====== Microsoft Excel - Macros - Files - Read File ====== Dim fileToOpen As Variant Dim fileToOpen_name As String Dim FileParts() As String Dim lastrow_InputFile As Long Dim count_InputFile As Double Dim count_Test1 As Double Dim lastrow_Test1 As Long ' Ask user for a file to load. fileToOpen = Application.GetOpenFilename("Excel files (*.xls; *.xlsx; *.csv),*.xls; *.xlsx; *.csv", , "Select file") If fileToOpen = False Then MsgBox "No file selected. No data copied across to the Test sheet." Exit Sub End If FileParts() = Split(fileToOpen, Application.PathSeparator) fileToOpen_name = FileParts(UBound(FileParts)) ' Update StatusBar. Application.StatusBar = "Importing file..." & fileToOpen_name ' Start of copying columns across. With Workbooks.Open(fileToOpen) With .Sheets(1) ' Control to check that the file is in the usual format. If .Range("A2") Like "???????" Then Else If ctrl_close_erroneous_files = True Then ' Close the file. Application.DisplayAlerts = False Workbooks(fileToOpen_name).Close Application.DisplayAlerts = True End If MsgBox "The file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across." Exit Sub End If ' Control to check that the file is in the usual format. If .Range("I2") Like "????" Then Else If ctrl_close_erroneous_files = True Then ' Close the file. Application.DisplayAlerts = False Workbooks(fileToOpen_name).Close Application.DisplayAlerts = True End If MsgBox "The file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across" Exit Sub End If ' Control to check that the file is in the usual format. If WorksheetFunction.CountA(.Range("A1:X1")) = 24 Then Else If ctrl_close_erroneous_files = True Then ' Close the file. Application.DisplayAlerts = False Workbooks(fileToOpen_name).Close Application.DisplayAlerts = True End If MsgBox "The file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across" Exit Sub End If ' Determine how many rows in the input file. lastrow_InputFile = .Cells(Rows.Count, 1).End(xlUp).Row ' Copy all columns from file into master sheet where column names match. For Each my_from_column In .Range("A1:AD1") ' Range is all columns in input file. For Each my_to_column In Workbooks(wb_name).Sheets("Test1").Range("A1:AH1") ' AH is last column containing data from input file. If my_from_column = my_to_column Then .Range(Cells(2, my_from_column.Column), Cells(lastrow_InputFile + 1, my_from_column.Column).End(xlUp)).Copy Workbooks(wb_name).Sheets("Test1").Cells(2, my_to_column.Column) Next my_to_column Next my_from_column ' Counts the number of cells from the input file that should have been copied across. count_InputFile = WorksheetFunction.CountA(.Range("A2:V" & lastrow_InputFile)) End With ' Close the file. Application.DisplayAlerts = False .Close Application.DisplayAlerts = True End With ' Counts the number of cells in the Test1 sheet that have been copied across. With Workbooks(wb_name) ' Activate the workbook. .Activate With .Sheets("Test1") ' Activate the sheet. .Activate ' Get how many rows of data have been loaded into the sheet. lastrow_Test1 = .Cells(Rows.Count, 4).End(xlUp).Row ' Prevent line 2 being deleted - as this contains the formulae which need coping down later. If lastrow_Test1 < 3 Then lastrow_Test1 = 3 End If ' Count how much data has been loaded into the Test1 sheet. count_Test1 = WorksheetFunction.CountA( _ .Range("D2:D" & lastrow_Test1), _ .Range("F2:I" & lastrow_Test1), _ .Range("O2:O" & lastrow_Test1), _ .Range("S2:AH" & lastrow_Test1)) ' Select A1. ScrollTo ActiveSheet.name, "A1" End With End With ' Control to ensure that the number of cells copied across matches those in the originating file. If count_Test1 <> count_InputFile Then Message "The number of cells copied from the input file does not equal the number of cells copied to the Sheet1 worksheet. Please manually copy them across." Exit Sub End If ' Clear all objects. Set my_from_column = Nothing Set my_to_column = Nothing