Requirement:
The user has to collate data in daily spreadsheets. The user has tried using formulas but the data changes daily so formulas do not work. From a master file the user wanted to create a macro that would give a list specific files in user folder (download folder) and select the correct file and then go to a tab in that file with content specific character called "QRSIS", copy this tab return to the master file and paste into master tab by replacing any existing data.
Note: master file is a common/public file, different user will use but the file folder will be the same, its under download folder.
Solution:
Sub Main()
Dim a, e, ws1 As Worksheet, ws2 As Worksheet
Dim tf As Boolean
'Get full file name(s)
a = MSFiles(CurrentUserDownloadsFolder & "QRSIS*")
If Not IsArray(a) Then Exit Sub
'MsgBox Join(a, vbLf)
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Set ws1 = ThisWorkbook.Worksheets(1)
ws1.UsedRange.ClearContents
For Each e In a
Set ws2 = GetObject(e).Worksheets(1)
If Not tf Then
ws2.UsedRange.Copy ws1.[A1]
tf = True
Else
ws2.UsedRange.Copy ws1.Cells(Rows.Count, "A").End(xlUp).Offset(1)
End If
ws2.Parent.Close
Next e
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub
Function MSFiles(initialFilename$, Optional Title$ = "Select File(s)", _
Optional FilterDescription$ = "XLS", _
Optional FilterExtensions$ = "*.xls")
Dim x, i As Long
With Application.FileDialog(msoFileDialogOpen)
.ButtonName = "&Open"
.initialFilename = initialFilename
'Change the contents of the Files of Type list.
'Empty the list by clearing the FileDialogFilters collection.
.Filters.Clear
'Add a filter that includes all files.
'.Filters.Add "All files", "*.*" 'Usually first...
'.Filters.Add "Excel (*.xls)", "*.xls", 1
'.Filters.Add "Excel", "*.xls; *.xlsx; *.xlsm", 1
.Filters.Add FilterDescription, FilterExtensions, 1
.Title = Title
.AllowMultiSelect = True
If .Show = -1 Then
ReDim x(1 To .SelectedItems.Count)
For i = 1 To .SelectedItems.Count
x(i) = .SelectedItems(i)
Next i
MSFiles = x
End If
End With
End Function
'Default location, VBA.Environ$("USERPROFILE") & "\Downloads\"
Function CurrentUserDownloadsFolder() As String
CurrentUserDownloadsFolder = Replace(CreateObject("WScript.Shell").RegRead( _
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\" & _
"{374DE290-123F-4565-9164-39C4925E467B}"), "%USERPROFile%", VBA.Environ("USERPROFILE")) & "\"
End Function
Obtained from the OzGrid Help Forum.
Solution provided by Kenneth Hobson.
See also: Index to Excel VBA Code and Index to Excel Freebies and Lesson 1 - Excel Fundamentals and Index to how to… providing a range of solutions and Index to new resources and reference sheets
See also:
| How to select multiple worksheets and copy to desktop folder |
| How to create VBA to save reports, generated using macros to specific folders |
| How to search in subfolders and word documents |
| How to use VBA script to count files/subfolders using a range from WB for the root folder |
Click here to visit our Free 24/7 Excel/VBA Help Forum where there are thousands of posts you can get information from, or you can join the Forum and post your own questions.