VBAでフォルダ内のPDFファイルの一覧表を作成する方法

このQ&Aのポイント
  • VBAを使用して、指定したフォルダ内のPDFファイルの一覧表を作成する方法について質問があります。
  • 以前の質問で提供されたVBAを使用して、PDFファイルの一覧表を作成しましたが、閲覧者が検索ボタンをクリックしたことにより結果が減少してしまいました。今後同様の事態を防ぐために、パスワード要求または出力先ファイルの変更のいずれかの対応策をお願いしたいです。
  • 調査しましたが、自分で追加することができずに困っています。
回答を見る
  • ベストアンサー

VBAでフォルダ内のPDFファイルの一覧表(再)

この質問は下記のご回答いただいたVBAに関する追加の質問ですのでご了承下さい。 https://okwave.jp/qa/q10124583.html ご回答で出来た一覧表を紹介して、先ほど一覧表を開けて見たら件数が激減。 原因は、閲覧者が試しに検索ボタンをクリックして検索期間が変わってました。(当方は2000/1/1以降の結果を保存し、ファイルのパスを回覧しました) これは今後も想定される事態なので解決策として下記のどちらか簡単な方での対応をお願いしたいのです。 最後の最後までおんぶに抱っこでいつもながら誠に申し訳なく・・・ 1.VBAの実行ボタンをクリックするとパスワードの要求が出る。 パスはシート上の指定のセルに入力。 2.出力シートを別のエクセルのフルパスのファイルに変更する。 検索開始時点では出力ファイルは開いていない前提。 現在はSheet1に検索条件とVBAの実行ボタンを配置して、クリックするとSheet2に結果が出力されるようになっています。 一応NETで調べてみましたが当方の実力(単に追加)ではうまくいかず。

質問者が選んだベストアンサー

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

>シート毎に部署ごとのシートを作成してフルパスと出力シート名を指定してすれば良いと考えた そのようにしてみました。 >パスの設定は外して頂きたく。 パスワードの入力を求めないようにしました。 >シートモジュールにコピペしてもエラーとなってしまいました シートごとにシートモジュールに配置すると 同じコードが複数個所に書き込まれることとなり、好ましくありません。 通常は、標準モジュールに配置した状態で 複数シートに対応するコードにします。 都合、後記コードは標準モジュールに配置してください。 おそらく、シートにボタンを配置し、 そのボタンを押すことでマクロが動くようにしているものと思います。 ボタンがフォームコントロールなら、添付画像のようにマクロを紐づけてください。 ボタンがActiveXコントロールなら それぞれのシートモジュールに Private Sub CommandButton1_Click()  sample End Sub といったコードを配置してください。 Option Explicit '以下を参照設定 'Microsoft Scripting Runtime Dim BaseDir As String '親フォルダー名 Dim BorderDay As Date '基準日 Dim RowCount As Long  '行カウンター Dim PutBook As Workbook '出力先ブック Dim PutSheet As Worksheet '出力先シート Sub sample()  Dim GetPW As String  'マクロ起動用パスワード  Dim rc As Integer   'MSGBoxの戻り値  With ActiveSheet   If InStr(.Cells(3, 1).Value, "\") = 0 Then    Set PutBook = Workbooks.Open(ThisWorkbook.path & "\" & .Cells(3, 1).Value)   Else    Set PutBook = Workbooks.Open(.Cells(3, 1).Value)   End If   Set PutSheet = PutBook.Sheets(.Cells(4, 1).Value)   BaseDir = .Cells(1, 1).Value   BorderDay = .Cells(2, 1).Value  End With  ' 出力先シートをクリアー  With PutSheet   Range(.Rows(6), .Rows(Rows.Count)).ClearContents  End With  RowCount = 5  '6行目から出力  getFilesRecursive (BaseDir)  rc = MsgBox("リストアップが終了したので" & vbCrLf & _   PutBook.path & "\" & PutBook.Name & vbCrLf & _   "を保存して閉じます。", vbOKCancel)  If rc = vbOK Then   PutBook.Close SaveChanges:=True  Else   PutBook.Close SaveChanges:=False  End If End Sub 'フォルダー、ファイルを総当たり Sub getFilesRecursive(path As String)  Dim FSO As FileSystemObject: Set FSO = New FileSystemObject  Dim objFolder As folder  Dim objFile As file  'フォルダーを個々に取得  For Each objFolder In FSO.GetFolder(path).SubFolders   getFilesRecursive objFolder.path  Next  'ファイルを個々に取得  For Each objFile In FSO.GetFolder(path).Files   If UCase(FSO.GetExtensionName(objFile.path)) = "PDF" Then    execute objFile   End If  Next End Sub '取得したファイルをリストアップ Sub execute(f As file)  Dim MidDir As String  Dim FName As String  '作成日時が指定日より過去のファイルは無視する  If f.DateCreated < BorderDay Then Exit Sub  RowCount = RowCount + 1  With PutSheet   '出力先シート   Range(.Cells(RowCount, 1), .Cells(RowCount, 3)).NumberFormatLocal = "@"   .Cells(RowCount, 4).NumberFormatLocal = "yyyy/m/d h:mm;@"   .Cells(RowCount, 1).Value = BaseDir & "\"   MidDir = Mid(f.path, Len(BaseDir) + 2, InStrRev(f.path, "\") - Len(BaseDir) - 1)   .Cells(RowCount, 2).Value = MidDir   FName = Mid(f.path, InStrRev(f.path, "\") + 1, 256)   .Cells(RowCount, 3).Value = FName   .Cells(RowCount, 4).Value = f.DateCreated   .Hyperlinks.Add Anchor:=.Cells(RowCount, 3), _     Address:=f.path, TextToDisplay:=FName  End With End Sub

