過去ログ

                                Page     199
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼一つ下のサブフォルダ名のみ取得したい  カド 02/10/13(日) 6:40
   ┗File System Object で・・・  ichinose 02/10/13(日) 7:47
      ┗Re:File System Object で・・・  カド 02/10/13(日) 10:11
         ┗Re:元のコードからの変更  Hirofumi 02/10/13(日) 14:15
            ┗Re:元のコードからの変更  Hirofumi 02/10/13(日) 14:30
               ┗Re:元のコードからの変更  カド 02/10/13(日) 18:37

 ───────────────────────────────────────
 ■題名 : 一つ下のサブフォルダ名のみ取得したい
 ■名前 : カド
 ■日付 : 02/10/13(日) 6:40
 -------------------------------------------------------------------------
   こんにちわ〜
以前サブフォルダ以下のファイル名も取得する以下の
コードを教えていただきました。(No12076)

今回は、ファイル名ではなく、一つ下までのサブフォルダ名を
取得する方法を教えてください。(2つより下の階層は不要)

************************************************************************
'別な方法も有るようですが
'こんなのでも、善いのかな?
'DirTestを実行すると、strDirPathで指定したPath以下のフォルダから
'"*.xls"のファイルをSheet1に列挙します、FilesListの第3引数にTrueを
'Falseにすればサブフォルダは探しません

Public Sub DirTest()
  
  Dim i As Long
  Dim vntFileName As Variant
  Dim strDirPath As String
  
  strDirPath = ThisWorkbook.Path
  vntFileName = FilesList(strDirPath, "*.xls", True)
 
  With Worksheets("Sheet1")
    For i = 0 To UBound(vntFileName)
      .Cells(i + 1, 1).Value = vntFileName(i)
    Next i
  End With
 
End Sub

Public Function FilesList(ByVal strFilesPath As String, _
            ByVal strSearchFile As String, _
            Optional blnSubDir As Boolean = False) As Variant

  Dim strData() As String
 
  ReDim strData(0)
  FileListing strFilesPath, strSearchFile, strData(), blnSubDir
 
  FilesList = strData()
 
End Function

Private Sub FileListing(ByVal strFilesPath As String, _
            ByVal strSearchFile As String, _
            strData() As String, blnSubDir As Boolean)

  Dim i As Long
  Dim j As Long
  Dim strFileName As String
  Dim strDirList() As String

  '結果用配列の書き込み位置を取得
  If strData(UBound(strData)) = "" Then
    i = UBound(strData)
  Else
    i = UBound(strData) + 1
  End If
  'パスの最後に\を付加
  If Right(strFilesPath, 1) <> "\" Then
    strFilesPath = strFilesPath & "\"
  End If
 
  'ディレクトリ内の全ての標準ファイルを列挙
  strFileName = Dir(strFilesPath & strSearchFile)
  Do Until strFileName = ""
    ReDim Preserve strData(i)
    strData(i) = strFilesPath & strFileName
    i = i + 1
    strFileName = Dir
  Loop

  If blnSubDir Then
    'サブディレクトリの一時的なリストを作成
    strFileName = Dir(strFilesPath, vbDirectory)
    Do Until strFileName = ""
      '現在のディレクトリと親ディレクトリを無視
      If strFileName <> "." And strFileName <> ".." Then
        'ディレクトリ以外を無視
        If GetAttr(strFilesPath & strFileName) _
                      And vbDirectory Then
          j = j + 1
          ReDim Preserve strDirList(j)
          strDirList(j) = strFilesPath & strFileName
        End If
      End If
      strFileName = Dir
    Loop
    '各ディレクトリを再帰的に処理
    For i = 1 To j
      FileListing strDirList(i), strSearchFile, strData(), True
    Next i
  End If
 
End Sub
 ───────────────────────────────────────  ■題名 : File System Object で・・・  ■名前 : ichinose  ■日付 : 02/10/13(日) 7:47  -------------------------------------------------------------------------
   ▼カド さん:
おはようございます。

