[[20240615135950]] 『【VBA】指定した文字列を各フォルダーで検索、見ax(Nabejiro) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『【VBA】指定した文字列を各フォルダーで検索、見つかったファイルのパスをコピー、検索した文字列と同じ行にあるC列のセルに貼り付けます。』(Nabejiro)

下記の操作を実行するVBAコードをご教示いただけないでしょうか。
皆様のお力添えを賜りたく、お願い申し上げます。

【操作内容の概略】
指定した文字列を各フォルダーで検索、見つかったファイルのパスをコピー、検索した文字列と同じ行にあるC列のセルに貼り付けます。

【具体的な操作内容】
セル範囲A1:A10のA1セルのフォルダーパスをコピー。
Windows Explorerのアドレスバーに貼り付けます。
Excelの画面に戻り、セル範囲B1:B100のB1セルの文字列をコピー、Windows Explorerの検索ボックスに貼り付けます *1
(Excelファイルが見つかったら)
Excelファイルのパスをコピー、C1セルに貼り付けます。
(Excelファイルが見つからなかったら)
Excelの画面に戻り、セル範囲A1:A10のA2セルのフォルダーパスをコピー、Windows Explorerのアドレスバーに貼り付けます。
Excelの画面に戻り、セル範囲B1:B100のB1セルの文字列をコピー、Windows Explorerの検索ボックスに貼り付けます。
(Excelファイルが見つかったら)
Excelファイルのパスをコピー、C1セルに貼り付けます。



(Excelファイルが見つからなかったら)
Excelの画面に戻り、セル範囲A1:A10のA10セルのフォルダーパスをコピー、Windows Explorerのアドレスバーに貼り付けます。
Excelの画面に戻り、セル範囲B1:B100のB1セルの文字列をコピー、Windows Explorerの検索ボックスに貼り付けます。
(Excelファイルが見つかったら)
Excelファイルのパスをコピー、C1セルに貼り付けます。

(ファイル名にB1セルの文字列を含むExcelファイルが見つかったら、B2セルも同様の操作を行います) *2

セル範囲A1:A10のA1セルのフォルダーパスをコピー。
Windows Explorerのアドレスバーに貼り付けます。
Excelの画面に戻り、セル範囲B1:B100のB2セルの文字列をコピー、Windows Explorerの検索ボックスに貼り付けます *1
(Excelファイルが見つかったら)
Excelファイルのパスをコピー、C2セルに貼り付けます。
(Excelファイルが見つからなかったら)
Excelの画面に戻り、セル範囲A1:A10のA2セルのフォルダーパスをコピー、Windows Explorerのアドレスバーに貼り付けます。
Excelの画面に戻り、セル範囲B1:B100のB2セルの文字列をコピー、Windows Explorerの検索ボックスに貼り付けます。



(Excelファイルが見つからなかったら)
Excelの画面に戻り、セル範囲A1:A10のA10セルのフォルダーパスをコピー、Windows Explorerのアドレスバーに貼り付けます。
Excelの画面に戻り、セル範囲B1:B100のB2セルの文字列をコピー、Windows Explorerの検索ボックスに貼り付けます。
(Excelファイルが見つかったら)
Excelファイルのパスをコピー、C2セルに貼り付けます。

(B列の最終行まで同様の操作を行います)

 *1
フォルダー配下のすべてのサブフォルダーも検索します。

2

いずれかのフォルダー内に、検索した文字列を含むExcelファイルが必ず1つ存在します。

【マクロを実行するExcelブックの情報】
現在開いているブック *1 で、セル範囲A1:A10の各セルにフォルダーパス *2 が1つずつ入力されています。
また、同ブックでセル範囲B1:B100の各セルに文字列 *3 が入力されています。

1

ブック名:Book1.xlsx
シート名:Sheet1

2

フォルダーパスは
A1セルにC:\Users\ユーザー名\Documents\A1
A2セルにC:\Users\ユーザー名\Documents\A2
A3セルにC:\Users\ユーザー名\Documents\A3



A8セルにC:\Users\ユーザー名\Documents\A8
A9セルにC:\Users\ユーザー名\Documents\A9
A10セルにC:\Users\ユーザー名\Documents\A10
と入力されています。
A列の最終行がA10セルとは限りません。
例えば、A100セル、A1000セルと変化します。

3

文字列は
B1セルにB000001
B2セルにB000002
B3セルにB000003



B98セルにB000098
B99セルにB000099
B100セルにB000100
と入力されています。
B列の最終行がB100セルとは限りません。
例えば、B1000セル、B10000セルと変化します。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


こんばんわ。。。(*^^*)
整理のお手伝いだけでも。。。

Book1.xlsx  ← ここにマクロ書くなら、マクロブックとして要、再保存 拡張子は xlsm かと^^

Sheet1

     |[A]                              |[B]     
 [1] |C:\Users\ユーザー名\Documents\A1 |B0000001
 [2] |C:\Users\ユーザー名\Documents\A2 |B0000002
 [3] |C:\Users\ユーザー名\Documents\A3 |B0000003
 [4] |C:\Users\ユーザー名\Documents\A4 |B0000004
 [5] |C:\Users\ユーザー名\Documents\A5 |B0000005
 [6] |C:\Users\ユーザー名\Documents\A6 |B0000006
 [7] |C:\Users\ユーザー名\Documents\A7 |B0000007
 [8] |C:\Users\ユーザー名\Documents\A8 |B0000008
 [9] |C:\Users\ユーザー名\Documents\A9 |B0000009
 [10]|C:\Users\ユーザー名\Documents\A10|B0000010
 [11]|C:\Users\ユーザー名\Documents\A11|B0000011
 [12]|C:\Users\ユーザー名\Documents\A12|B0000012
 [13]|C:\Users\ユーザー名\Documents\A13|B0000013
 [14]|C:\Users\ユーザー名\Documents\A14|B0000014
 [15]|C:\Users\ユーザー名\Documents\A15|B0000015
 [16]|                                 |B0000016
 [17]|                                 |B0000017
 [18]|                                 |B0000018

   どこまで続くかは不明。。。^^;恐ろしいですね。。
でも多分そんなにたくさんでは無いのでしょうね

他アプリ操作は至難の業なのでエクスプローラ使用は断念された方が
良いかもしれません。他にもっと簡単な方法がたくさん有りますよ。

全てC:\Users\ユーザー名\Documents 以降なら
C:\Users\ユーザー名\Documentsの全てのサブフォルダを含むファイル名を取得して
B列のファイル名と照合すればOKかもですね。
でわ
m(_ _)m
(隠居) 2024/06/15(土) 18:42:09


マルチポスト
https://www.239-programing.com/cgi-bin/excelvba_bbs.cgi?id=1933
(マルチ) 2024/06/15(土) 18:44:09

 要するに、特定の文字列を複数のフォルダ(その配下のサブフォルダを含む)の配下の
 Excelファイルの中から全文検索し、存在したらそのフルパスをシートに書き出すということですね。
 ・A列に検索すべきフォルダ群、
 ・B列に対象とする文字列、
 ・C列に、B列の文字列を含むファイルのフルパスを書き込む
 ということですね。

 Explorerで検索ということは全文検索なんですよね。

 ExplorerはVBAからは操作できないので、その方向での対応は難しいでしょう。
 (A列のフォルダ群を一つのフォルダの配下にコピーすれば、検索A列フォルダの数を n とすると
   検索するコストは 1/ n になりますから、"手作業"の労力は減らせますけれども)

 【質問】
 (1)そもそもそうしたタスクはどういう経緯で発生したのでしょう。
    (余り議論になったことがない話ですね。)
    それらの事情を説明されることで、それが解決につながるヒントになる可能性があるかも
    しれないので、質問しています。
 (2)文字列がマッチするブックはなぜ一つだけ、と判明しているのですか? 
    primary keyのようなものですか? (そうであれば普通はブック名などに埋め込むのが普通ですが)
 (3)そのブックは形式が定まったもの想像しますが、いかがですか。
    対象となる文字列があるセルにあることが決まっているといった幸運があれば、
    各ファイルから、それらの情報を先に抽出しておいてから検索することが可能です。
 (4)その文字列があるのは、セルにあるものと限定して構いませんか?
    テキストボックスとかコメント、図形内の文字とか、メモとかも考慮必要ですか?
    (Explorerはこの点優秀で、すべてカバーしています)

(xyz) 2024/06/15(土) 18:54:09


 ファイル名のなかの文字列ということなら、以下のとおりです。
(xyz) 2024/06/15(土) 15:35:19 
 に投稿してその後削除したものの再投稿です。

 試作品です。十分チェックしていません。
 マッチするファイルは、一つだけという前提です。
 (複数あっても、最初にマッチしたらもうその文字列はチェックしません)

 そちらでよくチェックしてください。

 <<以下、コードです>>

 Option Explicit
 Dim dic     As Object
 Dim fso     As Object

 Sub test()
     Dim file As Object
     Dim lastRowA&
     Dim lastRowB&
     Dim j&, k&

     Set dic = CreateObject("Scripting.Dictionary")
     Set fso = CreateObject("Scripting.FileSystemObject")
     lastRowA = Cells(Rows.Count, "A").End(xlUp).Row
     lastRowB = Cells(Rows.Count, "B").End(xlUp).Row

     For k = 1 To lastRowB
         dic(Cells(k, "B").Value) = k
     Next

     For j = 1 To lastRowA
         checkFileName Cells(j, "A").Value
     Next
     Set fso = Nothing
 End Sub

 Sub checkFileName(folderPath As String)
     Dim folder As Object
     Dim file As Object
     Dim e

     For Each folder In fso.GetFolder(folderPath).SubFolders
         checkFileName folder.Path
     Next
     For Each file In fso.GetFolder(folderPath).files
         For Each e In dic
             If InStr(file.Name, e) > 0 Then
                 Cells(dic(e), "C") = file.Path
                 dic.Remove e
             End If
         Next
     Next
 End Sub

(xyz) 2024/06/15(土) 21:05:41


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.