「みんな教えて! 選手権!!」開催のお知らせ

Excelである文言の一覧があります。
特定フォルダからこの一覧を含むファイルを移動用フォルダを作成して移動したいと考えております。

■Excelファイル(A列)
AA111000
AA111002

■特定フォルダにあるファイル名
AA111000_りんご.pdf
AA111001_みかん.pdf
AA111002_ばなな.pdf
AA111003_いちご.pdf

■移動用フォルダ
不要

●希望結果(フォルダ構成)
AA111001_みかん.pdf
AA111003_いちご.pdf
不要
 ┗AA111000_りんご.pdf
 ┗AA1110002_ばなな.pdf

Excelにてバッチを含むVBAを作成して実行でも、
バッチファイルを手動で作成して実行でも構いません。

このような操作が可能かどうか、
可能であればどのようにすればよいか教えていただけないでしょうか。

A 回答 (5件)

#1で想定したコードサンプルです


参考サイトなどと合わせて実行コード内の処理をステップ実行などで
確かめながら理解する方が早いかも知れませんしカット&トライの時代ではないのかも知れませんね。

Sub example()
Dim fso As Object, fol As Object, f As Object
Dim ary As Variant, i As Long
Dim strFolPath As String, strMoveFol As String
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then 'ダイアログでファイル郡のフォルタパスを取得
strFolPath = .SelectedItems(1)
Else
Exit Sub
End If
End With
strMoveFol = strFolPath & "\不要" '同じフォルダの移動フォルダ名(変更箇所)
Set fso = CreateObject("Scripting.FileSystemObject")
Set fol = fso.GetFolder(strFolPath) ' フォルダ
If Not fso.FolderExists(strMoveFol) = True Then
fso.CreateFolder (strMoveFol) '無ければ移動先フォルダ作成
End If
'キーワードリスト作成(2次元配列で作成)
With ActiveSheet 'アクティブシートのA1セルから最終行(変更箇所)
ary = .Range(.Cells(1, "A"), .Cells(.Rows.Count, "A").End(xlUp))
End With
For Each f In fol.Files ' フォルダ内のファイルを順次取得
For i = 1 To UBound(ary, 1) '配列内をループ
If f.Name Like ary(i, 1) & "_*" Then 'ファイル名をlikeでパターンマッチ
f.Move (strMoveFol & "\") '同名で移動
'Exit For 'アンダーバー前の値が複数ある場合適当でない
End If
Next
Next
Set fol = Nothing
Set fso = Nothing
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございます!感謝します。
明日、上記を試してみます。

お礼日時:2022/08/15 16:42

補足要求です。


1.excelファイル A列に
AA111000
AA111002
が、ありますが、A1からデータが開始していますか。
それとも、A1は見出しで、A2からデータが開始していますか。

2.上記のシート名は何でしょうか。

3.マクロを組み込むとすれば、上記のexcelファイルに組み込む
ことになりますが、よろしいでしょうか。
(組み込んだexcelファイルの拡張子はxlsmになります)

4.特定フォルダの直下に”不要”フォルダがあると理解しましたが、
間違いないでしょうか。
    • good
    • 1
この回答へのお礼

1)ExcelファイルはA1セルから開始しています。
2)VBAで「除外」という名前のシートを作成し、A1セルから該当する番号(AA111000など)を入れています。
3)マクロの組み込みは問題ありません。この手段以外にもマクロやVBAを組んでいるので問題はありません。
4)「不要」フォルダは存在します。

お礼日時:2022/08/15 16:41

#1です


今一度、ご確認したいのですが、
例を見るとファイル名での振り分けになっていましたので
ファイル名を念頭に回答いたしましたが、確かに 文言 含むファイル・・

ファイル名で振り分けではないのですか? 
ファイル内のドキュメント文字列が振り分け対象キーワードなのですか?

PDFの文字列を取得となると#2様が示されている通り Acrobat Proや
Pythonなどのライブラリーを使ったりする必要があると思います、保護の問題もあるかな・・
    • good
    • 1
