• ベストアンサー

複数のフォルダに、順次実行したいんですが?

下記コードで(あるサイトにありました)、"C:\DATA"の中の複数のフォルダ(F1、F2、F3、変動あり、いまのところ3つまでです)へ、順次実行したいのですが、うまく出来ません。 Call を使用すれば、出来ますが、Call を使用しないで実行するにはどのように編集すればよろしいですか? 以上よろしくご教示くださいませ。 中部分は、省略しました。 ---------- Sub CSVtoXLS() Dim myFS As FileSearch Dim mySvWb As Workbook Dim i As Long ChDir "C:\DATA" Set myFS = Application.FileSearch With myFS .LookIn = "C:\DATA" .Filename = "*.csv" If .Execute > 0 Then '保存用ブックを追加 Workbooks.Add Set mySvWb = Workbooks(2) For i = 1 To .FoundFiles.Count '見つかったファイルを一つずつ開く        ・        ・     '保存用ブックを保存して閉じる mySvWb.SaveAs Filename:="CSV_hozon" mySvWb.Close Else '検索結果が0なら MsgBox "検索条件を満たすファイルはありません。" End If End With End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

FileSearch オブジェクトのSearchSubFolders プロパティについてヘルプで確認しましょう。

oshietecho-dai
質問者

補足

誠に、どうも有難うございました。 何とかヘルプにて、実行することができました。 「書き込まれる順序について」、1つだけ、お願い致します。 必ず、希望順で書き込ませたい場合の条件ですが、 各フォルダ名、各ファイル名、の "cmd*" "*cmd" の「*」が、 1,2,3,…  A,B,C,…  a,b,c,…   あ、い、う、… なら、この順序で書き込まれるわけでしょうか? よろしくお願い致します。

その他の回答 (6)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.7

#2です。 > .Execute(msoSortByFileName) > 本来は、これでいいはずなんです。 Executeメソッドにソート用の引数があったのですね。 あまり使わないので知りませんでした。 勉強になりました。m(__)m > VBAを良く知っている人たちは、FileSearch すら、使わないという風潮があります。 私も Windows2000 + Office97で FileSearch がまともに機能せず、苦労した経験から、それ以降あまり使用してません。 http://support.microsoft.com/kb/259738/JA/ 良く考えたら先の回答もサブフォルダ内に複数ファイルが存在する場合を想定していませんでした。 結局順番通りに実行するには何らかの対処が必要ですね。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

Wendy02です。 #5 の papayukaさんの >普通にやったのでは希望順にはならないと思います。 (名前順なら)  .Execute(msoSortByFileName)   本来は、これでいいはずなんです。今、XP側+Office 2003では、問題は発生しませんが、この FileSearch というのは、確か、OutLook などと共有ツールで、これが、ひどく脆弱で、思ったように使えないというのが、実情なんです。配列やシートに書き出す、というのが、今は、一般的になっています。また、ある人は、FileSearchは、時間が掛かるという理由を挙げる人がいます。 だから、VBAを良く知っている人たちは、FileSearch すら、使わないという風潮があります。 別のところで書かなかった返事でもあるのですが、ExcelやOffice ネイティブ・メソッドというのは、いまひとつ信頼の置けないものがある、ということです。理屈ではなくて、経験なんですね。

oshietecho-dai
質問者

補足

忘れてました。 前回答(NO.4) >そちらでは、新しいブックは、正しくオブジェクト変数に入っているのでしょうか? book1,book2,book3,…となります。 これでは、あまりよくないのですね!

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

