- ベストアンサー
ファイル名をエクセルにリスト化するマクロの応用
- フォルダ内の名前や作成日等をエクセルにリスト化するマクロの応用方法を教えてください。
- エクセルのA列に複数個のフォルダのパスを入力し、それぞれのフォルダ内の情報を別シートに一気にリスト化したいです。
- プログラミングに関する知識はほとんどありません。具体的な入力方法を教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
myRangeです。 3時間ほど格闘したということですので やる気があるとみて、回答させていただきませう。 先ず、注意点(確認事項)あり。 ------------------------------------- >Dセルにシリアル番号の項目を追加し とありますが、回答1のお礼の再質問には >A列:ディレクトリー名 >B列:シリアル番号 >C列:ファイルリストが作成されているか否か このようにB列が"シリアル番号"になってますよ!? 細かいことを、、、と、思うかもしれませんが、 プログラムというのは仕様に一貫性がないと書けるものではありません。 ま、自分でコードを修正加筆できれば別ですが。。 ●本当にD列に追加した値をシート名にしていいんですね? 今回もコピペすること! '-------------------------------------------------------- Sub MakeFileList() Dim R As Long Dim NewSheet As Worksheet For R = 1 To Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row If Sheets("Sheet1").Cells(R, "B") <> "" And _ Sheets("Sheet1").Cells(R, "C") <> "○" Then If Dir(Sheets("Sheet1").Cells(R, "A").Value, vbDirectory) <> "" Then On Error Resume Next Set NewSheet = Sheets(Sheets("Sheet1").Cells(R, "D").Value) If Err.Number = 0 Then NewSheet.Cells.Clear Else Set NewSheet = Sheets.Add(after:=Sheets(Sheets.Count)) NewSheet.Name = Sheets("Sheet1").Cells(R, "D").Value End If On Error GoTo 0 Call FileList(NewSheet, Sheets("Sheet1").Cells(R, "A").Value, 0) NewSheet.Range("A1:D1") = Array("No", "作成日", "更新日", "ファイル名") NewSheet.Columns("A:D").AutoFit Sheets("Sheet1").Cells(R, "C").Value = "○" Else Sheets("Sheet1").Cells(R, "C").Value = "フォルダエラー" End If End If Next R MsgBox "終了しました" End Sub '--------------------------------------------------------- ●回答しながら感じたことを一言● 質問者には今回のコードはちょと難しいのではと思えます。 もしこれがVBAの勉強ということなら このような再起処理を使った小難しい例題ではなく ふつうの処理から勉強すべきだと考えます。 なぜ? このような処理をしようと思ったのでせうか? 以上です。
その他の回答 (6)
- myRange
- ベストアンサー率71% (339/472)
続けて、myRangeです。 言い忘れあり。 ●リスト作成 > フォルダー更新 > 再リスト作成 この場合、既に作成されたシートを削除すると シートの順番(左からの順番)が変わってしまうので 順番が変わらないようにするために、 回答では、シートを削除しないで、同名シートに上書きするようにしてあります。 以上です。
- myRange
- ベストアンサー率71% (339/472)
myRangeです。ちょと遅くなりましたが。。。 (1) B1=空白 → 何もしない (2) B1=値あり → C1=○_ → 何もしない (3) B1=値あり → C1=空白 → リスト作成 → C1に○をセット 上記をB列最終データまで繰り返す。 ●転記ミスがないように必ずコピペすること!! '--------------------------------------------------------- Sub MakeFileList() Dim R As Long Dim NewSheet As Worksheet For R = 1 To Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row If Sheets("Sheet1").Cells(R, "B") <> "" And _ Sheets("Sheet1").Cells(R, "C") <> "○" Then If Dir(Sheets("Sheet1").Cells(R, "A").Value, vbDirectory) <> "" Then Set NewSheet = Sheets.Add(after:=Sheets(Sheets.Count)) Call FileList(NewSheet, Sheets("Sheet1").Cells(R, "A").Value, 0) NewSheet.Range("A1:D1").Value = Array("No", "作成日", "更新日", "ファイル名") NewSheet.Columns("A:D").AutoFit Sheets("Sheet1").Cells(R, "C").Value = "○" Else Sheets("Sheet1").Cells(R, "C").Value = "フォルダエラー" End If End If Next R MsgBox "終了しました" End Sub '--------------------------------------------------------- Function FileList(NewSheet As Worksheet, trgDir As String, fCnt As Long) Dim objFs As Object Dim objDir As Object Dim objFile As Object Set objFs = CreateObject("Scripting.FileSystemObject") Set objDir = objFs.Getfolder(trgDir) Set objFile = objDir.Files With NewSheet For Each objFile In objDir.Files fCnt = fCnt + 1 .Cells(fCnt, 1).Offset(1, 0) = fCnt .Cells(fCnt, 2).Offset(1, 0) = objFile.DateCreated .Cells(fCnt, 3).Offset(1, 0) = objFile.DateLastModified .Cells(fCnt, 4).Offset(1, 0) = objFile.Path Next objFile End With For Each objDir In objDir.SubFolders Call FileList(NewSheet, objDir.Path, fCnt) Next objDir End Function '------------------------------------------- ●フォルダーがNot Foundの場合には、シートは増やさずに、 C列に”フォルダエラー"と表示するようにした。 "フォルダエラー"と表示された場合は A列に正しいフォルダー名を入れ再処理のこと ●B列ありで、A列空白、はないということなのでA列空白チェックは省略 もし、その条件がある場合は自分でやってみること ●フォルダーもファイルもNormal(普通のもの)とする ▲▲少しずつでもいいので自分でも勉強すること。。(^^;;; 以上です。
お礼
myRangeさん、思い描いた通りの結果が得られました。 ありがとうございました。 何度もすいませんが、 また問題が発生してしまいました… Dセルにシリアル番号の項目を追加し、 新しく作られるシート名がシリアル番号と同じになるように、 NewSheet.Name = Sheets("Sheet1").Cells(R, "D") という命令を追記しました。 ネットで調べて、正常に動くようになるまで 3時間もかかりましたが…汗 やっと正常に出力されるようになりました。 ここからが問題なのですが、 リストを作成した後に、 フォルダを更新し、 また新たにリストを作成したいときに、 ○を消して再度マクロを実行させると、 同じ名前のシートがあるため、作成されません。 事前にDセルのシリアル名と同じシートがあったら削除をして 新たに作成を始めるようにすることは 可能でしょうか。 いつもお疲れのところ 大変恐縮ですが、 教えてくださいお願いします。
- ichhabehunger
- ベストアンサー率55% (27/49)
言いたかないがここで勉強したことは何の役にも立ってないの? ↓ http://qanda.rakuten.ne.jp/qa6108578.html そのものずばりの解答だけを求めていてもしかたないですよ。 質問でなくコード作成依頼になってます。
- myRange
- ベストアンサー率71% (339/472)
またまた、myRangeです。 乗りかかった船ですから今回までは面倒みませう。 が、自分でもちゃんと●勉強する●、という条件つきですが。。(^^;;; (1) B1=空白 → 何もしない (2) B1=値あり → C1=○_ → 何もしない (3) B1=値あり → C1=空白 → リスト作成 → C1に○をセット 上記をB列最終データまで繰り返す、ということでいいですね? 今から帰宅しますので回答は自宅から21時位(遅くとも今夜中)までにはアップしておきます。 以上です。
お礼
その通りです。 本当にすいません… よろしくお願いします。
- imogasi
- ベストアンサー率27% (4737/17069)
近日にも同じ質問したのでは。回答を締め切ってないらしいが、一言お礼や判らないならコメントぐらいすべきだ。 ヒントなどもらっても類推できないようでは、何度質問してみても仕方がないと思う。 ーー A列にはフォルダ名だけ入力されるとして Sub test01() d = Worksheets("Sheet1").Range("A65536").End(xlUp).Row '最下行の行番号 MsgBox d For i = 1 To d fdn=Worksheets("Sheet1").Cells(i, "A") '処理 MsgBox fdn Next i End Sub これを事件してご覧。各行のフォルダ名が表示されるはず。 この'処理の段階でフォルダ名は文字列fnとして捉えられている。 そこでこのフォルダ名fdnを上記の関数(Function()のfileList)の引数として、あたえて実行させる 。 コードは fileList(fdn) この中にセルへのセットのコードが入っているのでそのまま使える。 fCntは書き出し用の行ポインターなので、続けて使っていけば良い。 シートをフォルダごとに分けるとかすると複雑になるからこのぐらいで我慢して。 上記はヒントなんでやって見るとエラーが出たりするかもしれない。 その場合はこの質問の中で行ってください。
- myRange
- ベストアンサー率71% (339/472)
あせっているのは分からんでもないですが、 同じ質問をするなら、前のは締めて再質問するのがマナーです。(^^;;; http://okwave.jp/qa/q6112995.html と、まあ、それは置いといて、 前の質問に回答してますのでお試しあれ。 以上です。
お礼
以後気をつけます。すいませんでした… ついでにといっては失礼ですが、 もう一つ教えてください(><) 今回、作成していただいた ファイルリスト作成マクロを使って、 下に示す条件のもと自動処理をしたいと思っています。 A B C 1 ディ α ○ 2 ディ β 3 A列:ディレクトリー名 B列:シリアル番号 C列:ファイルリストが作成されているか否か 処理が完了していれば○、それ以外は空欄 1.エクセルの表で、B1セルが空白か否か 2.B1セルが 空白の場合→終了 シリアル番号が記入してある場合→C1セルが空白か否か と同様の処理を) 空白の場合→ファイルリスト作成マクロ起動 →B2セルへ(再び1と同様の処理を) 4.Bセルが空欄になるまで繰り返す ※Bセル(シリアル番号)が入力されているときは、 Aセル(ディレクトリ名)も記入されています。 説明がへたくそですいません。 もしわかりましたら 教えてください。よろしくお願いします。
お礼
何度もありがとうございました。 普段はプログラミングに触れる機会がなく、 大学時に少し基礎をかじった程度で 突然フォルダの管理が必要になったため、 質問させていただきました。 最後まで丁寧に 教えていただき、とても助かりました。 ほんとうにありがとうございました。