For Each文を普通のFor文にしたい

解決


小王  2003-08-09 10:44:49  No: 108030

現在FileSystemObjectのSubFoldersで取得したフォルダ
をFor Each文を使って、リストに追加しています。

    Set colFilesystem = CreateObject("Scripting.FileSystemObject")
    Set objFolder = colFilesystem.GetFolder("C:\")
    Set colFiles = objFolder.SubFolders

    For Each objFile In colFiles
        List1.AddItem objFile.Name
    Next

フォルダの並び順を変えたりしたいので、For Each文でなく
通常のFor文にしたいのですが、うまくいきません。
以下、エラーになるロジック

    Set colFilesystem = CreateObject("Scripting.FileSystemObject")
    Set objFolder = colFilesystem.GetFolder("C:\")
    Set colFiles = objFolder.SubFolders

    For I To colFiles.Count
        List1.AddItem colFiles.Item(I).Name
    Next

何が駄目なのか、お分かりになる方がいましたら、お教えください。


oku  URL  2003-08-09 11:17:18  No: 108031

コレクション内にサブファイル名が入っているので
多分For Eachでないと無理です。
> フォルダの並び順を変えたりしたいので
多分昇順や降順にしたいとかですよね?
もし  そうなら、リストボックスのSortプロパディを
Trueにすれば昇順に並びますよ。


小王  2003-08-10 03:38:35  No: 108032

昇順はSortedプロパティで対応してたのですが、
降順の仕方がわかりません。


Say  2003-08-10 07:13:38  No: 108033

ListViewコントロールを使っては?


oku  URL  2003-08-10 11:17:36  No: 108034

> 降順の仕方がわかりません。
リストボックスを最後から見るとか?


小王  2003-08-10 21:41:38  No: 108035

理解力不足ですみません。
リストボックスを最後から見るとはどういう事でしょうか?

今考えている方法はFor Eachで配列にセットして、
その後にFor文で逆からAddItemしようとしています。
2回For文回す事になるので、ダサイです。

出来れば、リストボックスで行きたいと思いますが、
最悪はリストビュー使うかもしれません。


oku  URL  2003-08-11 10:36:34  No: 108036

> 2回For文回す事になるので、ダサイです。
> 出来れば、リストボックスで行きたいと思いますが、
なぜダサいんですか?
もし小王さんが今考えている方法でも
2回For文回す事になりますけど。

一応自分の考えを詳しく書きます。

1  まずリストボックスのSortedをTrueに
2  小王さんが例に出されている1個目(For Each)でリストボックスに追加
3  サブファイルを全部追加した後で、For文でListCountから0まで
    ぶん回せば、降順ですよね。

一応コード書いておきますね。

    Dim colFilesystem As Object
    Dim objFolder     As Object
    Dim colFiles      As Object
    Dim objFile       As Object
    Dim intIndex      As Integer
    
    List1.Clear
    Set colFilesystem = CreateObject("Scripting.FileSystemObject")
    ' フォルダを取得
    Set objFolder = colFilesystem.GetFolder("C:\")
    Set colFiles = objFolder.Files
    ' ディレクトリのファイル名をリストアップ
    For Each objFile In colFiles
        List1.AddItem objFile.Name
    Next

    For intIndex = List1.ListCount To 0 Step -1
        ' ここにやりたい処理を書いてください
        Debug.Print List1.List(intIndex)
    Next intIndex
    
    ' オブジェクトを解放
    Set colFilesystem = Nothing
    Set objFolder = Nothing
    Set colFiles = Nothing
    Set objFile = Nothing


小王  2003-08-11 18:11:02  No: 108037

okuさん、わざわざコードまで書いていただいてありがとうございます。
大変、参考にさせてもらいました。
ダサイと言ったのは私が考えているロジックの事です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加