>以前サブフォルダ以下のファイル名も取得する以下の
>コードを教えていただきました。(No12076)
>
>今回は、ファイル名ではなく、一つ下までのサブフォルダ名を
>取得する方法を教えてください。(2つより下の階層は不要)
FSOを使いました。
'==========================================
Sub test()
  Dim f_name As String
  f_name = "D:\EXCELファイル"
  i = 1
  Set ffs = get_folders(f_name)
  If Not ffs Is Nothing Then
  
    For Each fold In ffs
     Cells(i, 1).Value = fold.Name
     Cells(i, 2).Value = fold.Path
     i = i + 1
     Next
    End If
  Set ffs = Nothing
End Sub
'===========================================
Function get_folders(f_fold As String) As Object
  On Error Resume Next
  Set get_folders = Nothing
  Set get_folders = CreateObject("Scripting.FileSystemObject").getfolder(f_fold).subfolders
  On Error GoTo 0
End Function
 ───────────────────────────────────────  ■題名 : Re:File System Object で・・・  ■名前 : カド  ■日付 : 02/10/13(日) 10:11  -------------------------------------------------------------------------
   ▼ichinose さん:
こんにちわ〜。朝早くから回答ありがとうございます。
当サイトは、朝早くから夜遅くまで、誰かが対応してくれるので大変助かります。

さて,本題に入りますが、私の説明がまずく正しく意図が伝わらなかったようなので、
再度説明いたします。

ichinoseさんの回答に対し、さらにもう一つ下の階層のフォルダ名を取得する方法を
お教えください。
過去の例でも、”FSOを使いました”とことわり書きをしてある回答をよくみかけますが、
残念ながらFSOって何?というレベルです。これを機に勉強したいと思います。

さらに、勝手なお願いですみませんが、下記コードを改良した場合の方法についても、
お分かりの方が見えたらお教えください。

再帰のループに頭がついて行けないにもかかわらず、再帰のコードに通常のプログラムとは
違う魅力を感じています。


以前教えていただいたサブフォルダ以下のファイル名も取得するコード(No12076)
*************************************************************************************
'別な方法も有るようですが
'こんなのでも、善いのかな?
'DirTestを実行すると、strDirPathで指定したPath以下のフォルダから
'"*.xls"のファイルをSheet1に列挙します、FilesListの第3引数にTrueを
'Falseにすればサブフォルダは探しません

Public Sub DirTest()
  
  Dim i As Long
  Dim vntFileName As Variant
  Dim strDirPath As String
  
  strDirPath = ThisWorkbook.Path
  vntFileName = FilesList(strDirPath, "*.xls", True)
 
  With Worksheets("Sheet1")
    For i = 0 To UBound(vntFileName)
      .Cells(i + 1, 1).Value = vntFileName(i)
    Next i
  End With
 
End Sub

Public Function FilesList(ByVal strFilesPath As String, _
            ByVal strSearchFile As String, _
            Optional blnSubDir As Boolean = False) As Variant

  Dim strData() As String
 
  ReDim strData(0)
  FileListing strFilesPath, strSearchFile, strData(), blnSubDir
 
  FilesList = strData()
 
End Function

Private Sub FileListing(ByVal strFilesPath As String, _
            ByVal strSearchFile As String, _
            strData() As String, blnSubDir As Boolean)

  Dim i As Long
  Dim j As Long
  Dim strFileName As String
  Dim strDirList() As String

  '結果用配列の書き込み位置を取得
  If strData(UBound(strData)) = "" Then
    i = UBound(strData)
  Else
    i = UBound(strData) + 1
  End If
  'パスの最後に\を付加
  If Right(strFilesPath, 1) <> "\" Then
    strFilesPath = strFilesPath & "\"
  End If
 
  'ディレクトリ内の全ての標準ファイルを列挙
  strFileName = Dir(strFilesPath & strSearchFile)
  Do Until strFileName = ""
    ReDim Preserve strData(i)
    strData(i) = strFilesPath & strFileName
    i = i + 1
    strFileName = Dir
  Loop

  If blnSubDir Then
    'サブディレクトリの一時的なリストを作成
    strFileName = Dir(strFilesPath, vbDirectory)
    Do Until strFileName = ""
      '現在のディレクトリと親ディレクトリを無視
      If strFileName <> "." And strFileName <> ".." Then
        'ディレクトリ以外を無視
        If GetAttr(strFilesPath & strFileName) _
                      And vbDirectory Then
          j = j + 1
          ReDim Preserve strDirList(j)
          strDirList(j) = strFilesPath & strFileName
        End If
      End If
      strFileName = Dir
    Loop
    '各ディレクトリを再帰的に処理
    For i = 1 To j
      FileListing strDirList(i), strSearchFile, strData(), True
    Next i
  End If
 
End Sub
 ───────────────────────────────────────  ■題名 : Re:元のコードからの変更  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/10/13(日) 14:15  -------------------------------------------------------------------------
   >さらに、勝手なお願いですみませんが、下記コードを改良した場合の方法についても、
>お分かりの方が見えたらお教えください。

こんな物で善いかな?
階層数はFilesListの第二引数で決められます
元のコードと引数等が細かく違っていますので気をつけて下さい

Public Sub DirTest()

  Dim i As Long
  Dim vntFileName As Variant
  Dim strDirPath As String

  strDirPath = ThisWorkbook.Path
  vntFileName = FilesList(strDirPath, 1)

  With Worksheets("Sheet1")
    For i = 0 To UBound(vntFileName)
      .Cells(i + 1, 1).Value = vntFileName(i)
    Next i
  End With

End Sub

Public Function FilesList(ByVal strFilesPath As String, _
            Optional lngSubDir As Long = 1) As Variant

'  strFilesPath:  探し始めるフォルダ名
'  lngSubDir:   探す階層数

  Dim strData() As String

  ReDim strData(0)
  '探し始めるフォルダを代入(必要が無ければ削除)
  strData(0) = strFilesPath
  'フォルダをリストアップ
  FileListing strFilesPath, strData(), lngSubDir

  FilesList = strData()

End Function

Private Sub FileListing(ByVal strFilesPath As String, _
          strDirList() As String, lngSubDir As Long)

  Dim i As Long
  Dim j As Long
  Dim lngNow As Long
  Dim strFileName As String
  Dim strDirListTmp() As String

  '結果用配列の書き込み位置を取得
  If strDirList(UBound(strDirList)) = "" Then
    i = UBound(strDirList)
  Else
    i = UBound(strDirList) + 1
  End If
  'パスの最後に\を付加
  If Right(strFilesPath, 1) <> "\" Then
    strFilesPath = strFilesPath & "\"
  End If

  'サブディレクトリの結果リストと、一時的なリストを作成
  j = 1
  strFileName = Dir(strFilesPath, vbDirectory)
  Do Until strFileName = ""
    '現在のディレクトリと親ディレクトリを無視
    If strFileName <> "." And strFileName <> ".." Then
      'ディレクトリ以外を無視
      If GetAttr(strFilesPath & strFileName) _
                    And vbDirectory Then
        ReDim Preserve strDirList(i)
        ReDim Preserve strDirListTmp(j)
        '結果リストに追加
        strDirList(i) = strFilesPath & strFileName
        '一時的なリストに追加
        strDirListTmp(j) = strDirList(i)
        i = i + 1
        j = j + 1
      End If
    End If
    strFileName = Dir
  Loop
  'ディレクトリの階層を一つ下げる
  lngSubDir = lngSubDir - 1
  '指定階層数になるまで再帰
  If lngSubDir > 0 Then
    '各ディレクトリを再帰的に処理
    For i = 1 To j - 1
      lngNow = lngSubDir
      FileListing strDirListTmp(i), strDirList(), lngNow
    Next i
  End If

End Sub
 ───────────────────────────────────────  ■題名 : Re:元のコードからの変更  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/10/13(日) 14:30  -------------------------------------------------------------------------
   このままで実行するとichinoseさんの回答と同じ階層までですので
以下の様に第二引数に2を与えて下さい

  vntFileName = FilesList(strDirPath, 1)
上記を
  vntFileName = FilesList(strDirPath, 2)
の様に
 ───────────────────────────────────────  ■題名 : Re:元のコードからの変更  ■名前 : カド  ■日付 : 02/10/13(日) 18:37  -------------------------------------------------------------------------
   ▼Hirofumi さん:
作動を確認しました。私のリクエストに対し完璧です。ありがとうございます。
これからコードの内容を理解するつもりですが、出来るかは?です。
今後ともよろしく〜
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 199