Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


73681 / 76738 ←次へ | 前へ→

【7531】ファイル名とディレクトリ名を名前順に取得
質問  もと  - 03/9/8(月) 11:16 -

引用なし
パスワード
   はじめまして。
最近VBAを触るようになりまして、時々掲示板を拝見しお世話になっております。

今回どうしてもできないことがあって質問させていただくことになりました。

Excel2000を使用しているのですが、
目的は指定したディレクトリ配下のサブディレクトリも含む全てのファイル名を
取得することなのですが、DIR関数を用いて行ったところ、始めはファイル名順に
取得されていた名前が、最近理解のできない順番で取得されるようになりました。

インターネットなどで調べてFileSearchオブジェクトなどを用いてやると
ファイル名順には検索できるのですが、今度はディレクトリを無視したファイル名
順で検索されてしまいます。

わかりにくいかもしれませんが例をあげますと、
D:\test\01\a.xls
     \b.xls
     \c.xls
    \02\001.xls
     \002.xls
    \03\0001.xls
     \0002.xls
みたいな順番でファイル名及びディレクトリ名を取得していきたいのですが、
(最終的にはこの順番でさまざまな処理を行いたいので)
何かよい方法はありますでしょうか?

念のため現在の方法を下に挙げておきます。
・DIR関数を用いた方法
'========================================
'
'MAIN
'
'========================================

Call Get_DIR(指定パス)

'=======================================
'
'フォルダ検索
'
'=======================================
 Function Get_DIR(MyPath As String)
  
  Dim MyName As String
  Dim DirName(256)
  Dim Dir_N As Long
  Dim i As Long
  
  On Error GoTo err_hdl
  
  If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
  
  GetFile (MyPath)
  Dir_N = 0
  
  MyName = Dir(MyPath, vbDirectory)        ' 最初のフォルダ名
  Do While MyName <> ""
    If MyName <> "." And MyName <> ".." Then  '現在のフォルダと親フォルダは無視
      If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then   ' ビット単位の比較を行う
        Dir_N = Dir_N + 1
        DirName(Dir_N) = MyPath + MyName
      End If
    End If
    MyName = Dir          '次のフォルダを検索
  Loop
  
  If Dir_N > 0 Then
    For i = 1 To Dir_N
      Get_DIR (DirName(i) + "\")
    Next i
  End If
err_hdl:
  If Err = 53 Then
    MsgBox (DirName(i) + " file not found")
  End If
End Function

'======================================================
'
'ファイル名の取得
'
'======================================================


Function GetFile(MyPath As String)
  Dim MyName As String
  Dim No   As Integer
  Dim a   As Integer
  Dim WS_CT As Integer
  
  If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
  
  MyName = Dir(MyPath & "\*.xls", vbNormal)  ' 最初のfile名
  Do While MyName <> ""  ' ループを開始
      '現在のフォルダと親フォルダは無視
    If MyName <> "." And MyName <> ".." And MyName <> "試作マクロ.xls" Then
        ' ビット単位の比較を行う
      If (GetAttr(MyPath & MyName) And vbNormal) = vbNormal Then
        
        'ファイルごとに行う実際の処理
        
      End If
    End If
  MyName = Dir
  Loop

End function


・FileSearchオブジェクトを用いた方法
  With Application.FileSearch   
    .LookIn = CUR_PATH      '検索するフォルダを指定
    .SearchSubFolders = True   'サブフォルダも検索対象にする
    .Filename = "*.xls"      'Excleファイルの全てを検索
    .FileType = msoFileTypeExcelWorkbooks '検索対象はエクセルブック
    If .Execute(SortBy:=msoSortByFileName, _
      SortOrder:=msoSortOrderAscending) > 0 Then  'ファイルの名前でソート
      MsgBox .FoundFiles.Count & " 個のExcelブックが見つかりました"
      For i = 1 To .FoundFiles.Count
        If .FoundFiles(i) <> CUR_PATH & "試作マクロ.xls" Then  '無視
          If (GetAttr(MyPath & .FoundFiles(i)) And vbNormal) = vbNormal Then   ' ビット単位の比較を行う
            
              '実際のファイル毎の処理
          End If
        End If
      Next i
    Else
      MsgBox "Excelファイルは存在しません。"
    End If
  End With


長文になってしまいましたがよろしくお願い致します。

0 hits

【7531】ファイル名とディレクトリ名を名前順に取得 もと 03/9/8(月) 11:16 質問
【7548】Re:ファイル名とディレクトリ名を名前順に取... しのしの 03/9/8(月) 15:51 回答
【7565】Re:ファイル名とディレクトリ名を名前順に取... もと 03/9/8(月) 17:06 発言
【7823】事後報告ですが・・・ もと 03/9/19(金) 10:10 お礼

73681 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free