akira0723
質問者

お礼

今回も我が儘放題、何度もお手数をお掛けしてしまいました。 連休中にご回答いただいて検証できずに気になっていて、これが一発で動かなかったら・・・と思うと、 Bookを必要数作ればそれでもよかったのでは、と若干の後悔を感じながらの 今朝の一発完動でした。 自分で何もしていないのに強い達成感を感じています。 今回もお手数をお掛けしましたが 本当にありがとうございました。

akira0723
質問者

補足

おはようございます。 お礼が遅くなり本当に申し訳ありません。 連休中は3人の子供たちの孫のところへ行ったり来たりで頼んでおいて申し訳ありませんでした。 さて、朝一の一で何度もご回答を読んで、デモBookをデスクトップに配置して、検索条件シートにNETで調べてフォームコントールでボタンを作成し、イザと思ったらセル番地の変更を忘れていてエラー。 気を取り直して・・・ お見事!一発回答!!!!

その他の回答 (3)

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

>下記のどちらか簡単な方での対応 この記述を見落とし、双方とも組み込んでいます。 どちらか一方にしたい場合は選択してください。直してポストします。

akira0723
質問者

お礼

驚くべきことに、まさかの1発完全回答でした! 当方のレベルに合わせた解説付きのおかげです。 私の場合NETで検索したVBAさえ一発で動くことはないのでこれに一番ビックリです。 パスの設定はあって困ることは無いのでこれ以上のお手数は全く不要です。 後しばらく 補足枠を残して検証してみてから締め切らせて頂きますので少々お待ちください。

akira0723
質問者

補足

HohoPapaさん 今日は連休なのでこれをやりに出社して朝から一日これをいじっているのですが、大幅な改定のお願いです。 このVBAのコードをシートモジュールにしていただきたいのです。 試しにシートモジュールにコピペしてみたのですが「コンパイルエラー」でやはりだめでした。 背景は私の工場では対象情報が部署に寄らずに工場の専用(親)フォルダに集約されているのですが、別工場では生産部署ごとに(親)フォルダを作成しています。 この場合「検索用Book」のシート毎に部署ごとのシートを作成してフルパスと出力シート名を指定してすれば良いと考えたのですが、ご回答のコードを単にシートモジュールにコピペしてもエラーとなってしまいました。 間に合うなら何卒最後?のお願いです。 あまりにしつこいので無視でも全くOKです。 この追加要求を慌てて書きながら、部署ごとに検索Bookを作れば良いだけと気付きましたが、1つのBookの方が完成度(スマート)が高い。 私が言うのもなんですが・・・ 先ずは投稿します。

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

