• 締切済み

サブホルダー内のエクセルファイルの名前と更新日を

Excel VBAですが、 サブホルダー内のエクセルファイルの名前と更新日を取得し、セルに書き出したい。 サブホルダーは30位あり、各サブホルダーには20以上のエクセルイルがあります。 イメージですが、最初のサブホルダーをA列に2行目にホルダー名、3行目以降はファイル名(A列)、更新日(B列)、1つ空列、次のサブホルダー名(D列の2行目)・・・・と表示していきたい。 要点でいいのですが、お願いします。

みんなの回答

  • SI299792
  • ベストアンサー率48% (715/1478)
回答No.8

 最初は腹が立ちましたが、ここのシステムが判っていなければ仕方ありません。私も最初はここのシステムが判らすのお礼をしませんでした。  私は、回答No.4にお礼を書いて下さい。と言いたかったのです。  ここは、補足やお礼を書いた相手に、メールが届きます。回答No.4にお礼コメントを書かない限り、HohoPapaさんに解決したというメールはは届きません。メールが届かなくても、ここを見れば解決したことが判るので、既に知っている可能性も高いですが、HohoPapaさんの所にも解決したというメールが届けるべきと思います。  プロフィールを拝見しました。石川県だそうで、実は私も石川県です。案外近くにいたりして。

  • SI299792
  • ベストアンサー率48% (715/1478)
回答No.7

HohoPapaさんの所にも、お礼を書いて下さい。 そうすれば、HohoPapaさんにお礼メールが届きます。 それが礼儀だと思います。

  • SI299792
  • ベストアンサー率48% (715/1478)
回答No.6

 実は私も、MS-BASICをやっていました。どうしてもその癖が抜けせん。例えばWhile 、本当はDo Whileを使うべきなのですが。私も、HohoPapaさんが使っているような、新しい機能はわかりません。 >Declare Sub Sleep Lib "kernel32.dll" ( _ > ByVal vKey As Long) Sleep という外部サブルーチンを定義しています。外部サブルーチンなので、定義しないと使えません。これはミリ秒単位でプログラムを止めるものです。Sleep 2000で2秒止まります。 > Const PathName = Dim と同じ、変数の宣言です。プログラム中で変更ができません。 > Shell "Cmd /C Dir *.xls* /S > Dir.txt" Shell は、コマンドプロンプトを使ってファイルを呼び出します。 Command.com を呼び出して実行しています。 > [A2:XFD1048576].ClearContents セル[A2:XFD1048576] の中身を消します。1行目にタイトルがあるかもしれないと思い、2行目以降を消すようにしました。失敗して再実行することを考えて付けました。無くてもいいです。 VBA Sleep VBA Const のようにググれば、詳しい説明が出てきます。 ここから先はMS-BASICにもあります。 > Open "Dir.txt" For Input As #1 ファイルを開きます。 > While Not EOF(1) While  条件が成立している間続けます。 EOF(1) 最後のファイルを読んだらTrueになります > Line Input #1, FileName ファイを読みます。"," で区切らす1行読みます。 > Kill "Dir.txt" ファイルを消去します。  プログラムとしては、HohoPapaさんの方が優れていますが、興味がおありのようなので、参考までに。

masumasu_K_F
質問者

お礼

SI299792 さん ありがとうございます。70歳の小生では、MS-BASICの延長でしか、なかなか理解が難しく、SI299792 さんのプログラムは見た目は昔よくやったテキスト(バッチで書き込んだテキスト DIR >)を読み込む処理は、かえって すごく新鮮に感じました。どうもありがとうございました。 それと HohoPapa さんへのお礼ですが、私がMYWAVEのシステム?をよく理解していなくて、ごめんなさい。 投稿日時 - 2018-03-03 15:54:44の「補足コメント」でお二人にお礼を伝えたと思っていました。 それと 問題が解決したので、その後私の質問について 目を通すこと疎かにしておりました。誠に失礼しました。 今後とも宜しくお願いします。

  • SI299792
  • ベストアンサー率48% (715/1478)
回答No.5

 HohoPapaさんのプログラムでうまくいったのなら、私の出る幕ではありませんが、補足があったので、参考までに。 "Dir.txt" はChdir で指定した所にできます。 PathNameで指定した所にできるはずです。  もし、"Dir.txt" ができていなければ、エラーが出るはずです。動かなかった原因として可能性は2つあります。 (1)xls ファイルが無い。エクセルファイルと聞いたので、"*.xls*"にしましたが、HohoPapaさんのプログラムは"*.*" で全部が対象になっています。"*.*" で試して下さい。 (2)OSの差で、Dir の形式が違っている。例えば、フォルダの表示が「のディレクトリ」ではない、5桁目が"/" でないなど。  Kill "Dir.txt"を外せば、"Dir.txt" が残るので、見て下さい。  できれば、結果を書いていただけないでしょうか。もし、Dir で出力される内容が、OSによって違うのであれば、この手段は使えません。今後の参考にさせて下さい。

