View Single Post
  #5   Report Post  
Posted to microsoft.public.excel.misc
joel joel is offline
external usenet poster
 
Posts: 9,101
Default open files in loop with date order

Your assuption is that files files were modified as the names of the files.
Often people modified the files. Using the date value function would solve
the problem.

change the compare in the sort
from
If FileNames(i) FileNames(j) Then
to
If datevalue(FileNames(i)) datevalue(FileNames(j)) Then


the real solution to the problem is your suggestion. Whenever files are
name include a date in the format YYYY-MM-DD.

Joels Monthly Report 2007-02-05
Joels Monthly Report 2007-03-01
Joels Monthly Report 2007-04-02

"OssieMac" wrote:

I like the array idea Joel but in its current form it does not work. I
interpreted the OP's post as wanting to sort the filenames so that the date
names were sorted as dates. Your method sorts them as text and not in the
date order. You have a date like 05-Sep-07 coming before 06-Aug-07.

When I originally had to extract files like this I actually started with an
array. However, I ran into problems sorting with the filenames being strings
and the user wanting them sorted as dates.

I then tried extracting the filename to left of the dot and saving as
DateValue(filename) and using Format(array(i),"dd-mm-yy") to convert it back
to a string for the filename. This also failed because we had a user who
saved some files as d-mm-yy. I moved to the method of copying the data to a
worksheet so that I could see what was happening and I created a separate
date column to achieve the correct sorting and retain the original text file
name and then when it all worked, I left it that way.

Maybe a 2 dimensional array is the answer but I haven't tried it.

Regards,

OssieMac


"Joel" wrote:

This code is a little simplier than OssieMac solution. It reads the files
names into an array and then sorts the array. The code is case sensitive.
If you don't care about the case the make this replacement
from
FileNames(FileCount) = Filename
to
FileNames(FileCount) = ucase(Filename)

Sub sortfilename()

Const MyPath = "c:\temp"
Const Filetype = "*.xls"
Dim FileNames(1000)

FileCount = 0
First = True
Do
If First = True Then
Filename = Dir(MyPath & "\" & Filetype)
First = False
Else
Filename = Dir()
End If

If Filename < "" Then
FileNames(FileCount) = Filename
FileCount = FileCount + 1
End If
Loop While Filename < ""

'sort file names
FileCount = FileCount - 1
For i = 0 To (FileCount - 1)
For j = i To FileCount
If FileNames(i) FileNames(j) Then

temp = FileNames(i)
FileNames(i) = FileNames(j)
FileNames(j) = temp
End If
Next j
Next i

'open files
For i = 0 To (FileCount - 1)
Workbooks.Open MyPath & "\" & FileNames(i)

'Enter Your code here
Workbooks(FileNames(i)).Close
Next i
End Sub


"OssieMac" wrote:

And Hello to you too,

This is a method that I have used. It requires copying the file names to a
worksheet and extracting the date component to a separate column and then
sorting the filename and date column. Then looping through the sorted file
names.

Just a little extra advice, if you are going to use dates for file names
then I find it is better to put them in yyyy-mm-dd format for the file name.
This way they can be ordered by file name in the file open dialog box.
However, the macro below works with the date format dd-mm-yy that you said
has been used.

If you have any problems with it then feel free to get back to me

Sub LoopFileOpen()
Dim strPath As String
Dim wsSht2 As Worksheet
Dim strFileName As String
Dim i As Single
Dim rngSort As Range
Dim rngFileNames As Range
Dim f As Range
Dim strThisWB As String

strThisWB = ThisWorkbook.Name

Set wsSht2 = Sheets("Sheet2")
wsSht2.Columns("B:B").NumberFormat = "d/m/yyyy"
wsSht2.Cells(1, 1) = "File Name"
wsSht2.Cells(1, 2) = "Date"

strPath = CurDir 'Set strPath this to the required path
With Application.FileSearch
.NewSearch
.LookIn = strPath
.SearchSubFolders = False
.FileType = msoFileTypeAllFiles
If .Execute() 0 Then
For i = 1 To .FoundFiles.Count
strFileName = Mid(.FoundFiles(i), _
InStrRev(.FoundFiles(i), "\") + 1)
If strFileName < strThisWB Then
wsSht2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) _
= strFileName
wsSht2.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) _
= DateValue(Left(strFileName, _
InStr(1, strFileName, ".") - 1))
End If
Next i
Else
MsgBox "There were no files found."
End If
End With

With wsSht2
Set rngSort = Range(.Cells(1, 1), .Cells(.Rows.Count, 2).End(xlUp))
End With

rngSort.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Set rngFileNames = wsSht2.Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))

For Each f In rngFileNames
Workbooks.Open Filename:=f.Value
'Delete msgbox and put your code here
'(or call another procedure)
MsgBox "File opened is " & f.Value
Next f


End Sub


Regards,

OssieMac



" wrote:

Hello

how are you


i am using Excel 2002,

i want to know is there any way to Open Files one by one from a Folder

my files names are actuly based on dates

like

01-Jan-02
02-Jan-02
.....
......
..
..


11-Jan-02

..
...
.....


i have a code which i'll apply when that file open

but dont know how to do above task


please kindly help me out

thanks,