回答受付が終了しました

ID非公開

2020/7/31 21:05

44回答

マクロ vba に詳しい方、助けて下さい。

マクロ vba に詳しい方、助けて下さい。 フォルダの下層に300個ぐらいのフォルダがあり、その一個一個に10個のテキストファイルがあります。 このテキストファイルには、命名規則があり、サンプルA、サンプルB、サンプルCなどと同じ名前のテキストがあります。 フォルダの中の【Aサンプル】と命名されているtxtファイルを300個、EXCELに払い出ししたいのですが、どのようにすればいいのでしょうか? 以下の様な感じです。 まとめ(フォルダ) ↓→東京(フォルダ) ↓ ↓→ 人数(フォルダ) ↓ ↓→ サンプルA、サンプルB. ↓ ↓→渋谷(フォルダ) ↓→ 人数(フォルダ) ↓→サンプルA、サンプルB この様にまとめフォルダの中に300個のフォルダがあり、その中一個に一個が上記の様な階層になっており、その最下層にある一部のtxtファイルを300個引っ張って来たいのですができますか?

補足

まとめ(フォルダ) ↓→東京(フォルダ) ↓ -----↓ ↓------→人数(フォルダ) ↓ -----------↓ ↓-------------→ サンプルA、サンプルB. ↓ ↓→渋谷(フォルダ) ↓----↓ ↓-----→ 人数(フォルダ) ↓----------↓ ↓-----------→サンプルA、サンプルB

Visual Basic | Excel101閲覧xmlns="http://www.w3.org/2000/svg">100

回答(4件)

0

このプログラムは、「サンプルA.txt」というファイルを、「Merge.txt」にまとめるプログラムです。 したがって、エクセルへの読み込みは行っていません。 「VBScript」による回答ですので、「Windows限定」です(「Windows」の「ツール」として使うのを想定したプログラムです)。 以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します(保存する際は、必ず、文字コードを「Shift-JIS(ANSI)」で保存してください)。 「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず、半角です。 できたプログラムファイル(「~.vbs」ファイル)を、「まとめ」フォルダに放り込んでおいて、ダブルクリック(「シングルクリック」→「Enter」の方が確実)するだけです。 「まとめ」フォルダ内に「Merge.txt」という結果ファイルを作成します。 なお、「最下層フォルダ」というのは、このプログラムでは分からないので、「サンプルA.txt」というファイルがあれば、すべて「Merge.txt」にまとめてしまいます。 最後に「Shift-JIS」、「UTF-8(BOM付き)」、「Unicode(=「UTF-16LE(BOM付き)」)」に対応可能です。 プログラム4行目の「c = "Shift-JIS" '"UTF-8" "Unicode"」を「c = "UTF-8"」にしたり、「c = "Unicode"」に代えるだけです(今は、「Shift-JIS」です)。 3行目の「n = "サンプルA.txt"」で、まとめるファイルのファイル名を設定していますので、質問者の環境に合わせてください。 Option Explicit Public ao, c, f, gf, m, n, s, so, x n = "サンプルA.txt" c = "Shift-JIS" '"UTF-8" "Unicode" Set so = CreateObject("Scripting.FileSystemObject") Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName)) m = gf Set ao = CreateObject("ADODB.Stream") ao.Type = 2 ao.Charset = c ao.Open Call z ao.SaveToFile m & "\Merge.txt", 2 ao.Close Set ao = Nothing Set gf = Nothing Set so = Nothing MsgBox("Finished!") Sub z For Each s In gf.SubFolders For Each f In s.Files If LCase(f.Name) = n Then With CreateObject("ADODB.Stream") .Type = 2 .Charset = c .Open .LoadFromFile f x = .ReadText(-1) ao.WriteText x, 0 .Close End With End If Next Set gf = Nothing Set gf = so.GetFolder(s) Call z Next End Sub 詳しい説明が必要でしたら、言ってください。

ID非公開

質問者

2020/8/2 22:02

ご回答ありがとうございます。 試してみましたら、 行:13 文字:1 ファイルへ書き込めませんでした と表示されました。 C:\Users\ユーザー名\Desktop\まとめ。直下に置くと上記のエ ラーが表示され。 C:\Users\tユーザー名\Desktop\まとめ¥各フォルダー。 に一個ずつ置くとMerge.txtはできますが中身が何もないです・・・・ また¥まとめ。の直下は300個のフォルダがあり、そのフォルダー一つ一つにサンプルB.TXTがありますので、一個一個やると300回繰り返す必要があり、結果サンプルBのTXTを一個一個開いて確認するのと変わらない状態になってしまいます・・・・・

