VBA code to Copy File Based on Keywords in File Name

Parth13

Board Regular
Joined
Dec 24, 2008
Messages
65
Hi,
I am trying to write a code which will copy files from one directory to other based on some keywords in File Name.
The keywords are specified in a range in the spreadsheet. The code should pick each keyword, search for files containing that keyword and copy all the files with that keyword in the name to the directory specified. If the keyword is not found, it highlights the cell in the range as red.
Here's the Code:
Code:
Sub CopyFiles()
Dim srcFOLDER As String
Dim tgtFOLDER As String
Dim fRNG      As Range
Dim fName     As Range
Dim BAD       As Boolean
srcFOLDER = ActiveSheet.Cells(4, 3)
tgtFOLDER = ActiveSheet.Cells(5, 3)   
 
Set fRNG = ActiveSheet.Range("E4:E2000").SpecialCells(xlConstants)
For Each fName In fRNG
If InStr(1, Dir(srcFOLDER), fName, vbTextCompare) Then 'Checking whether the file contain keywords in column
    
FileCopy srcFOLDER & "*" & fName & "*" & .Text, tgtFOLDER & "*" & fName & "*" & .Text 
 
Else
        fName.Interior.ColorIndex = 3
        BAD = True
    End If
Next fName
    
If BAD Then MsgBox "Some files were not found. These were highlighted for your reference."
End Sub

It works fine till it reaches copying section where I am getting error "Bad file name" or "Invalid Qualifier". If anyone could help correcting this one. Thanks.
 
Jerry, yes, it does pull out the correct pdf but can also select others if the number fits.

The format of the pdf' can be as follows:
12345.pdf
12345-12348.pdf
12345(1).pdf
12345_001.pdf

In some cases there may be a space before and or after the "-" and before the "("

