• 締切済み

マクロで文字検索と書き出し

Excelのマクロで各フォルダ内にあるテキストファイルに特定文字が含まれていたら そのテキストファイルがあるフォルダ名をセルB1に書きだすというマクロを組みたいです。 Aというフォルダ内に 20150328 20150410 20160322 ・・・・ ・・・・ ・・・・ 20160412 というようなフォルダ名のついたフォルダが300個近くあります。 300個近いフォルダ内にはテキストファイルがあり(ないものある) そのテキストファイル内にセルA1で入力されている文字と同じ物があれば(完全一致ではなく一部一致でよい) 一番最初に見つけたそのテキストファイルが入っているフォルダ名をB1に 書きだす方法が知りたいです。 例えば上記の例で言うと 検索した文字 【計測】だとします。 20150328 20150410 20160322 このフォルダ内のテキストファイルには全て 計測 とい文字が含まれていますが 名前の順番からすると20150328のフォルダが最初なので そのフォルダ名をB1に書きだすという感じです。 また、これは出来ればでいいのですが 300個近いフォルダを全て調べていくと時間が掛ってしまうので セルA2に日付を入力しておき 上記のマクロを実行すると、セルA2に入力した日付以降に作成されたフォルダから 検索を始めるようにしたいです。 このような事が出来るかわかりませんが、宜しくお願いします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

したいことだけ質問に長々と書いて、コードを作ってくれというふうな丸投げになっている。本やWEBで、どれほど本質問をやろうとして調べたのか。どこで行きずまったか。 仕事がらみらしいが、実力以上のことをしようとしているのではないか。 周りにチェックして教えてくれる人がいない環境で、仕事に関係した処理をするのは危険と思う。 そもそも、FSO(FileSystemObject)の本や記事を読んで勉強して質問しているのか。 「VBScriptポケットリファレンス」(技術評論社)には、 ・ファイルやフォルダの作成日を調べたい という解説がある。 作成日の前後で検索対象から外したいらしいが、フォルダ名(の一部)は日付の文字列が入っているのか。入ってなければFSOで作成日を調べればよい。・ ーー ・フォルダ内のすべてのファイルを参照したい という解説も(上掲書に)ある。 ForEachでできる。 == データの構成単位として (1)レコード (2)ファイル (3)フォルダ の中で、特別に作成されて公開されているソフト(Vectorにあるものなど)なら(3)のフォルダの全ファイルを調べてくれるものもあるようだが、見つけて表示してくれるだけで、その後のVBAでの作業ができない(そういう用途に作られていない)。 だから(2)ぐらいが最上レベルだろう。 (2)は「ファイル全体の文字列を読みこみたい」ReadAll(上掲書にあるよ) によって、読み込んだ全文の検索をすればよいと思う。 それを、フォルダ内の全ファイルに当てはめて繰り返せばよい。 参考に Sub test01() Set FSO = CreateObject("Scripting.FileSystemObject") Set Txt = FSO.OpenTextFile("C:\Users\XXX\Documents\テキストファイル例1.txt") '全文読み込み buf_strTxt = Txt.ReadAll Txt.Close '探索処理 s = 1 Do p = InStr(s, buf_strTxt, "東京") If p <> 0 Then MsgBox Mid(buf_strTxt, p , 10) s = p + 1 End If Loop While p <> 0 End Sub このテスト例では、「東京」という文字列が出てきたら、(その都度に)東京も含めた(続く)10文字を表示している。こういうのが使えないか。 ーー 上記では書籍の例を出したが、WEBでも記事はたくさんある。VBAをやるなら、VBScriptの本とIEのVBAがらみの本は常備しておくべきだと思う。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは フォルダは日付でしょうか? 早い日の順番に検索するのは面倒なので、1日ずつ存在チェックして、 Sub test()   Dim FSO  As Object   Dim fld  As Variant   Dim d   As Variant   Dim i   As Long   Dim MaxF As Long   Dim MinF As Long   Dim v   As Long   Dim buf  As String   Dim target As String      Const MinD As Date = #1/1/2015#   Const Fld1 As String = "G:\A\"   Const Fext As String = "*.txt"      MaxF = CLng(Format(Now(), "yyyymmdd"))   MinF = CLng(Format(MinD, "yyyymmdd"))      target = Range("A1").Value   Range("B1") = ""      Set FSO = CreateObject("Scripting.FileSystemObject")   Do Until v > MaxF     v = CLng(Format(DateAdd("d", i, MinD), "yyyymmdd"))     i = i + 1     If Dir(Fld1 & v, vbDirectory) <> "" Then       Set fld = FSO.GetFolder(Fld1 & v)       If fld.DateLastModified > DateValue(Range("A2")) Then         For Each d In fld.Files           If d.DateLastModified > DateValue(Range("A2")) _                       And d.Name Like Fext Then             With FSO.GetFile(d).OpenAsTextStream               buf = .ReadAll               If InStr(1, buf, target, vbTextCompare) <> 0 Then                 Range("B1") = fld.Name                 Exit Do               End If               .Close             End With                        End If         Next d       End If     End If   Loop End Sub フォルダ数や、テキストファイルのサイズによっては遅くて使い物に ならないかも・・・

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.1

関連するQ&A

専門家に質問してみよう