masumasu_K_F
質問者

お礼

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

masumasu_K_F
質問者

補足

SI299792さん、HohoPapaさん ありがとうございました。 色々とお騒がせしました。大変なご迷惑をお掛けしてしまいました。 私が練習用に作成したホルダーとサブホルダー内にファイルを作成したはずが複写しているうちに、なぜかホルダーしかコピーされていなくて、 SI299792さん、HohoPapaさんのプログラムが何回やってもファイルがありませんと出てしまい、思い込んでいた(ファイルはあると)のでプログラムのバグ、ミスと早とちりしてしまいました。 本当にごめんなさい。 私がイメージした処理は出来ていました。お二人のプログラムはやり方は違いますが、私の思いどおりに処理が出来ております。 どうも有難うございました。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.4

>イメージですが、 >最初のサブホルダーをA列に2行目にホルダー名、 >3行目以降はファイル名(A列)、更新日(B列)、 >1つ空列、次のサブホルダー名(D列の2行目)・・・・と表示していきたい このレイアウトで出力されていませんでしょうか? また、ファイルごとの最終更新日時を出力しているハズなんですが、 どこがどのように期待と異なりますか?

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

>Dim fso As FileSystemObject 'ユーザー定義型は定義されていません ありゃ、ごめんなさい。 参照設定が必要です。 https://www.tipsfound.com/vba/18001 ↑の記事後半にその説明があります。 この設定を行ってください。

masumasu_K_F
質問者

補足

HohoPapaさん 有難うございます。ms-basic からの老人にはやや理解しずらい領域に入りましたが、「スクリプト ランタイム」 を利用できるように「OK」したところ、結果が出ました。本当にありがとうございました。 しかし、図々しいお願になりますが、本当に得たい結果は そのそれぞれのホルダー内にあるエクセルファイルの名前と最終更新日なのです。サブホルダー内には約20件ほどのファイルがあります。それをホルダー名の下に順次表示し、次々と右にホルダを処理していく イメージです。 少し サジェスチョンを頂ければありがたいのですが・・・ 宜しくお願いします。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