With n being the whole number from the search list, would the following criteria work?
n.
n-
-n.
n(
n_
If not found with these, look through files with a "-" (12345-12348.pdf)

If n > n- and <n. found

I believe this should cover all eventualities

Hope I'm on the right lines here Jerry

Regards

A little correction it meant to say.....

If n > n- AND n < -n.

Thanks




</n.>
 
Upvote 0

Excel Facts

Do you hate GETPIVOTDATA?
Prevent GETPIVOTDATA. Select inside a PivotTable. In the Analyze tab of the ribbon, open the dropown next to Options and turn it off
Rob, Sorry that I wasn't able to get to this sooner.

Just a couple more clarifications that will help in optimizing the process...

1. Will the numbers to be looked up listed in your worksheet be simply numbers like 12345 (not file names 12345.pdf or ranges of numbers 12345-12456)?

2. Could there be more than one matching file that needs to get copied for a single lookup number in the worksheet?
(Lookup 12345 results in copying four files: 12345.pdf, 12345-12348.pdf, 12345(1).pdf, and 12345_001.pdf)

3. Is there a need to denote lookup numbers that don't have file matches (as the previously suggested code highlighted those cells)?

4. What are the order of magnitude of the counts of .pdf files in the source folder and counts of the lookup numbers? (10's, 100's, 1000's or 10,000's of files/lookups?)
 
Upvote 0
Jerry,
The lookups will only be numbers
There could be multiple PDFs that need to be found ie 12345(1)&12345(2) etc
It would be a benefit to highlight the "not found" numbers
Currently there around 15k PDFs in the folder which is added to daily

kind regards
Rob
 
Upvote 0
Rob, Here's some code for your testing.

The code assumes you've added a reference to the MS Scripting Runtime Library to your VBA Project .
To do that: in the VBA Editor: Tools > References... > scroll down and check the reference "Microsoft Scripting Runtime " > OK

Code:
Sub CopyFilesWithNumberedIDs()
'--purpose is to read a list of ID numbers in worksheet then
'  for each number find and copy all files in a specified folder
'  that either:
'    contain that number in the filename or
'    have that number fall within a span of numbers specified
'     by the filename
'  any ID numbers that don't have corresponding files will be highlighted

'--requires reference to Microsoft Scripting Runtime library
 
 Dim bMatchFound As Boolean, bSomeNotFound As Boolean
 Dim dctFilesToCopy As Scripting.Dictionary
 Dim dID As Double
 Dim lNdx As Long, lLastRow As Long
 Dim rIDs As Range, rCell As Range
 Dim sSrcFolder As String, sTgtFolder As String, sFileName As String
 Dim sFileNamePattern As String, sParsedNumber As String, sID As String
 Dim vFileSpecMatches As Variant, vFilesNamesToCopy As Variant
 Dim vSingleIDs As Variant, vSpansOfIDs As Variant, vKey As Variant
 
 With ActiveSheet 'read inputs-modify to match actual range addresses
   sSrcFolder = .Range("A2").Value ' c:\test\source\
   sTgtFolder = .Range("A3").Value ' c:\test\matches\
   sFileNamePattern = .Range("A4").Value ' *.pdf"
   
   '--read list of numbered ids
   lLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
   If lLastRow < 2 Then
      MsgBox "No ID Numbers found."
      GoTo ExitProc
   End If
   
   Set rIDs = .Range("B2:B" & lLastRow)
   
   '--get list of all files in source folder meeting pattern criterion
   vFileSpecMatches = vGetFileNames(sFileSpec:=sSrcFolder & sFileNamePattern)
   If IsNull(vFileSpecMatches) Then
      MsgBox "No matches were found for: " & vbCr _
         & sSrcFolder & sFileNamePattern
      GoTo ExitProc
   End If
 End With
    
 Set dctFilesToCopy = New Scripting.Dictionary
    
 '--parse filenames to resize and fill two arrays ByRef
   '  vSingleIDs: single IDs associated with a file
   '  vSpansOfIDs: spans of ID numbers associated with a file
 ' first dim of arrays is filename, second dim is ID Code
 ReDim vSingleIDs(1 To 2, 1 To 1)
 ReDim vSpansOfIDs(1 To 2, 1 To 1)
 
 Call ParseIDs(vFileNames:=vFileSpecMatches, _
   vSingleIDs:=vSingleIDs, vSpansOfIDs:=vSpansOfIDs)
 
 For Each rCell In rIDs
   bMatchFound = False 'reset

   sID = rCell.Value
   If Not IsNumeric(sID) Then
      MsgBox sID & " is an invalid ID number", vbCritical, _
         "Process stopped"
      GoTo ExitProc
   End If
   dID = CDbl(sID)
   
   '--check for exact matches in single ID list
   If Not IsNull(vSingleIDs) Then
      For lNdx = 1 To UBound(vSingleIDs, 2)
         If dID = vSingleIDs(2, lNdx) Then
            '--store matched filename in list to be copied
            bMatchFound = True
            sFileName = CStr(vSingleIDs(1, lNdx))
            If Not dctFilesToCopy.Exists(sFileName) Then
               dctFilesToCopy.Add sFileName, 1
            End If
         End If
      Next lNdx
   End If
   
   '--check for matches within span in vSpansOfIDs list
   If Not IsNull(vSpansOfIDs) Then
      For lNdx = 1 To UBound(vSpansOfIDs, 2)
         If dID >= vSpansOfIDs(2, lNdx) And _
            dID <= vSpansOfIDs(3, lNdx) Then
            '--store matched filename in list to be copied
            bMatchFound = True
            sFileName = CStr(vSpansOfIDs(1, lNdx))
            If Not dctFilesToCopy.Exists(sFileName) Then
               dctFilesToCopy.Add sFileName, 1
            End If
         End If
      Next lNdx
   End If
   If Not bMatchFound Then
      rCell.Interior.Color = vbRed
      bSomeNotFound = True
   End If
 Next rCell
 
 '--copy all files stored in dictionary
 For Each vKey In dctFilesToCopy.Keys
   sFileName = CStr(vKey)
   FileCopy sSrcFolder & sFileName, sTgtFolder & sFileName
 Next vKey
 
 If bSomeNotFound Then MsgBox _
   "Some IDs did not have matching files found. " & _
    vbCr & "These were highlighted for your reference."

ExitProc:
 Set dctFilesToCopy = Nothing
End Sub

Private Sub ParseIDs(ByVal vFileNames As Variant, ByRef vSingleIDs As Variant, _
   ByRef vSpansOfIDs As Variant)
   '--takes array of filenames as input
   '--passes back ByRef to calling procedure two 2D arrays
   '  with pairs of filename and ID_Code
   '--ID_Code is either single ID number or span of ID numbers
 
'The format of the pdfs can be any of these:
 ' 12345.pdf
 ' 12345-12348.pdf
 ' 12345(1).pdf
 ' 12345_001.pdf
 
 Dim lNdxSource As Long, lNdxSingle As Long, lNdxSpan As Long
 Dim dMin As Double, dMax As Double, dID As Double
 Dim sFileName As String, sID_Code As String
 Dim vReturn As Variant
 
 ReDim vSingleIDs(1 To 2, 1 To UBound(vFileNames))
 ReDim vSpansOfIDs(1 To 3, 1 To UBound(vFileNames))
 
 For lNdxSource = 1 To UBound(vFileNames)
   sFileName = vFileNames(lNdxSource)
   If InStr(1, sFileName, "-") = 0 Then
      '--ID Code is single ID number
      dID = dGetVal(sFileName)
      If dID >= 0 Then
         lNdxSingle = 1 + lNdxSingle
         vSingleIDs(1, lNdxSingle) = sFileName
         vSingleIDs(2, lNdxSingle) = dID
      End If
   Else
      '--ID_Code is span of numbers
      dMin = dGetVal(sFileName)
      dMax = dGetVal(Mid(sFileName, InStr(1, sFileName, "-") + 1))
      If dMin >= 0 And dMax >= dMin Then
         lNdxSpan = 1 + lNdxSpan
         vSpansOfIDs(1, lNdxSpan) = sFileName
         vSpansOfIDs(2, lNdxSpan) = dMin
         vSpansOfIDs(3, lNdxSpan) = dMax
      End If
   End If
 Next lNdxSource
 
 '--resize arrays
 If lNdxSingle Then
   ReDim Preserve vSingleIDs(1 To 2, 1 To lNdxSingle)
 Else
   vSingleIDs = Null
 End If
 If lNdxSpan Then
   ReDim Preserve vSpansOfIDs(1 To 3, 1 To lNdxSpan)
 Else
   vSpansOfIDs = Null
 End If

End Sub

Private Function vGetFileNames(ByVal sFileSpec As String) As Variant
'--returns array of filenames matching sFileSpec pattern
'  if no matches are found, returns Null
 
 Dim lCount As Long, lUbound As Long
 Dim sFileName As String
 Dim vReturn As Variant
 
 '--used to limit the frequency of redim preserve calls
 Const lREDIM_FREQ = 1000
 
 ReDim vReturn(1 To lREDIM_FREQ)
 
 sFileName = Dir(sFileSpec)
 If Len(sFileName) = 0 Then
   vReturn = Null
 Else
   While sFileName <> ""
     lCount = lCount + 1
     
     '--resize array if needed
     If (lCount Mod lREDIM_FREQ) = 0 Then
        ReDim Preserve vReturn(1 To UBound(vReturn) + lREDIM_FREQ)
     End If
     
     '--add to array
     vReturn(lCount) = sFileName
     
     sFileName = Dir()
   Wend
   ReDim Preserve vReturn(1 To lCount)
 End If
 
 vGetFileNames = vReturn
End Function

Private Function dGetVal(sInput As String) As Double
'--evaluates each character of sInput from left to right
'  until character other than 0-9 is found.
'  returns integer value of those numeric characters found
'  or -1 if the first character is not 0-9 or
'  resulting number exceeds 15 digits

   Dim lPos As Long
   Dim sHead As String, sChar As String
   
   For lPos = 1 To Len(sInput)
      sChar = Mid(sInput, lPos, 1)
      If sChar Like "[0-9]" Then
         sHead = sHead & sChar
      Else
         Exit For
      End If
   Next
   
   If Len(sHead) = 0 Or Len(sHead) > 15 Then
      dGetVal = -1
   Else
      dGetVal = CDbl(sHead)
   End If
End Function

The process could be further optimized by sorting the lists - but try this first to see if it runs fast enough without that.
 
Upvote 0
Many thanks Jerry
Unfortunately I'm not getting any results, I set the Microsoft Scripting Runtime

Please confirm that I require the value (*pdf) or (*pdf")? in cell A4 and the list of files numbers in Column B Starting in B2 (I've tried various combos of .pdf etc in A4)

I get a msgbox with
No matches were found for:
xxxxxxxxxxxxxx\*pdf" (xxx being my folder name address)


Kind regards
 
Upvote 0
Rob, I'm not sure why that isn't working for you. Below is a screenshot of my example worksheet.
I intended *.pdf to be entered in A4, however *pdf should have worked for you as well.
Perhaps the filepath you have in A2 is missing a valid Drive reference or some other typo in the path?


Excel 2013
AB
1ParametersID Numbers
2c:\test\source\12340
3c:\test\matches\12342
4*.pdf12344
512346
612348
7
Sheet1


In thinking more about the algorithm in Post #15, the matching is more brute force than I'd like it to be. For larger numbers of files or ID Numbers, it's not very efficient. I'm working on a better version that I hope to post shortly.

It will use the same code to get a list of .pdf files, so let's try to get that working on your system for the code already posted.
 
Upvote 0
Rob, Here's another version of the code that should be more efficient.

Replace all the previous code with this.

Code:
Sub CopyFilesWithNumberedIDs()
'--purpose is to read a list of ID numbers in worksheet then
'  for each number find and copy all files in a specified folder
'  that either:
'    contain that number in the filename or
'    have that number fall within a span of numbers specified
'     by the filename
'  any ID numbers that don't have corresponding files will be highlighted

'--requires reference to Microsoft Scripting Runtime library
 
 Dim bSomeNotFound As Boolean
 Dim dctFilesToCopy As Scripting.Dictionary
 Dim dID As Double
 Dim lNdx As Long, lLastRow As Long
 Dim rIDs As Range, rCell As Range, rSourceData As Range
 Dim sSrcFolder As String, sTgtFolder As String, sFilename As String
 Dim sFileNamePattern As String
 Dim vFileSpecMatches As Variant, vKey As Variant
 Dim vID_Matches As Variant, vSourceData As Variant
 
 Application.ScreenUpdating = False
 On Error GoTo ErrProc
 
 With ActiveSheet 'read inputs-modify to match actual range addresses
   sSrcFolder = .Range("A2").Value ' c:\test\source\
   sTgtFolder = .Range("A3").Value ' c:\test\matches\
   sFileNamePattern = .Range("A4").Value ' *.pdf"
   
   '--read list of numbered ids
   lLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
   If lLastRow < 2 Then
      MsgBox "No ID Numbers found."
      GoTo ExitProc
   End If
   
   Set rIDs = .Range("B2:B" & lLastRow)
 End With
     
 '--validate that all IDs are numeric with no blanks
 With Application
   If .CountA(rIDs) <> .Count(rIDs) Then
      MsgBox "ID list contains invalid data (blanks or non-integer values)"
      GoTo ExitProc
   End If
 End With
   
 '--get list of all files in source folder meeting pattern criterion
 vFileSpecMatches = vGetFileNames(sFileSpec:=sSrcFolder & sFileNamePattern)
 If IsArray(vFileSpecMatches) = False Then
   MsgBox "No matches were found for: " & vbCr _
      & sSrcFolder & sFileNamePattern
   GoTo ExitProc
 End If
      
 '--retuns array with each file's: FileName, MinID, MaxID
 vSourceData = vParseIDs(vFileNames:=vFileSpecMatches)
 If IsArray(vSourceData) = False Then
   MsgBox "No filenames in the source folder have valid numeric IDs."
   GoTo ExitProc
 End If
 
 '--populate temp worksheet with data to be filtered for matches
 Set rSourceData = rSetupAdvFilter(vSourceData:=vSourceData)
 
 '--store filenames to copy in dictionary to avoid redundant copying
 Set dctFilesToCopy = New Scripting.Dictionary
 
 rIDs.Interior.Color = xlNone '--reset existing colors
 For Each rCell In rIDs
   dID = CDbl(rCell.Value)
   '--returns array of filenames that match IDs
   vID_Matches = vGetMatches(dID:=dID, rSource:=rSourceData)
   
   If IsArray(vID_Matches) = False Then
      rCell.Interior.Color = vbRed
      bSomeNotFound = True
   Else
      For lNdx = LBound(vID_Matches) To UBound(vID_Matches)
         '--store matched filename in list to be copied
         sFilename = vID_Matches(lNdx, 1)
         If Not dctFilesToCopy.Exists(sFilename) Then
            dctFilesToCopy.Add sFilename, 1
         End If
      Next lNdx
   End If
 Next rCell
 DeleteTempWorksheet
 
 '--copy all files stored in dictionary
 For Each vKey In dctFilesToCopy.Keys
   sFilename = CStr(vKey)
   FileCopy sSrcFolder & sFilename, sTgtFolder & sFilename
 Next vKey
 
 Application.ScreenUpdating = True
 If bSomeNotFound Then MsgBox _
   "Some IDs did not have matching files found. " & _
    vbCr & "These were highlighted for your reference."

ExitProc:
 Set dctFilesToCopy = Nothing
 DeleteTempWorksheet
 Application.ScreenUpdating = True
 Exit Sub
 
ErrProc:
 MsgBox Err.Number & " - " & Err.Description
 Resume ExitProc
End Sub

Private Sub DeleteTempWorksheet()
'--deletes sheet "TempForAdvFilter" if it exists

 On Error Resume Next
 Application.DisplayAlerts = False
 ThisWorkbook.Sheets("TempForAdvFilter").Delete
 Application.DisplayAlerts = True
End Sub

Private Function vGetFileNames(ByVal sFileSpec As String) As Variant
'--returns array of filenames matching sFileSpec pattern
'  if no matches are found, returns Null
 
 Dim lCount As Long, lUbound As Long
 Dim sFilename As String
 Dim vReturn As Variant
 
 '--used to limit the frequency of redim preserve calls
 Const lREDIM_FREQ = 1000
 
 ReDim vReturn(1 To lREDIM_FREQ)
 
 sFilename = Dir(sFileSpec)
 If Len(sFilename) = 0 Then
   vReturn = False
 Else
   While sFilename <> ""
     lCount = lCount + 1
     
     '--resize array if needed
     If (lCount Mod lREDIM_FREQ) = 0 Then
        ReDim Preserve vReturn(1 To UBound(vReturn) + lREDIM_FREQ)
     End If
     
     '--add to array
     vReturn(lCount) = sFilename
     
     sFilename = Dir()
   Wend
   ReDim Preserve vReturn(1 To lCount)
 End If
 
 vGetFileNames = vReturn
End Function

Private Function vGetMatches(ByVal dID As Double, _
   ByVal rSource As Range) As Variant
 '--uses advanced filter to find filenames for which
 '  the input ID number is within Min and Max IDs
 '  returns array of matching filenames found
 '  returns False if no matches are found
    
 Dim lLastRow  As Long
 Dim rCriteria As Range
 Dim vReturn As Variant
 
 With Sheets("TempForAdvFilter")
   Set rCriteria = .Range("G1:G2")
   .Range("F1").Value = dID
   .Range("E2:E" & rSource.Rows.Count).ClearContents
   Application.DisplayAlerts = False
   
   rSource.AdvancedFilter Action:=xlFilterCopy, _
      CriteriaRange:=rCriteria, CopyToRange:=.Range("E1:E2"), _
      Unique:=False
   Application.DisplayAlerts = True
   lLastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
   
   Select Case lLastRow
      Case 1 '--no matches
         vReturn = False
      Case 2 '--1 match need to wrap in array
         ReDim vReturn(1 To 1, 1 To 1)
         vReturn(1, 1) = .Range("E2").Value
      Case Else '--return multiple matches
         vReturn = .Range("E2:E" & lLastRow).Value
   End Select
End With
   vGetMatches = vReturn
End Function

Private Function dGetVal(sInput As String) As Double
'--evaluates each character of sInput from left to right
'  until character other than 0-9 is found.
'  returns integer value of those numeric characters found
'  or -1 if the first character is not 0-9 or
'  resulting number exceeds 15 digits

   Dim lPos As Long
   Dim sHead As String, sChar As String
   
   For lPos = 1 To Len(sInput)
      sChar = Mid(sInput, lPos, 1)
      If sChar Like "[0-9]" Then
         sHead = sHead & sChar
      Else
         Exit For
      End If
   Next
   
   If Len(sHead) = 0 Or Len(sHead) > 15 Then
      dGetVal = -1
   Else
      dGetVal = CDbl(sHead)
   End If
End Function

Private Function vParseIDs(ByVal vFileNames As Variant) As Variant
 '--takes array of filenames as input, parses min and max IDs from each name
 '  retuns array with 3 columns that stores each file's: FileName, MinID, MaxID
 '  returns false if no valid filenames found
   
 '--The format of the pdfs can be any of these:
 '    12345-12348.pdf : MinID=12345, MaxID=12348
 
 '    12345.pdf       : MinID=12345, MaxID=12345
 '    12345(1).pdf    : same
 '    12345_001.pdf   : same
 
 Dim lNdxSource As Long, lNdxTags As Long
 Dim dMin As Double, dMax As Double
 Dim sFilename As String
 Dim vData As Variant
   
 ReDim vData(1 To UBound(vFileNames), 1 To 3)
 
 For lNdxSource = 1 To UBound(vFileNames)
   sFilename = vFileNames(lNdxSource)
   dMin = dGetVal(sFilename)
   
   If InStr(1, sFilename, "-") = 0 Then
      '--ID Code is single ID number
      dMax = dMin
   Else
      '--ID_Code is span of numbers- parse max
      dMax = dGetVal(Mid(sFilename, InStr(1, sFilename, "-") + 1))
   End If
   
   If dMin >= 0 And dMax >= dMin Then
      '--add record to array for this file
      lNdxTags = 1 + lNdxTags
      vData(lNdxTags, 1) = sFilename
      vData(lNdxTags, 2) = dMin
      vData(lNdxTags, 3) = dMax
   End If
 Next lNdxSource

 If lNdxTags = 0 Then
   vParseIDs = False
 Else
   vParseIDs = vData
 End If
 
End Function

Function rSetupAdvFilter(ByVal vSourceData As Variant) As Range
'--adds temporary sheet to be used in applying advanced filter
'  to dataset.
'  populates temp sheet with input data in Cols A:C
'  populates G2 with formula to be used as adv filter criteria
'  returns array of matching filenames of False if no matches

 Dim rReturn As Range
 
 '--if sheet TempForAdvFilter exists, delete it
 Call DeleteTempWorksheet

 With ThisWorkbook.Worksheets.Add
   .Name = "TempForAdvFilter"
   .Range("A1:C1").Value = Array("Filename", "MidID", "MaxID")
   .Range("A2").Resize(UBound(vSourceData, 1), _
      UBound(vSourceData, 2)).Value = vSourceData
   
   .Range("E1").Value = "Filename"
   .Range("G2").Formula = "=AND($F$1>=B2,$F$1<=C2)"
   Set rReturn = .Range("A1").CurrentRegion
 End With
 Application.DisplayAlerts = True
 
 '--return range to be used as advanced filter source
 Set rSetupAdvFilter = rReturn
End Function
 
Upvote 0
Jerry,
I can't thank you enough, my skills are a couple of light yrs away from writing this myself right now. But I'm working on it
Think I had a dodgy path name that caused the problem, as it works perfectly now!
I'll do a full run on the 15k folder when I get chance on friday and report the results on efficiency

Kind regards
Rob
 
Upvote 0
Jerry, quick report back that it took about 5 secs to look for 40 pdf's through a list of 16k and copy them to the folder
That is perfect for me

Regards
 
Upvote 0

Forum statistics

Threads
1,216,028
Messages
6,128,395
Members
449,446
Latest member
CodeCybear

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