この回答へのお礼

私の文言が分かりにくくて申し訳ございません。
PDFファイル内にもAA111000のような文言が含まれていますが、
PDFファイル名に含まれている場合のみで考えておりました。
※PDFファイル内に書かれている番号(AA111000)と
 PDFファイル名が異なる場合は別手段でPicUPしております。
説明の補足でした。

お礼日時:2022/08/15 16:39

こんにちは



試してみてはいませんけれど・・・
ファイル名ではなく、ファイル内の文書で文言の有無を検索するということですよね?

バイナリ形式のファイルだと、対応ソフトで開いてから検索しないと上手くいかないものと思われます。
(テキストファイルのみが対象ならバッチでも良いのでしょうけれど・・)
どのようなファイルが対象なのでしょうか?
Office系はそのままVBAでもなんとかなりますが、例示なさっているのがpdfなので・・
.psdや.aiなども対象なのでしょうか? まさか、画像ファイルは対象外とは思いますが・・

各ファイルを検索する際に、拡張子を調べ、それに応じたソフトで開き、検索ワードの有無を調べる必要がありそうに思われます。
そのために、まずは対象となりそうなファイルを列挙して、それぞれの検索方法を調べることになるでしょう。
この部分さえクリアできれば、後は単純に
『特定フォルダ内の各ファイルを順に検索して、キーワードが存在すれば移動用フォルダに移動』
というループに組み込めばよさそうですので。


docx、xlsx、pptx、txt、csv などに関しては(質問者様にとって)問題はないものと推測しますので、その他のファイルで、例えばご例示のpdfの場合には、
https://fastclassinfo.com/entry/vba_pdf_text_ext …
のような感じで検索が可能です。
それ以外のファイルの種類に関しても、同様に個別に処理を作成しておいて、拡張子によって振り分ければなんとかなるのではと思います。

残念ながら、全てのソフトが検索に利用できるdll等を用意してくれているとは限りませんので、難しい種類のものも存在するであろうと推測されます。
コード内に扱える拡張子を列挙しておいて、それ以外のファイルが存在した場合には、スキップするなどが必要になるのではないでしょうか。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
フォルダにPDFファイルが500個以上あり、
特定の名前が入っている約半数のファイルを除外したいというのが目的でした。
フォルダに入っているのはPDFファイルのみです。
除外リストはExcelに1セルずつ入っているので、
それをテキストに書きだしてバッチファイルと考えておりました。

お礼日時:2022/08/10 17:28

こんにちは


>可能であればどのようにすればよいか教えていただけないでしょうか。
先ずは 可能です
キーになるワードのリストを作成して
リストでなくとも列範囲をループする処理で値を取得する方法も有ります

各キーワードを対象ファイル名と比較(instrやLike)などをしてTrueの場合に
CreateObject("Scripting.FileSystemObject").Move(移動元フルパス & \)

Name 移動元フルパス As 移動先フルパス のようにステートメントを実行する形になると思われます
対象ファイル名と比較する場合、フォルダー内すべてのファイルに対して繰り返し処理をする(Trueの特ファルダ内ループから一旦抜ける)

具体的なコードは、ご質問にコードなどの記載がなくご質問者様のスキルなどが不明の為割愛します
(実際に書いたコードなどを示されると躓いている箇所やアドバイスもし易いですね)

参考サイトでご確認ください
現場で使える! Excel/VBA実践ガイド
【VBA】ファイルを移動する【シンプル】
https://excel-vba.work/2020/11/23/%E3%80%90vba%E …

Tipsfound › Excel VBA › ファイルの移動
https://www.tipsfound.com/vba/18008

大体でIT -ちょっと使えるネタを紹介-
【VBA】Rangeで取得したセル範囲をループする【For Eachを使います】
https://daitaideit.com/vba-range-for-each/
    • good
    • 1
この回答へのお礼

ありがとうございます。
VBAは初心者レベルのため、まずはご紹介いただいたWEBページにて勉強してみます。

お礼日時:2022/08/10 17:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報