Excel VBA質問箱 IV

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

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


3409 / 13644 ツリー ←次へ | 前へ→

【62373】ファイル一覧を作りましたが ざき 09/7/15(水) 11:51 質問[未読]
【62374】Re:ファイル一覧を作りましたが つん 09/7/15(水) 13:01 発言[未読]
【62386】Re:ファイル一覧を作りましたが ざき 09/7/16(木) 8:19 お礼[未読]
【62380】Re:ファイル一覧を作りましたが Hirofumi 09/7/15(水) 16:28 回答[未読]
【62381】Re:ファイル一覧を作りましたが Hirofumi 09/7/15(水) 16:33 回答[未読]
【62387】Re:ファイル一覧を作りましたが ざき 09/7/16(木) 8:24 お礼[未読]
【62388】Re:ファイル一覧を作りましたが Hirofumi 09/7/16(木) 10:39 回答[未読]
【62457】Re:ファイル一覧を作りましたが ざき 09/7/22(水) 20:35 お礼[未読]

【62373】ファイル一覧を作りましたが
質問  ざき  - 09/7/15(水) 11:51 -

引用なし
パスワード
   初心者なので本を読んだり他の方の作ったものを参考にしながら自分のイメージにあうファイル一覧のVBAが出来ましたが、FSOで指定したフォルダからサブフォルダの中身まで全てエクセルに書き出せる記述がどうしても分かりません。是非教えてくださいお願いします。

Sub ファイル一覧()


Dim myFSO As New FileSystemObject
Dim myFolder As Folder
Dim myFiles As Files
Dim myFile As File
Dim i As Integer

'フォルダー取得
Dim Shell, myPath
  Set Shell = CreateObject("Shell.Application")
  Set myPath = Shell.BrowseForFolder(0, "フォルダを選択して下さい", &H11)
  'If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path

Set myFolder = myFSO.GetFolder(myPath.Items.Item.Path)
Set myFiles = myFolder.Files

  Cells(1, 1).Value = "No"
  Cells(1, 2).Value = "ファイル名"
  Cells(1, 3).Value = "作成日"
  Cells(1, 4).Value = "サイズ"
  Cells(1, 5).Value = "パス"

For Each myFile In myFiles
i = i + 1
  Cells(i + 1, 1).Value = i - 1
  Cells(i + 1, 2).Value = myFile.Name
  Cells(i + 1, 3).Value = myFile.Datecreated
  Cells(i + 1, 4).Value = myFile.Size
  Cells(i + 1, 5).Value = myFile.Path
Next

End Sub

【62374】Re:ファイル一覧を作りましたが
発言  つん  - 09/7/15(水) 13:01 -

引用なし
パスワード
   ▼ざき さん
こんにちは

サブフォルダを取得できたら出来そうですね???

Sub test()
  Dim FSO, SubFS, SubF
  
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set SubFS = FSO.GetFolder("D:\Data").SubFolders
  
  For Each SubF In SubFS
    Debug.Print SubF.Name
  Next SubF
  
  Set SubF = Nothing
  Set FSO = Nothing
End Sub

こんな感じで、サブフォルダが取得できるみたいです。
(私も検索しながら、調べながらなので、これが最適なのかわかりませんが^^;)

【62380】Re:ファイル一覧を作りましたが
回答  Hirofumi  - 09/7/15(水) 16:28 -

引用なし
パスワード
   今使っている、コードを少し変更した物で余り上手く有りませんが?
再帰呼び出しでSubFolderも探して居ます

Option Explicit

Sub ファイル一覧_2()

  Dim myFSO As Object
  Dim i As Long
  'フォルダー取得
  Dim myShell As Object, myPath As Object
  Dim vntFiles As Variant
  
  Set myShell = CreateObject("Shell.Application")
  Set myPath = myShell.BrowseForFolder(0, "フォルダを選択して下さい", &H11)
  'If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path
  
  'FSOのオブジェクトを取得
  Set myFSO = CreateObject("Scripting.FileSystemObject")
  
  'ファイル名取得
  If Not GetFilesList(vntFiles, myPath.Items.Item.Path, myFSO, , , -1) Then
    GoTo Wayout
  End If
  
  With ActiveSheet
    .Cells(1, 1).Resize(, 5).Value _
        = Array("No", "ファイル名", "作成日", "サイズ", "パス")
    With .Cells(2, 1)
      .Value = 1
      .Resize(UBound(vntFiles, 2) + 1).DataSeries _
          Rowcol:=xlColumns, Type:=xlLinear, _
          Date:=xlDay, Step:=1, Trend:=False
      .Offset(, 1).Resize(UBound(vntFiles, 2) + 1, 4).Value = vntFiles
    End With
  End With

Wayout:

  Set myFSO = Nothing
  Set myPath = Nothing
  Set myShell = Nothing

End Sub

Private Function GetFilesList(vntFileNames As Variant, _
              strFolderPath As String, _
              objFSO As Object, _
              Optional strBasePattan As String = ".*", _
              Optional strExtePattan As String = ".*", _
              Optional lngSubDir As Long = -1) As Boolean

'  vntFileNames  : ファイル名等が返される変数(配列)
'  strFolderPath  : 探し始めるフォルダを指定
'  strBasePattan  : ファイルのBase名を正規表現で指定
'  strExtePattan  : ファイル拡張子を正規表現で指定
'  lngSubDir    : 探すサブフォルダの階層を指定、0はstrFolderPath、1はstrFolderPathの下の
'           -1ははstrFolderPath以下全てのサブフォルダ
'  戻り値     : 値が在った場合、Trueを返す
              
  Const clngLower As Long = 0
  
  Dim regName As Object
  Dim vntRead As Variant
  
  'フォルダの存在確認
  If Not objFSO.FolderExists(strFolderPath) Then
    GoTo Wayout
  End If
  
  Set regName = CreateObject("VBScript.RegExp")
  '大文字と小文字を区別しないように設定
  regName.IgnoreCase = True

  'ファイル名List配列の初期化
  ReDim vntRead(3, clngLower To 1)
  'ファイル名Listの作成
  GetFilePath vntRead, _
        objFSO.GetFolder(strFolderPath), _
        strBasePattan, strExtePattan, _
        regName, objFSO, lngSubDir
  
  'ファイル名List配列の先頭値が""で無いなら
  If vntRead(0, clngLower) <> "" Then
    vntFileNames = Application.WorksheetFunction.Transpose(vntRead)
    GetFilesList = True
  End If
  
Wayout:
  
  Set regName = Nothing

End Function

Private Sub GetFilePath(vntFileNames As Variant, _
            objFolder As Object, _
            strBasePattan As String, _
            strExtePattan As String, _
            regName As Object, _
            objFSO As Object, _
            ByVal lngSubDir As Long)

  Dim lngLower As Long
  Dim i As Long
  Dim objFile As Object
  Dim objSubDir As Object
  Dim strDirPath As String
  Dim strName As String
  
  'List配列の最小添え字を取得
  lngLower = LBound(vntFileNames, 2)
  'List配列に値が有る場合
  If vntFileNames(0, lngLower) <> "" Then
    'カウンタをList配列の最大添え字に設定
    i = UBound(vntFileNames, 2)
  Else
    'カウンタをList配列の最小添え字以下に設定
    i = lngLower - 1
  End If
  
  '現在のFoderPathを取得
  strDirPath = objFolder.Path & "\"
  'ファイル名を列挙
  For Each objFile In objFolder.Files
    strName = objFile.Name
    With regName
      '拡張子を比較
      .Pattern = strExtePattan
      If .TEST(objFSO.GetExtensionName(strName)) Then
        'Base名を比較
        .Pattern = strBasePattan
        If .TEST(objFSO.GetBaseName(strName)) Then
          'カウンタをインクリメント
          i = i + 1
          'List配列を拡張
          ReDim Preserve vntFileNames(3, lngLower To i)
          'Path、ファイル名を代入
          vntFileNames(0, i) = strName
          vntFileNames(1, i) = objFile.Datecreated
          vntFileNames(2, i) = objFile.Size
          vntFileNames(3, i) = objFile.Path
        End If
      End If
    End With
  Next objFile

  Set objFile = Nothing
  
  '指定階層数になるまで再帰、lngSubDir < 0 の時は最終階層まで再帰
  If lngSubDir > 0 Or lngSubDir < 0 Then
    '階層指定を一つ下げる
    lngSubDir = lngSubDir - 1
    'SubFolderを探索
    For Each objSubDir In objFolder.SubFolders
      GetFilePath vntFileNames, objSubDir, _
            strBasePattan, strExtePattan, _
            regName, objFSO, lngSubDir
    Next objSubDir
  End If
  
  Set objSubDir = Nothing
  
End Sub

【62381】Re:ファイル一覧を作りましたが
回答  Hirofumi  - 09/7/15(水) 16:33 -

引用なし
パスワード
   間違えました

      .Resize(UBound(vntFiles, 2) + 1).DataSeries _
          Rowcol:=xlColumns, Type:=xlLinear, _
          Date:=xlDay, Step:=1, Trend:=False
      .Offset(, 1).Resize(UBound(vntFiles, 2) + 1, 4).Value = vntFiles



      .Resize(UBound(vntFiles, 1) + 1).DataSeries _
          Rowcol:=xlColumns, Type:=xlLinear, _
          Date:=xlDay, Step:=1, Trend:=False
      .Offset(, 1).Resize(UBound(vntFiles, 1) + 1, 4).Value = vntFiles

に変更して下さい

【62386】Re:ファイル一覧を作りましたが
お礼  ざき  - 09/7/16(木) 8:19 -

引用なし
パスワード
   すみません、私の知識では組み合わせることが出来ませんでした^_^;ありがとうございます

【62387】Re:ファイル一覧を作りましたが
お礼  ざき  - 09/7/16(木) 8:24 -

引用なし
パスワード
   凄い!私の思い描いていた通りの形になっております。ありがとうございました。

ただ、一覧の最後に#N/Aが付いているのは何か理由があるのでしょうか?

【62388】Re:ファイル一覧を作りましたが
回答  Hirofumi  - 09/7/16(木) 10:39 -

引用なし
パスワード
   >ただ、一覧の最後に#N/Aが付いているのは何か理由があるのでしょうか?

ゴメン、ファイル名の配列サイズを勘違いしました

      .Resize(UBound(vntFiles, 1) + 1).DataSeries _
          Rowcol:=xlColumns, Type:=xlLinear, _
          Date:=xlDay, Step:=1, Trend:=False
      .Offset(, 1).Resize(UBound(vntFiles, 1) + 1, 4).Value = vntFiles



      .Resize(UBound(vntFiles, 1)).DataSeries _
          Rowcol:=xlColumns, Type:=xlLinear, _
          Date:=xlDay, Step:=1, Trend:=False
      .Offset(, 1).Resize(UBound(vntFiles, 1), 4).Value = vntFiles

です、「UBound(vntFiles, 1) + 1」の所を「UBound(vntFiles, 1)」として下さい
1行余計に成っていました

【62457】Re:ファイル一覧を作りましたが
お礼  ざき  - 09/7/22(水) 20:35 -

引用なし
パスワード
   遅くなりました。お蔭様で良いマクロが組めました!本当に感謝です。

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