0

“EXCELに払い出す”や“引っ張って来たい”が、具体的にどのような処理結果を望まれているのか分からなかったので、一先ず”まとめ”フォルダ以下の全ての“サンプルA.txt”を探し出すコードを書いてみました。 「Microsoft Scripting Runtime」を参照設定し、以下のMain()プロシージャを実行してみてください。 Option Explicit Private Const STARTING_FOLDER As String = "D:\まとめ" Private Const TARGET_FILE_NAME As String = "サンプルA.txt" Public Sub Main() Dim objFolder As Scripting.Folder With New Scripting.FileSystemObject Set objFolder = .GetFolder(STARTING_FOLDER) End With Call SearchFolder(objFolder) End Sub Private Sub SearchFolder(argFolder As Scripting.Folder) Dim objSubFolder As Scripting.Folder Dim objFile As Scripting.File With argFolder For Each objSubFolder In .SubFolders Call SearchFolder(objSubFolder) Next For Each objFile In .Files If (objFile.Name = TARGET_FILE_NAME) Then Debug.Print objFile.Path End If Next End With End Sub

ID非公開

質問者

2020/8/1 8:30

ご回答ありがとうございま! 外出先の為、帰宅次第試してみます! 具体的にどのような処理結果を望まれている → 【C:desktop¥まとめフォルダ】内に300のフォルダがあり、その中に各サンプルBと言うなのtxtがあるのですが、このサンプルBの中身の値が、他のサンプルBの値を入力した疑惑があり、重複していないか確認する事を目的としています。 その為、一枚のシートに、 A列各フォルダ名 B、C,D、E、F、G、H....列に一個のテキストから抜いた情報を並べたいです。 サンプルBの中身は、約15行〜20行あります。 そしてEXCELのフィルターなり、重複確認の関数を手動で打って、あ!これ東京フォルダに入っているサンプルBと、渋谷フォルダに入っているサンプルBのテキストと同じ値だ!ミスだ!と分かればなとおもっております

0

A列 B列 C列 フォルダー¥東京¥○○¥6人… テキスト.txt 中身 フォルダー¥東京¥○○¥3人… テキスト.txt 中身 フォルダー¥東京¥△△¥6人… テキスト.txt 中身 こんな感じに一旦全部出力してから、 テキスト名等でフィルターする感じで良いですか??

ID非公開

質問者

2020/8/1 8:17

そうです! 最終的な目的が、サンプルBの値が他のサンプルBの値を入れてしまい重複している可能性がある為、、ご回答頂いた様に一枚のシートに払い出しさせて、重複確認をしたいと思っています。

0

こんにちは。 >300個引っ張って来たいのですができますか? 「引っ張ってくる」 の具体的な説明してください。 1) テキストファイル名のパスを特定。 2) テキストファイルを開いて、文字列をセルに転記する。 文字列の加工が必要ならば、その時に処理 3) 転記が終了したら、そのファイルは閉じる ファイル一つに、何行あるのか、で、セルの転記の違いもあるでしょうし、 外部のファイルから、エクセルに読み込みするインポートは、 「やりたいこと」の違いの分だけ、コードを合わせていくことになります エクセルのコードは 1) 指定したフォルダの、テキストファイル一覧表の作成。 2) テキストファイルのファイル名と文字列から、シートに転記する。 の処理となります。1) が完成し、2)を作成する、という順番。 もし、見つける-->転記、閉じる、次のファイルを探すという場合、 正しく探せなかった場合の対応や、全体の一覧、転記にエラーがあった場合の対応など、機能として必要なことに対応するのに、「段階の処理」が必要となります まずは、「ファイル一覧の作成」そして、「ひとつだけ処理する」 を作成したら、あとは、ループさせることになります つまり、「フォルダ構造」は、エクセルから見たとき、大した情報ではありません。 条件は、「最初のフォルダパス」をどのように取得するか ターゲットのファイル拡張がtxtとわかっているなら、それ以外のファイルは無視 となるからです

ID非公開

質問者

2020/8/1 8:08

ご回答ありがとうございます。追記致します。 2) テキストファイルを開いて、文字列をセルに転記する。をしたいです。 抽出したいtxtデータの中身は、15行あります。 なんの為にこの作業をしたいかと言うと、 【c:¥desktop¥まとめ→各300のフォルダ→各300のサンプルB.txt】にある、サンプルBのtxtの中の値が他のサンプルBの物と同じ値を入れた疑惑があり、その重複を探す目的にあります。