こんな感じでしょうか。 なお、 >検索開始時点では出力ファイルは開いていない前提。 予め開いておいても機能します。 Option Explicit '以下を参照設定 'Microsoft Scripting Runtime Dim BaseDir As String '親フォルダー名 Dim BorderDay As Date '基準日 Dim RowCount As Long  '行カウンター Dim PutBook As Workbook '出力先ブック Dim PutSheet As Worksheet '出力先シート Sub sample()  Dim GetPW As String  'マクロ起動用パスワード  Dim rc As Integer   'MSGBoxの戻り値    With ThisWorkbook.Sheets("Sheet2")      GetPW = InputBox("マクロ起動用のパスワードを入力してください")   If GetPW <> .Cells(5, 1).Value Then    MsgBox "パスワードが違います"    Exit Sub   End If     If InStr(.Cells(3, 1).Value, "\") = 0 Then    Set PutBook = Workbooks.Open(ThisWorkbook.path & "\" & .Cells(3, 1).Value)   Else    Set PutBook = Workbooks.Open(.Cells(3, 1).Value)   End If      Set PutSheet = PutBook.Sheets(.Cells(4, 1).Value)   BaseDir = .Cells(1, 1).Value   BorderDay = .Cells(2, 1).Value    End With  ' 出力先シートをクリアー  With PutSheet   Range(.Rows(6), .Rows(Rows.Count)).ClearContents  End With  RowCount = 5  '6行目から出力  getFilesRecursive (BaseDir)  rc = MsgBox("リストアップが終了したので" & vbCrLf & _   PutBook.path & "\" & PutBook.Name & vbCrLf & _   "を保存して閉じます。", vbOKCancel)  If rc = vbOK Then   PutBook.Close SaveChanges:=True  Else   PutBook.Close SaveChanges:=False  End If   End Sub 'フォルダー、ファイルを総当たり Sub getFilesRecursive(path As String)  Dim FSO As FileSystemObject: Set FSO = New FileSystemObject  Dim objFolder As folder  Dim objFile As file  'フォルダーを個々に取得  For Each objFolder In FSO.GetFolder(path).SubFolders   getFilesRecursive objFolder.path  Next  'ファイルを個々に取得  For Each objFile In FSO.GetFolder(path).Files   If UCase(FSO.GetExtensionName(objFile.path)) = "PDF" Then    execute objFile   End If  Next End Sub '取得したファイルをリストアップ Sub execute(f As file)    Dim MidDir As String  Dim FName As String  '作成日時が指定日より過去のファイルは無視する  If f.DateCreated < BorderDay Then Exit Sub  RowCount = RowCount + 1  With PutSheet   '出力先シート   Range(.Cells(RowCount, 1), .Cells(RowCount, 3)).NumberFormatLocal = "@"   .Cells(RowCount, 4).NumberFormatLocal = "yyyy/m/d h:mm;@"      .Cells(RowCount, 1).Value = BaseDir & "\"   MidDir = Mid(f.path, Len(BaseDir) + 2, InStrRev(f.path, "\") - Len(BaseDir) - 1)   .Cells(RowCount, 2).Value = MidDir   FName = Mid(f.path, InStrRev(f.path, "\") + 1, 256)   .Cells(RowCount, 3).Value = FName   .Cells(RowCount, 4).Value = f.DateCreated   .Hyperlinks.Add Anchor:=.Cells(RowCount, 3), _     Address:=f.path, TextToDisplay:=FName  End With End Sub

akira0723
質問者

補足

出力用Bookを所定の場所に作成してシート名やら見た目を整えて何も問題なく期待通り(以上)の出来栄えを確認しました。 だた1つ気になってきたのは、パスワードは有っても良いと思ったのですが、検索条件を入力するシートにパスワードを入れて実行すると、入れてあるPWを見ながらPW を入力する作業は矛盾していることに気付きました。 折角なので、大変申し訳ないのですがパスの設定は外して頂きたく。 このままの使用で何も問題は無いのですが使う人が違和感を持つと思うので 私が言うのもなんですがより完成度を上げておきたく。 贅沢な要求ですがこれが最後のお願いです(最後が何度も有りますが) 下記の辺りを適当に削除してみましたがダメでしたので安直にお願いしてしまいます。 GetPW = InputBox("マクロ起動用のパスワードを入力してください") If GetPW <> .Cells(8, 3).Value Then MsgBox "パスワードが違います" Exit Sub End If

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

フォルダ内のPDFファイルの一覧表を作るのでしたら、Neo FileInfoList(無料)というソフトを使ってみて下さい。

akira0723
質問者

お礼

ご回答ありがとうございました。 但し、この質問は冒頭に記しましたように前回の回答の続き(追加要求)なので単にリストの抽出ではないのでごめんなさい。 また、せっかく教えて頂いたんぼで試してみようとしましたが会社のセキュリティに引っ掛かりDL来ませんでした。 ご回答はプライベートで使用する可能性がありますので感謝です!!!!