>サブホルダーは30位あり、各サブホルダーには20以上のエクセルイルがあります。 もし、 このサブフォルダーの下階層に更にフォルダーがあるような 多層の構造の場合は回帰処理が必要です。 この回帰処理を使ったコードを示します。 (多層じゃなくても使えます) もし、親フォルダーもシートに出力したい場合は 注1の行をコメントアウトしてください。 Option Explicit Dim cnt As Long Dim fso As FileSystemObject Dim colnum As Integer Const TargetDir = "D:\wk"  'これが対象の親フォルダー Sub Main()  cnt = 0  colnum = 1  Set fso = New FileSystemObject  Call MySub(TargetDir) End Sub Sub MySub(Path As String)  Dim buf As String, f As Object  Dim MyFile As File     If Path <> TargetDir Then           '注1      cnt = 2      Cells(cnt, colnum) = Path   buf = Dir(Path & "\*.*")   Do While buf <> ""    cnt = cnt + 1    Cells(cnt, colnum) = buf    Set MyFile = fso.GetFile(Path & "\" & buf)    Cells(cnt, colnum + 1) = MyFile.DateLastModified    buf = Dir()   Loop   colnum = colnum + 3    End If                    '注1     With CreateObject("Scripting.FileSystemObject")   For Each f In .GetFolder(Path).SubFolders    Call MySub(f.Path)   Next f  End With End Sub

masumasu_K_F
質問者

補足

HohoPapa さん 回答ありがとうございます。 が 一発でエラーメッセジがでました。どのように解決するのでしょうか? 大したエラーではないと思いますが、分かりません。 Option Explicit Dim cnt As Long >Dim fso As FileSystemObject 'ユーザー定義型は定義されていません Dim colnum As Integer Const TargetDir = "D:\家のノート\2017\情報処理_山本" 'これが対象の親フォルダー Dim fso As FileSystemObjectの定義が「'ユーザー定義型は定義されていません」というエラーになりますが・・・

  • SI299792
  • ベストアンサー率48% (715/1478)
回答No.1

PathNameは変更して下さい。 ' Option Explicit ' 一時停止 Declare Sub Sleep Lib "kernel32.dll" ( _   ByVal vKey As Long) ' Sub Macro1() '   Const PathName = "C:\Users\MA\Desktop\My Documents"   Dim FileName As String   Dim Row As Long   Dim Col As Integer   Dim PLen As Integer '   ChDrive PathName   ChDir PathName   Close   Shell "Cmd /C Dir *.xls* /S > Dir.txt"   Sleep 2000   PLen = Len(PathName)   [A2:XFD1048576].ClearContents   Col = -2 '   Open "Dir.txt" For Input As #1   While Not EOF(1)     DoEvents     Line Input #1, FileName     If FileName Like "*のディレクトリ" Then       Col = Col + 3       Row = Len(FileName) - PLen - 10       Row = WorksheetFunction.Max(Row, 0)       Cells(2, Col) = Mid(FileName, PLen + 3, Row)       Row = 2     ElseIf Mid(FileName, 5, 1) = "/" Then       Row = Row + 1       Cells(Row, Col) = Mid(FileName, 37)       Cells(Row, Col + 1) = Left(FileName, 10)     End If   Wend   Close   Kill "Dir.txt" End Sub

masumasu_K_F
質問者

補足

SI299792 さん 早速の回答をありがとうございます。Webで色々と検索していましたが、ある程度のところまでは行くのですが・・・ということで、 「OK WAVE」でお願いした次第です。 エラー無くおわっているようですが どこが悪いのか?まったく動きがありません。 以下のステートメント(コード)が理解できません。少し教えてもらえませんか? >Declare Sub Sleep Lib "kernel32.dll" ( _ > ByVal vKey As Long) > Const PathName = "D:\家のノート\2017\情報処理" > Shell "Cmd /C Dir *.xls* /S > Dir.txt" > [A2:XFD1048576].ClearContents > Open "Dir.txt" For Input As #1 > While Not EOF(1) > Line Input #1, FileName > Kill "Dir.txt"     最後のOpen以降は過去に(50年以上前かな)MS-BASICをやっていた時に使っていたので、理解できますが     "Dir.txt"はどこに 作成されるのですか? DOSレベルですね 以上 教えてください。お願いします。 「これは教えられない」という事であれば、それでも結構ですが 他に利用することは全く考えていません。私の年齢は70歳です。単にVBAを楽しんでいるだけです。

関連するQ&A

  • 【エクセル】ファイルの更新日を表示

    エクセルSheet1にエクセルファイルをいくつかハイパーリンク してあり、それらのファイルのプロパティをみたときの更新日を 隣のセルに表示させたいんですけど、どうすればよいでしょうか? たとえばA列1~5行目までにハイパーリンクでエクセルのファイルを 表示させていて、B列に隣のA列に貼ってあるリンク先のエクセルファイル の更新日を表示させたいんですが、可能でしょうか? VBAはほとんどわからないので、出来ればエクセル関数で出来ると いいのですが、VBAのほうが良いのであれば教えていただいたVBAの 式を勉強しようと思います。よろしくお願いします。 使用しているエクセルのバージョンは2003です。

  • excelVBA でA+B列をファイル書き出し

    excel2003の VBA で、開いているシートのA列(項目行)とB列(データ)を抜粋してB列の1行目のセルに入力されているデータをファイル名として新しいEXCELファイル(B列の1行目のセルに入力されているデータ.xls)として書き出したいのです。また、B列以降も、A列+C列で1ファイル、A列+D列で1ファイル・・・のように列にデータが記載されているまでファイルとして書き出したいのです。 このような書き出しVBAを教えて下さい。宜しくお願いします。

  • 複数のcsvファイルを1つのEXCELファイルにマージするVBAを教えてください

    csvファイル数は700~1000個程度でひとつのフォルダに格納されています。 このファイルをEXCEL形式で開くと、1行目にフィールド名(A~Z列で固定)、2行目以降にデータが入っています。行数はファイルにより1~100行程度で変動します。 このファイルを1つのエクセルファイルの同一シートに結合(マージ)するVBAがほしいです。 ここで、(できればですが)EXCELにマージするにあたり、1行目のみフィールドの値、2行目以降にそれぞれのcsvの2行目以降データの値を入れていくようにしたいです。つまり、フィールド名の行が何行も出てくるのを避けたいです。 申し訳ございませんが、ご指導いただけたら幸いです。よろしくお願いします。

  • エクセル表→セル内データ更新→同じ行の最終更新日欄の日付を自動更新 し

    エクセル表→セル内データ更新→同じ行の最終更新日欄の日付を自動更新 したい。 エクセルで作成した表で、表の中のデータを更新した場合に、その行の最後の列の「最終更新日」の日付を自動的に更新する方法を探しています。 具体的には、エクセルで1行目のA列に「データのキーワード」、B列に「データのハイパーリンク」、C列に「データ記入者」、D列に「最終更新日」の項目を作成し、2行目以降に作成した各データをA~Cの項目に従って記入してデータ一覧表を作成しています。 その際に、A,C列の項目を更新した時と、B列項目のリンクを開いた時に、同じ行D列の最終更新日の日付を自動で入力及び更新する方法はないでしょうか? 恐らくマクロを組む必要があると思うのですが、全くの素人ですので是非教えて頂けないでしょうか? すみませんが、宜しくお願い致します。

  • エクセル セルデーター変更の自動更新日入力

    過去に質問がありましたが分らないので教えてください。 私の場合は、D列にのセルが変更されるとA列に更新日が自動で入力されるようにしたいのですが、恐れ入りますがお教えください。 因みに行は500行あります。 No.788307 質問:エクセルについて詳しい人教えてください。 質問者:yukkokun 行ごとで処理をしています。その行のデータの変更があった場合、その行のみ更新日を変更するようにしたいのですが、どうすればいいのですか。例えばA1~C1のいづれかを変更した場合、D1(更新日のセル)が自動的に変わるようにしたいのです。どなたかわかりやすく教えてください。関数等は初心者です。 )

  • エクセルファイル 更新日参照の仕方

    エクセル2003を使っています。エクセルファイルのプロパティを見たと きのファイルの更新日を参照して、セルに表示させたいのですが、できるのでしょうか? ブックAのシート1にブックB,C,D,Fのファイルをハイパーリンクでつなげています。 そこで、ブックB,C,D,Fの更新日をブックAのハイパーリンクを張った隣のセルにでも最終更新日として表示させたいと思っています。 エクセルについての知識はあまりないので、できればわかりやすく教ええもらえると助かります。よろしくお願いします。 足りない情報があったら補足いたします。

  • 多数のファイルをExcelに取り込むには?

    こんにちは。 あるフォルダに入っている約1000枚の同形式ファイルを、Excelに1ファイルを1行づつで取り込む作業をまとめて出来ないしょうか? 一枚目のファイルのファイル名(3桁の数字)をExcelの1行目のAセルに、ファイル内に書いてある一行目の数字をBセルに、二行目の数字をCセルに。 そして二枚目のファイルをExcelの2行目に同じく・・という様に入れたいんです。 Excelのメニューの「テキストファイルの取り込み」だと、同じ作業を千回近く繰返さなきゃいけないんですよね。 ファイルはテキストタイプで、中身はすべて半角英数です。 文字は違いますがどのファイルも同じ形式、同じ字数で32行入ってます。 こういうのってVBAの分野になるんでしょうか? 使用ソフト オフィス2000            

  • Excel VBA

    Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。

  • エクセルVBA テキストに出力、名前を付けて保存

    エクセルVBA テキストに出力、名前を付けて保存    A  B   C   D 1  aa  bb  cc  =A1&B1&C1 2  dd  ee  ff  =A2&B2&C2 3  gg  hh  ii  =A3&B3&C3 上記エクセルのD列の内容(セルA1~C3が連続したもの)を1行毎にテキストに出力し、 B列の内容をファイル名にしてテキストファイルを多量に自動生成したいのです。 上記エクセルのように3行なら下記の3つのファイルが生成されるといったVBAがほしいのです。 ファイル名がbb.txtで、テキストの内容はaabbcc。 ファイル名がee.txtで、テキストの内容はddeeff。 ファイル名がhh.txtで、テキストの内容はgghhii。 実際は数千行あるので、数千ファイルを一気に生成させたいのです。 どうぞよろしくお願いいたします。

  • ファイルの更新日

    エクセルのファイルで、前回、ファイルを書き換えた日を セル内に表示させたいのです。 右クリックから、プロパティをみれば、前回、そのファイルをいつ更新したのかわかりますが、 同じように、例えば、シート1のA1に更新した日を載せたいのです。 そのファイルは、ネットワーク内の共有ファイルにあり、複数人が、書き換えの作業をしています。 その為、ファイルを開いた際に、前回はいつそのファイルが更新されたのか、必ずチェックしてもらう為に、そんなことができればと思いました。 お分かりの方がいらっしゃいましたら、教えてください。