アプリ版:「スタンプのみでお礼する」機能のリリースについて

前回質問した者です。
http://oshiete.goo.ne.jp/qa/7062908.html


ある特定のフォルダ内に複数のフォルダがあり、その中の各フォルダには、txtファイルが複数あります。

VBAを使ってエクセルのA列にフォルダ名、B列にtxtファイル名、C列にはtxtファイルの内容を入れたいです。(今はコピペを手動で行っています)

フォルダA

フォルダ1、フォルダ2、フォルダ3、・・・・

各フォルダにはtxtファイル(改行あり)

VBAは解らないのですが、自分なりに検索してみて、以下のコードを見つけました。

しかし、以下の場合はA列にtxtファイルの内容しか入らず、また、特定のフォルダのみしか反映されません。

そこで、フォルダAのパスだけを指定して、A列にフォルダ名、B列にtxtファイル名、C列にはtxtファイルの内容を入れるにはどうすればいいのでしょうか?



Sub Macro()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

Dim FolderPath As String
'ここのアドレスをファイルが格納されているフォルダのパスに変えてください
FolderPath = "H:\Documents and Settings\asano\デスクトップ\TEST"

Dim myFile As Object
Dim i As Long
i = 1
For Each myFile In fso.GetFolder(FolderPath).Files
Cells(i, 1).Value = fso.OpenTextFile(myFile.Path).ReadAll()
i = i + 1
Next
End Sub

A 回答 (2件)

フォルダAの下のサブフォルダが1階層だけ(子フォルダまで)なら、「再帰」で全てのサブフォルダを舐める事無く、For Each を二重にするだけで済みます。



i = 1 の下を次の様に書き換えて見てください。

Dim myFolder As Object
For Each myFolder In fso.GetFolder(FolderPath).SubFolders
  For Each myFile In fso.GetFolder(myFolder).Files
    Cells(i, 1).Value = myFolder
    Cells(i, 2).Value = myFile.Name
    Cells(i, 3).Value = fso.OpenTextFile(myFile.Path).ReadAll()
    i = i + 1
  Next
Next

テキストファイル以外が入っていた時などの処理は元のコードでも考慮されていないので省略しています。また、前回の質問は見ていませんので何か別な条件があっても考慮していません。あしからず。
    • good
    • 0
この回答へのお礼

mt2008 さん

回答ありがとうございます

思っていたことができました!

お礼日時:2011/10/13 15:32

プログラミングのロジックの学習で最初にならうのが、



”再帰”

と言う手法です。これを学べばいいだけです。

>ある特定のフォルダ内に複数のフォルダがあり、その中の各フォルダには、txtファイルが複数

最初のフォルダーを指定すれば、「再帰的にループ」を繰り返すことで、全てのドライブの全てのフォルダーに在るファイルがリストされます。そのファイルに対してのパス名を取得して、処理に渡せば言いだけです。

http://search.yahoo.co.jp/search?b=1&n=10&ei=UTF …
(再帰検索リスト)

http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …
(上記から適当と思われる再帰ロジック説明)

さらに、有効なドライブの取得方法

http://search.yahoo.co.jp/search?p=VBA+sample+%E …
(検索リスト)

このドライブレターを再帰ループの先頭で指定すれば、対象となるドライブのリストが得られる。もちろん最初から特定ドライブがあれば、それを指定するだけ。


これは、基本的には”Scripting.FileSystemObject”のクラス(COM)を使用するか、シェル(エクスプローラ)”Shell.Application”のクラス(COM)

http://msdn.microsoft.com/ja-jp/library/cc409798 …
http://search.yahoo.co.jp/search?p=Shell.Applica …

を使用すると今後の展開力に強くなる。

どれを使っても達成できるので、まあ自由にやってください。

最後にファイルのオープンの仕方と、エクセルオブジェクトのデータバインド(セルへのデータ流し込み)の仕方をそれぞれの検索するだけ。


それを

for
while

http://search.yahoo.co.jp/search?b=1&n=10&ei=UTF …

などのループの中に入れるだけ。

それと、VBAの書式では、クラス定義又はサブルーチンの作成の仕方を取得する必要がある。

http://search.yahoo.co.jp/search?p=VBA+%E6%9B%B8 …

さて、これらを自分でチョイスしてできなようでは、自分でスクリプトを作るのをあきらめてください。
    • good
    • 0

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