#2です。 > 必ず、希望順で書き込ませたい場合の条件ですが、 抽出結果をシートに書き出して見ましょう。 FileSearch がどんな規則で Fileを抽出するか解りませんが、普通にやったのでは希望順にはならないと思います。 配列やシートで一旦受けてソート後にそのリストを元に実行するなど、何らかの工夫が必要だと思いますが、これまでの経緯から、失礼ながら現在の貴殿の技量では改修は無理だと思います。 ちなみに #4さんが指摘されているように Set mySvWb = Workbooks(2) は危ういコードです。 おそらく、ThisWorkbookが Workbooks(1) の環境だと Workbooks.Add で 作られたブックが Workbooks(2) になると言う事なのでしょう。 でも個人用マクロブックを利用している場合の Workbooks(2) は Thisworkbook になるなど、実行する環境で Workbooks(2)は異なります。  Workbooks.Add  Set mySvWb = Workbooks(2) ここの2行は  Set mySvWb = Workbooks.Add とする方が恐らく問題が少ないと思われます。 Call なら可能と言うのは、"C:\DATA" の部分を書換えた Sub CSVtoXLS を複数用意し、それを順次実行する Sub を作る事を意味するものと推測しています。 ちょっと泥臭いですが、CSVtoXLS を ※ のように書換えてから Sub CSVtoXLS(myFolder as String)     '※ Dim myFS As FileSearch Dim mySvWb As Workbook Dim i As Long  ChDir myFolder             '※  Set myFS = Application.FileSearch  With myFS   .LookIn = myFolder          '※     ・     ・     ・ '------------------------------------------------ Sub aaa()   Call CSVtoXLS("C:\DATA\F1")   Call CSVtoXLS("C:\DATA\F2")   Call CSVtoXLS("C:\DATA\F3") End Sub のような感じにしたら如何でしょう?(未確認) 何でも「ボタンひとつで」を目指しているは結構ですが、寄せ集めで意味もまったく解らず、自分で簡単なメンテナンスも出来ないようでは業務では怖くて使い物にならないと感じます。 少しはコードの意味を理解出来るように学習する方が先決だと思います。

oshietecho-dai
質問者

お礼

ご回答どうも有難うございます。 はい、おっしゃられる通りでございます。 ただ、ご指示された通り、普通に実行(サブフォルダ内に複数ファイル、"cmd*"の「*」が1,2,3,…)してみましたが、希望順通り(エクスプローラ画面の、名前順の通り)に書き込まれてます。(まだ多くは試みてはいませんが、同ファイルなら何度か試みました) ですので、いったいぜんたい、どんな時に、順番違いになるのかが知りたかったわけございます。 ご指示された通り、「問題が少ない」方法をとりたいと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 すでに解答としては出ていますが、  With myFS   の下に、  .SearchSubFolders = True   を加えることとですが、 >Call を使用すれば、出来ますが、 本当にそうですか? このコードは、そんなに癖の強いものではありませんので、あえて書かせていただきます。 コードの一部が隠されているので見当が付かない部分がありますが、 Workbooks.Add Set mySvWb = Workbooks(2) ここの部分が分かりません。少し、ここが雑です。今、コードを動かしみると、Workbooks(2) は、自ブック(ThisWorkbook)になっていました。本来、こういう場面で、Index は使ってはいけないのですね。 Workbooks.Add をしておいて、違うブックの変数を取るというのは、良く理解できないコードです。 そちらでは、新しいブックは、正しくオブジェクト変数に入っているのでしょうか? それに、その後もヘンです。たぶん省略してあるせいだと思いますが、 >検索結果が0なら >MsgBox "検索条件を満たすファイルはありません。" いきなり、そこに結びついても、上には、その判断する条件構文がありませんから、奇妙に感じます。 FileSearch を使って、Call で問題ないとおっしゃるなら、それ以上は、こちらは何も言えません。

oshietecho-dai
質問者

お礼

遅くなり申し訳ございません。 どうも有難うございます。 けっこうコードが長かったものですから、省略してしまいました。 実行の度に、新しいブックが追加されていきます。 ご指摘された部分は、 今後、学習していきたいと思います。

  • NCU
  • ベストアンサー率10% (32/318)
回答No.3

追加情報をお願いします。 1.よそのサイトにあったものをここにそのままコピーすることについて、原作者の了解は得ていますか? 2.質問14回、回答0回との事ですが、いつもこんな事ばかりされているのですか? 回答はなさらないのですか?

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

> Call を使用すれば、出来ますが、Call を使用しないで実行するには > どのように編集すればよろしいですか? Call を使えばできるなら、それで良いのでは? なぜ既にできているのに、Call を使わないで実行する必要があるのですか? ご質問の趣旨はどこにあるのでしょうか?

oshietecho-dai
質問者

補足

どうも有難うございます。 うまく説明できなかったかも知れませんが、当Call は、 当マクロを丸々3つ作成し、Call するということでございます。 (No.5で推測されてしまっておりました) なんとなく、重くなるような気がしたためでございます。

関連するQ&A