source

반환된 파일의 순서에 대해서는 Dir()가 보증을 서주나요?

ittop 2023. 9. 24. 13:06
반응형

반환된 파일의 순서에 대해서는 Dir()가 보증을 서주나요?

기존 코드를 정리하는 중입니다.

Sheets("Control").Select
MyDir = Cells(2, 1)
CopySheet = Cells(6, 2)
MyFileName = Dir(MyDir & "wp*.xls")

' when the loop breaks, we know that any subsequent call to Dir implies
' that the file need to be added to the list
While MyFileName <> LastFileName
    MyFileName = Dir
Wend

MyFileName = Dir

While MyFileName <> ""
    Cells(LastRow + 1, 1) = MyFileName
    LastRow = LastRow + 1
    MyFileName = Dir
Wend

제 질문은 어떻게 하면Dir결과 및 결과 순서에 대한 보장이 있는 경우 를 반환합니다.사용시Dir위와 같은 루프에서, 코드는 결과적으로 다음과 같은 호출을 암시합니다.Dir이름순으로 정렬되어 있습니다.

~하지 않는 한Dir이를 보장합니다. 고칠 필요가 있는 버그입니다.문제는 Dir()가 파일이 반환되는 순서에 대해 보증을 서느냐, 아니면 암묵적으로 보증을 서느냐는 것입니다.

해결책

@Frederic의 답변을 바탕으로 제가 생각해낸 해결책은 이것입니다.

퀵소트 알고리즘폴더의 모든 파일을 반환하는 함수를 함께 사용하면...

Dim allFiles As Variant
allFiles = GetFileList(MyDir & "wp*.xls")
If IsArray(allFiles) Then
    Call QuickSort(allFiles, LBound(allFiles), UBound(allFiles))
End If

Dim x As Integer
Dim lstFile As String
x = 1

' still need to loop through results to get lastFile
While lstFile <> LastFileName 
    lstFile = allFiles(x)
    x = x + 1
Wend

For i = x To UBound(allFiles)
    MyFileName = allFiles(i)
    Cells(LastRow + 1, 1) = MyFileName
    LastRow = LastRow + 1
Next i

이 일이 일어난다는 보장은 없습니다.Dir()는 특정 순서대로 파일을 반환합니다.MS Access VBA 설명서에는 다음과 같은 내용도 나와 있습니다.

팁파일 이름은 특정 순서로 검색되지 않으므로 반환된 파일 이름을 저장할 수 있습니다.array, 배열을 정렬합니다.

저는 이 게시물이 오래된 것을 알고 있지만 또한 짧은 해결책을 찾고 있는 사람들을 위해 제가 찾은 해결책을 공유합니다.

모든 파일명을 엑셀 시트란에 작성하고 파일명을 얻을 수 있는 변수를 사용합니다.그런 다음 루프를 실행하여 변수가 열에 작성한 순서에 따라 검색한 이름을 기준으로 각 파일을 엽니다.

For Row_Value = 1 To 10 
    NameFile= Range("N" & Row_Value).Value 'NameFile = "Worbook1"
    MyFile = Dir("C\Desktop\Folder1\" & NameFile & ".xlsm")
Next Row_Value 

이상 없길 바랍니다.

언급URL : https://stackoverflow.com/questions/4282940/does-dir-make-any-guarantee-on-the-order-of-files-returned

반응형