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

Excel2007のVBAを使い、下記のようなマクロを作成しました。
(質問に必要そうな所だけ掲載しています。)

Dim dir_name As String ' ディレクトリ名
Dim file_name As String ' ファイル名
Dim EffectiveRow As Integer ' 開始行数/Excel/Row(行)
Dim ShellApp As Object ' SHDOCVW.DLL / MIC
Dim oFolder As Object ' フォルダパス

EffectiveRow = Range("A65536").End(xlUp).Row

Set ShellApp = CreateObject("Shell.Application")
Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1)

dir_name = oFolder.items.Item.Path

ChDir dir_name

file_name = Dir("*.txt", vbNormal)

Do Until file_name = ""
EffectiveRow = EffectiveRow + 1
Call ImportText(file_name, EffectiveRow)
file_name = Dir()
Loop

ShellApp.BrowseForFolderを使い、指定したフォルダを選択すると、
その中に有る、テキストファイル(.txt)を、全てExcelに書き込む
というマクロを作成したのですが、もっと汎用性を高くするために、
下記の内容を実現したく思っています。

- ↓ 実現したい事↓ -
- 状況 -
*フォルダの中に、サブフォルダが複数有り、そのサブフォルダの中に、
テキストファイル(.txt)が複数入っている。

- 処理 -
サブフォルダを格納している*フォルダを、ShellApp.BrowseForFolderで
選択し、一度でサブフォルダ内のテキストファイルを全てExcelに書き込
めるようにしたい。

上記のマクロから発展させて、このような処理を行う事は出来るでしょうか?
また、どのようにすれば実現させることが出来るでしょうか?

ご教授のほど、よろしくお願いします。m(_ _)m

※ [*フォルダ ] は同一フォルダです。

A 回答 (4件)

途中から。

。。

'----------------------------------------------
●ChDir dir_name  '●これ不要だと思うが。。
dir_name = oFolder.items.Item.Path

Dim fso
Dim fsoFolder
Dim fsoSubFolder

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsoFolder = fso.GetFolder(dir_name)

For Each fsoSubFolder In fsoFolder.SubFolders

 file_name = Dir(fsoSubFolder & "\*.txt", vbNormal)

 Do Until file_name = ""
   EffectiveRow = EffectiveRow + 1
   Call ImportText(file_name, EffectiveRow)
   file_name = Dir()
 Loop

Next fsoSubFolder
'------------------------------------------

それから、Dir関数を使用せずに

For Each fsoSubFolder In fsoFolder.SubFolders
  For Each fsoFile In fsoSubFolder.Files
    If Right(fsoFile, 4) = ".txt" Then

とする方法もありますが後がこの場合のfsoFileはフルパスになります。


■注■
サブフォルダーの中に更にサブフォルダーがある場合は上記ではできません。
その場合は再起処理をすることにになります。
以上です。
 
    • good
    • 0
この回答へのお礼

やりたかった処理を実装出来ました。
ありがとうございました!m(_ _)m

お礼日時:2009/08/02 05:05

http://okwave.jp/qa4847039.html
のNo.2に下位フォルダーも含むファイルリストを取得するコードを回答しています。全フォルダーを調べ終わってから、得られたファイルリストに対して書き出し処理するというのではいかがでしょうか。ファイルリストに加えるときにテキストファイルだけ選別するか、あるいは得られたファイルリストの中でテキストファイルだけを処理対象にする様な処置は必要ですが。
    • good
    • 0
この回答へのお礼

やりたかった処理を実装出来ました。
ありがとうございました!m(_ _)m

お礼日時:2009/08/02 05:05

Dim FSO, FLD


Set FS= CreateObject("Scripting.FileSystemObject")
Set FLD = FSO.GetFolder(oFolder.items.Item.Path)
処理 FLD

Sub 処理(FLD) '★再帰呼び出しによる処理
  Dim SF
  For Each SF In FLD.SubFolders '★フォルダ内のサブフォルダ
    処理 SF '★各サブフォルダに対し同じことを繰り返す
  Next
  '★-- ここからフォルダ内のファイルの処理
  ChDir FLD.Path
  Dim file_name
  file_name = Dir("*.txt")
  === ここからは以前の処理なので省略 ===
End Sub
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

ここまでヒントを頂いても難しい…。
もう少し悩んでみます。
ありがとうございますm(_ _)m

お礼日時:2009/07/31 15:40

こんにちは



ひとつのフォルダ内の処理はできているのですよね?
その中で、サブフォルダが見つかったら、そのサブフォルダを引数にして
自分自身を呼び出せるように、全体を少し修正すればできると思います。
(キーワード:再帰処理)

<参考>
http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …

この回答への補足

ご回答有りがとうございます。
何となくは解るのですが、中々上手く
いきません・・・。

1つめのサブフォルダを見終わったら、
次のサブフォルダに移動する?方法が
解らないというのが1つあります(汗

補足日時:2009/07/31 14:13
    • good
    • 0

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