VBAで、選択したフォルダに含まれるファイル一覧を、リストボックスに表示させたいのですが、

連番を使ったファイル名によって、きっちり並ぶようにしているのですが、並びません。
使用するパソコンによって変わるような気がするのですが、
順番は不定で、気まぐれなのですか?
リストに格納される前のFileDialogにてファイルの順番を指定する方法は
ないのでしょうか。

With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
 strFolder = .SelectedItems(1)
 Set myFolder = myFSO.GetFolder(strFolder)
 Set myFiles = myFolder.files
 targetFolder = strFolder 'myFolder.name
 txtFolder.Value = strFolder
 i = 0

 '一旦初期化
 fileAry = Split("")
 lstFile.Clear

 For Each myFile In myFiles
  If IsExcel(myFile.name) = True Then
   ReDim Preserve fileAry(i)
   fileAry(i) = myFile.name
   i = i + 1
  End If
 Next
End If
End With

回答の条件
  • 1人3回まで
  • 登録:2009/11/25 11:41:17
  • 終了:2009/11/27 17:21:30

ベストアンサー

id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912009/11/25 12:53:57

ポイント35pt

このあたりの使用は OS のバージョンによっても異なったりしますので、

並べ替え処理を入れてみてはどうでしょう。



下記のような処理を用意して、

Sub strSort(fileArray)
    For i = LBound(fileArray) To UBound(fileArray) - 1
        For j = i + 1 To UBound(fileArray)
            If StrComp(fileArray(i), fileArray(j), vbTextCompare) > 0 Then
                tmp = fileArray(i)
                fileArray(i) = fileArray(j)
                fileArray(j) = tmp
            End If
        Next
    Next
End Sub

ファイル名の配列を作成後

  :
  :
       For Each myFile In myFiles
        If IsExcel(myFile.name) = True Then
         ReDim Preserve fileAry(i)
         fileAry(i) = myFile.name
         i = i + 1
        End If
       Next
      End If
    End With

    strSort fileAry

のように実行してみてどうでしょうか。

id:kyoko55

ありがとうございます。

わざわざ作成していただきまして、ありがとうございました。

やってみます。

うまくいきました。

2009/11/27 17:19:02

その他の回答(2件)

id:degucho No.1

degucho回答回数256ベストアンサー獲得回数682009/11/25 12:14:37

ポイント30pt

取得時のFilesコレクションもFor Eachで取り出すときも

仕様上順序は定められていないので、保証したいなら

自前で配列をソートしないとダメだと思います。

OSが2000/XP混在であれば↓が影響しているかもしれません。

http://support.microsoft.com/kb/319827/ja

id:kyoko55

自前で用意いなければならないのですね。

ありがとうございました。

2009/11/25 12:50:58
id:mattn No.2

mattn回答回数104ベストアンサー獲得回数232009/11/25 12:33:21

ポイント35pt

ソートされていないからかと思います。

Sub MySort(ByRef a)
    Dim i, tmp
    For i = 0 To UBound(a) - 1
        Dim j
        For j = i + 1 To UBound(a) - 1
            If a(j) < a(i) Then
                tmp = a(j)
                a(j) = a(i)
		a(i) = tmp
            End If
        Next
    Next
End Sub

こんなソート関数で

Call MySort(fileAry)

としてあげれば、うまく並ぶかと思います。

id:kyoko55

ありがとうございます。

わざわざ作成していただきまして、ありがとうございました。

やってみます。

うまくいきました。

2009/11/27 17:18:56
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912009/11/25 12:53:57ここでベストアンサー

ポイント35pt

このあたりの使用は OS のバージョンによっても異なったりしますので、

並べ替え処理を入れてみてはどうでしょう。



下記のような処理を用意して、

Sub strSort(fileArray)
    For i = LBound(fileArray) To UBound(fileArray) - 1
        For j = i + 1 To UBound(fileArray)
            If StrComp(fileArray(i), fileArray(j), vbTextCompare) > 0 Then
                tmp = fileArray(i)
                fileArray(i) = fileArray(j)
                fileArray(j) = tmp
            End If
        Next
    Next
End Sub

ファイル名の配列を作成後

  :
  :
       For Each myFile In myFiles
        If IsExcel(myFile.name) = True Then
         ReDim Preserve fileAry(i)
         fileAry(i) = myFile.name
         i = i + 1
        End If
       Next
      End If
    End With

    strSort fileAry

のように実行してみてどうでしょうか。

id:kyoko55

ありがとうございます。

わざわざ作成していただきまして、ありがとうございました。

やってみます。

うまくいきました。

2009/11/27 17:19:02

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません