Excel VBA質問箱 IV

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

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


1150 / 13645 ツリー ←次へ | 前へ→

【76036】一覧表に合致するファイルをサブディレクトリまで検索し、内容を一覧に反映... himawari 14/8/25(月) 17:59 質問[未読]
【76037】Re:一覧表に合致するファイルをサブディレ... kanabun 14/8/25(月) 19:12 発言[未読]
【76038】Re:一覧表に合致するファイルをサブディレ... kanabun 14/8/25(月) 19:34 発言[未読]
【76039】Re:一覧表に合致するファイルをサブディレ... kanabun 14/8/25(月) 19:43 発言[未読]
【76040】Re:一覧表に合致するファイルをサブディレ... kanabun 14/8/25(月) 19:48 発言[未読]
【76041】Re:一覧表に合致するファイルをサブディレ... himawari 14/8/26(火) 12:20 お礼[未読]

【76036】一覧表に合致するファイルをサブディレク...
質問  himawari  - 14/8/25(月) 17:59 -

引用なし
パスワード
   環境:Excel2010

はじめまして、マクロ初心者のhimawariと申します。

一覧表の項目名を含むファイルを検索し、
ファイルの内容を参照して、一覧表に反映するマクロを作っています。
マクロ実行の際は、ファイルを格納したフォルダを指定する仕組みです。

現時点では、指定フォルダ直下にファイルが存在する場合は正しく動作します。
今回改修により、指定フォルダのサブフォルダを含めてファイルを検索し、
動作するようにしたいです。

過去ログ等を読み、サブフォルダを含めたファイル検索は
FileSystemObject(FSO)やDir関数の再帰呼び出しを使用することは
理解したのですが、現行の仕組みにどう反映していいか応用ができません。
一覧表ありきの仕組みを想定して、一覧表にないファイルは無視という仕組みとしているためです。
添付するマクロをもとに、アドバイスを頂けたらと思います。
よろしくお願いいたします。

以下、イメージです
[一覧表]
No.1 とちおとめ
No.2 あまおう
No.3 ジョナゴールド
No.4 ふじ

[フォルダ構成]
果物フォルダ
 -いちごフォルダ
  -xxxxx_とちおとめ.xls
  -xxxxx_あまおう.xls
 -りんごフォルダ
  -xxxxx_ジョナゴールド.xls
  -xxxxx_ふじ.xls

[マクロ実行時]
1.一覧表の格納先を指定
2.個別ファイルの格納先を指定
3.実行

具体的には、果物フォルダにファイルがあれば動くマクロを、
いちごフォルダやりんごフォルダにファイルがある場合も動くようにしたいです。
不要そうなソースは削除してますが、情報が必要な場合は連絡ください。


Option Explicit

  '一覧用の変数
  Dim listBook As Workbook      'ワークブック
  Dim listSheet As Worksheet     'ワークシート
  Dim listPath As Variant       '指定されたフォルダパス
  Dim listFolderPath As String    '格納先フォルダ
  Dim listFileName As String     'ファイル名
  Dim listRow As Long         '一覧の行数
  Dim listMaxRow As Long       '一覧の最終行
  Dim listColumn As Long       '実績欄の開始列
  Dim listColumn1 As Long       '開始日列

  '個票用の変数
  Dim caseBook As Workbook      'ワークブック
  Dim caseSheet As Worksheet     'ワークシート
  Dim casePath As Variant       '指定されたフォルダパス
  Dim caseFolderPath As String    '格納先フォルダ
  Dim caseID As String        'フルーツ名
  Dim caseFile As String       'フルーツ名より作成したファイル名
  Dim caseFileName As String     'ファイル名

  Dim buf As String          'ファイル名取得用変数

  'その他もろもろ
  Dim xlAPP As Application

 
  Sub updateList()
  
  listPath = Cells(15, 3).Value
  listFolderPath = listPath & "\"
  listFileName = listFolderPath & "\[一覧ファイル名].xls"
  Set listBook = Application.Workbooks.Open(listFileName)
  Set listSheet = listBook.Worksheets("[シート名]")
  
  '最終行番号の取得
  listMaxRow = Cells(Rows.Count, "B").End(xlUp).Row
  
  '実績列番号の取得
  listSheet.Activate
  listColumn = Cells(1, 1).End(xlToRight).Column
  listColumn1 = listColumn + 2

  '(開始時)
  Application.EnableEvents = False
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual

  
    For listRow = 6 To listMaxRow
      '個票を検索する
      caseID = listSheet.Cells(listRow, 2)
      casePath = Cells(16, 3).Value
      caseFolderPath = casePath & "\"
      caseFile = caseFolderPath & "*" & caseID & "*.xls?"
      caseFileName = Dir(caseFile)
        '存在しない場合
        If caseFileName = "" Then
          GoTo Continue
        '存在する場合
        Else
          Set caseBook = Application.Workbooks.Open(caseFolderPath & caseFileName)
          Set caseSheet = caseBook.Worksheets("[シート名]")
                   
          '反映
          listSheet.Cells(listRow, listColumn1).Value = caseSheet.Cells(7, 33)
                              
          'テストケースを閉じる
          caseBook.Close
          Set caseBook = Nothing
        End If
Continue:
    Next listRow

  listBook.Save
  Set listBook = Nothing

  Application.DisplayAlerts = True
  Application.EnableEvents = True
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic

 End Sub

【76037】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:12 -

引用なし
パスワード
   ▼himawari さん:

>現時点では、指定フォルダ直下にファイルが存在する場合は正しく動作します。
>今回改修により、指定フォルダのサブフォルダを含めてファイルを検索し、
>動作するようにしたいです。

全体はよく見てませんが、
要は

>      caseFile = caseFolderPath & "*" & caseID & "*.xls?"
>      caseFileName = Dir(caseFile)

ここで、サブフォルダも含めたファイルの検索結果が返ってくれば
いいわけですよね?
Dir関数の再帰処理でも FSO でもいいけど、Dirコマンドという手もありますよ。
これなら再帰処理書かなくてサブフォルダ検索が高速処理できます。

【76038】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:34 -

引用なし
パスワード
   Dir関数の代わりに Dirコマンドを使ってサブディレクトリも同時検索する
サンプルです。

'-----------------------------------------------------------
Option Explicit

'// D:\(Data)\temp\subTemp\JoinCSV200.csv を D:\(Data)\ を指定して検索
Sub Example()
  Dim caseFolderPath$: caseFolderPath = "D:\(Data)\"
  Dim caseFilename$

  caseFilename = Dir2(caseFolderPath & "JoinCSV200*.csv")
  MsgBox caseFilename

End Sub

'サブフォルダを含むファイルの検索(最初に見つかったファイルパスを返す)
Private Function Dir2(PathFilename As String) As String
  Dim i As Long
  Dim tmpPath As String
  Dim sCmd As String
  Dim ko As Long
  
  tmpPath = Environ$("Temp") & "\Dir.tmp"  '◆Dirの結果ファイル出力パスファイル名  ←適宜変更
  sCmd = "DIR """ & PathFilename & """ /b /s > """ & tmpPath & """"
        '/b:ファイル名のみ  /s: サブディレクトリも検索
  Debug.Print sCmd
  With CreateObject("WScript.Shell")
    ko = .Run("CMD /C " & sCmd, 7, True) 'Dirコマンド実行
  End With

  If FileLen(tmpPath) < 3 Then Exit Function
  Dim io%
  Dim buf() As Byte
  io = FreeFile()
  Open tmpPath For Binary As io
   ReDim buf(1 To LOF(io))
   Get #io, , buf
  Close io
  Kill tmpPath
  Dir2 = Split(StrConv(buf, vbUnicode), vbCrLf)(0)
End Function

【76039】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:43 -

引用なし
パスワード
   上のサンプルは Dir関数の代わりに、
Dir2という名の Dirコマンドを呼び出すサンプルです。サブディレクトリも
検索するオプションを指定しています。
Dir関数は ファイル名のみ返しますが、
Dir2 自作関数は パス名付きのファイル名を返します。
ワイルドカードを使ったりすると、複数のファイルパスが返ってきますが、
Dir2関数は必ず最初にヒットしたファイルパスだけ返すように組んであります。

【76040】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:48 -

引用なし
パスワード
   なので
>   caseFile = caseFolderPath & "*" & caseID & "*.xls?"
>   caseFileName = Dir(caseFile)
>   '存在しない場合
>   If caseFileName = "" Then
>     GoTo Continue
>   
>   '存在する場合
>   Else
>     Set caseBook = Workbooks.Open(caseFolderPath & caseFileName)

をDir2 に置換すると 以下のようです

>   caseFile = caseFolderPath & "*" & caseID & "*.xls?"
   caseFileName = Dir2(caseFile)
>   '存在しない場合
>   If caseFileName = "" Then
>     GoTo Continue
>   
>   '存在する場合
>   Else
     Set caseBook = Workbooks.Open(caseFileName)

【76041】Re:一覧表に合致するファイルをサブディ...
お礼  himawari  - 14/8/26(火) 12:20 -

引用なし
パスワード
   ▼kanabun さん:

早速ご助言いただき、ありがとうございました。
サンプルとbefore-afterを頂いたことで、
サンプルを動かして処理を確認しながら、
自身のマクロに反映することができました。

cmd実行の部分はまだ理解しきれていないので
これから調べて知識を身に着けようと思います。

また、まだまだ不格好なマクロなので、
高速化を意識して、改修を続けたいと思います。

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

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