関連するQ&A

  • VBAフォルダやファイル操作について

    VBA初めての初心者です。 VBAのフォルダとファイル操作関連の質問です。(初心者です) 【やりたいこと】 画面から、 入力フォルダのパスを入力する・・・(1) 出力フォルダのパスとファイル名を入力する・・・(2) ・処理概要 入力されたフォルダ内のファイルを順次読み込み、 リネームして、出力フォルダに追加出力する。 (1)フォルダ内全ファイルを出力して終了する。 追加処理として、 (1)を複数入力できるようにしたいと思います。 ・詳細処理 出力フォルダのファイルネームは、連番であり、 画面での入力(2)ファイル名から連番したファイル名(+1していく) 出力するデータ内容は(1)のコピーのままでよい。 入力されたフォルダ内の全てのファイルを実行して終了する。 このようなプログラムなのですが、 初心者で、 わかりません。 思うようにコーディングしても 動きません???? どのように コーディングすればいいですか?

  • excelのVBAで集計した一覧表を作るには

    はじめましてこんにちは。 excelのVBAを使い下記のようなSheet1の一覧表から必要な項目だけを抜き出し Sheet2のような形式の表に必要な項目を入れ込みたいと思います。 その時に ・納期が変わったら改ページ ・納入場所が変わったら改ページ の条件を付けたいと思いますが VBAを使いSheet1から必要な項目だけをSheet2の表に入れ込むことは可能でしょうか? http://hiyokokko.s78.xrea.com/img/Book1.zip ↑の場所にサンプルの表をアップしてあります。 VBAは詳しくないのでこのようなサンプルの公開されているサイトもしくは 詳しく仕組みを教えていただける方がいましたら宜しくお願い致します。

  • VBAでフォルダ内のPDFファイルの一覧表(再々)

    この質問というかお願いは過去にご回答いただいた下記の質問の追加となりますのでご了承ください。 4/14 https://okwave.jp/qa/q10124583.html 4/28 https://okwave.jp/qa/q10129448.html 4/28ご解答のVBAを毎月使い始めていたら関係者から「非常にありがたい」のお礼と、エクセル、ワードで同じことができないか?と複数の問い合わせがありました。 「お師匠さんにお願いしてみてあげる」と回答してもので・・・ 誠に申し訳ないのですが、もし当該マクロのコードの修正で抽出対象をワードとエクセルに出来るなら是非お願いしたいのですが。 PDFファイル以外は全く異なるコードになるなら恐らく当方ではハードルが高いと思われるので無視してください。 あくまで現行コードの修正で当方の実力相当の範囲でお願いします。 PDFをxlsm等に変えてみるも空しく・・・ このマクロのインパクトはやはり大きかったです。

  • EXCELファイルの一覧表形式での取込について

    EXCELで以下のような事を実現しようとしています。 まだマクロや関数等の知識が少なく、どう作っていけばいいのかよくわからないため、 教えていただけますでしょうか。 <やりたい事> ・図1の様なEXCELフォーマットに内容を入力し、別ファイルのEXCELシート(図2)に  一覧表の形で取り込む。・・・図2の一覧表で発注状況を管理。 ・新たに発注するような場合は、図1のフォーマット(シート)をコピーし、内容を入力。  →その都度 図2の一覧表に追加(最終行の後に追加)。 ・図1はブック形式で、発注日付毎にシートを分けて保存。図2へは、表示している  シートの内容のみ取り込む。(取り込みボタンを作る等考えています)。 ・空欄の場合は図2の一覧表には取り込まない。 ・図1と図2は別ファイル(リンクしないファイル)として保存。

  • エクセルで指定フォルダ内の増加ファイルの一覧を作る

    いつも大変お世話になっております。 この質問はエクセルで可能かどうかも当方には不明な課題です。 また可能だとしても当方で実行できないような高度な知識が必要ならあっさり諦めるつもりの投稿です。 サーバ上の特定のフォルダ内に不定期で新規のフォルダが作成され、その中にPDFファイルが保存されていきます。 その新規に保存されたPDFファイルのフルパスとファイル名をエクセルシートの最下行に追加していくことはできるのでしょうか? フルパスにはファイル名も入るのでパスだけでもOKです。 具合的な作業としては、エクセルシートのB列に複数の顧客フォルダのフルパスを下方向に記入していきます。 そのフォルダに新規のフォルダ(名称不明)が出来たら別のシートのB列に新規にできたファルダのフルバスとC列にPDFファイルのファイル名を最下行に追加していく。 作業内容はサーバー上のフォルダに顧客別のフォルダがあり、その中に製品名別のフォルダがあります。 新製品が出来たらその顧客別フォルダ内に新製品の品名フォルダーを作成して当該製品に関する品質データをPDFファイルで保存し行くことになっています。 この新製品のPDFファイルをエクセルにリストアップして、リンクを貼る作業を半年に一度やっています。 新規に増えた分を探すのが手間で抜けがあるハズと思っています。 どの顧客フォルダに新製品のフォルダが新規作成され、その中のPDFファイルの名前をVBAで一覧表にすることが出来ればかなり作業が効率化されるのですが。 更には新規顧客からの仕事の場合は顧客別フォルダが増設されることになるのですが、これは数が少ないので先ずは既存の顧客フォルダ内に増加した品名フォルダのパスとその中のPDFファイル名までが抽出出来れば非常に助かります。 当方の理解を超えた要求なので必要な条件が抜けているかもしれませんがご容赦。

  • Access-VBAでExcelファイルを作成する。

    こんにちわお世話になります。 「Excelにエクスポート」ボタンをクリックすると、Inputboxか何かが表示されて、Pathやファイル名やシート名を入力し、「実行」ボタンを押すと、新規にExcelのBookを、そのPath、ファイル名、シート名で作成する。その後、そのシートにデータを書き込むという作業をしたいのです。 AccessのデータをExcelの任意のシートを開いて書き込むという部分のVBAコードはわかりますので、新規Book作成部分のコードがわかるかたお願いします。 Office97を使用しています。

  • フォルダの中のファイルの一覧表印刷について

    フォルダの中に100個のファイルがあります。 画面で表示されるのは大体40個位ですよね。 この100個を一覧表の形で印刷するのにはどうしたら良いのでしょうか? 今の所画面を少しづつずらして、ハードコピーで印刷するしか思いつきません。 100個のファイルを一覧表の形の印刷方法。 またはエクセル等へのテキストファイルとしての出力方法を知っている方がいたら教えて下さいまし。 <(_ _)>

  • VBAで集計ファイルを作りたい

    今、VBAで一つの集計ファイルを作成しています。 集計ファイルは、Sheet1・Sheet2の二枚のシートで構成されています。 このファイルには、ある二つのファイルにデータを流し込むために、 Sheet1には二次元配列(表)にデータを入力し、Sheet2には二つのファイルのパスを指定する仕様になっています。 集計ファイルは、「集計」ボタンをクリックした際に二つのファイルにデータを流し込む仕様です。 この二つのファイルへのデータ更新は、一回で済ませたいと思っています。 ファイルを開いてデータ更新→ファイルを閉じる・・という処理を 二回繰り返して二つのファイルにデータ更新をかけたいと思っています。 ある程度までは、作成できたのですが今行き詰っています。 サンプル程度でよいので、お手本になるスクリプトのアドバイスを頂けたらと思います。 初心者ですので、質問がわかりづらかったらすみません。。。 お力添えをお願い致します。

  • フォルダ内にあるファイル名を取得するVBA

    エクセル2010を使用しています。 VBA(マクロ)で以下の作業を実行したいと考えていますが、 初心者につき、ご教示いただけますでしょうか。 「マクロ」ファイルにある「実行」Sheetというにある「実行」ボタンで L2に入力したパス内にあるファイル(.xlsや.xlsmや.xlsbが混在しますが、基本的には全てエクセルファイル)のファイル名を K8から下へ取得したいのですが・・ 参考にしたコードでは うまく動作しませんでした。 以下では、L2のパスを参照するのも組めていないため、コード内に直接パスを書き込んでいますが 実際は、パスを変動させて使いたいので、L2を参照できるようになると助かります。 ※パスは、質問用に仮置きで「パス」としています。 Sub Sample() Dim buf As String, cnt As Long Const Path As String = "パス" buf = Dir(Path & "*.*") Do While buf <> "" cnt = cnt + 8 Cells(cnt, 11) = buf buf = Dir() Loop End Sub また、このコードでは 実行ファイル自体のファイル名も取得してしまうようなので、 実行ファイル以外のファイル名を取得したいです。 ご指導のほど、よろしくお願い致します。

  • ファイルメーカーで一覧表

    基本シートというレイアウトに入力されたものを、表形式ではなく一覧表のような感じでレイアウトを作りたいのですが、どういう方法がベストでしょうか?表形式だとそこからボタンを押して次のレイアウトへ移動からできませんので。。。 宜しくお願いします。

専門家に質問してみよう