• ベストアンサー

ExcelVBAの詳しい方教えてください。

下のマクロが書かれているエクセルファイルがあるフォルダー内のエクセルファイルを全て印刷するマクロを組んだつもりですが、上手く動きません。 結構悩んだのですが、自力で解決できそうに無いので、どなたか?助けていただけないでしょか? 宜しくお願いいたします。 If .ExecuteSortBy:=msoSortByFileName,SortOrder:=msoSortOrderAscending) > 0 Then   For icount = 1 To .FoundFiles.Count Workbooks.Open FileName:=.FoundFile(icount) ActiveSheet.PrintOut ActiveWindow.Close savechanges:=False Next icount Else MsgBox "検索条件を満たすファイルはありません。" End If

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

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

> プログラムに限らすマクロでも、美的センスって言うか?品って > 言うか?が現れますね? 以下のツールを使ったり、私が気をつけていることを紹介しておき ます。 【ツールの紹介】 ・Vector【VbePlus(ブイビーイープラス) 1.01】 http://search.vector.co.jp/search?query=VBE+Plus コードの整形を補助する VBE (VBAの開発環境)のアドインです。 非常に便利です。 ・インストラクターのネタ帳【変数のプレフィックス一覧】 http://www.relief.jp/itnote/archives/001268.php 変数名は一定の命名規則に従って名づけます。これは非常に有効で、 コードの可読性が高まります。 【読みやすいコードを書くために】 ・コードのインデント(字さげ) プログラムの基本は「きちんと字下げする」です。これができている プログラムとそうでないプログラムでは、可読性が全く異なります。 可読性が高い=『メンテナンス性が高い』ということです。   '字さげされていない例)   IF Range("A1").Value=1 Then   Msgbox "A1 は 1 です"   Else   Msgbox "A1 は 1 以外です"   End IF   '字さげされた例)   IF Range("A1").Value=1 Then     Msgbox "A1 は 1 です"   Else     Msgbox "A1 は 1 以外です"   End IF ・WEB へのコード投稿について VBE からコードをペーストする前に、テキストエディターで半角SP 2個を全角SP1個に置換してから、投稿するとインデントが保たれ ます。WEB 閲覧者にとってもコードが読みやすくて良いと思います。 特に マクロ に関するご質問では、回答者の方々が読みやすいコード に整形して投稿すると、解析がし易く、素早いレスが期待できます。

wan_wan
質問者

お礼

大変便利なツールまで教えて頂き誠にありがとう御座います。早速、活用させて貰っております。といってもまだ、インデントだけですが。行く行くは、使いこなせればと思っております。 今後とも、宜しくお願い致します。

その他の回答 (5)

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

こんにちは。 私の伝家の宝刀を紹介いたします。 たぶん、今のところは、KenKen_SPさんだけになると思いますが。 開発の時には、涙が出るほど便利この上ないツールです。ただし、単発のプロシージャだけという人には、あまり役には立たないと思います。これは、モジュールの分散化や複数のブックでの参照設定による開発に便利なツールです。 Mz-Tools30 www.mztools.com ただし、日本語対応していません。日本語の必要性があまり感じません。 今は、これなくては、開発できないっていうくらいです。一挙に、自分の開発力がアップします。特に、検索の時に、カレントプロジェクトではなくて、プロジェクト・グループの検索が可能です。それをツリー状に表示してくれますので、すぐに、たどり着けます。他にも、便利な機能が一杯ついています。もう一年以上、これを使っています。 本当は、同類のシェアウェアを使うと、きっともっと便利かもしれないと思ったのですが、今は、このツールで大満足です。 後は、ご存知、ApiViewerですね。 http://www.activevb.de/ (英語) Rubriken →ApiViewer→Zur englischen Ubersetzung て英語になります。 これは、VBについてくるものやVectorのフリーソフトウェアと比較しても、格段に便利です。両方ともVBA用とVB用があって、私は、どちらにも入れてあります。 >VBE からコードをペーストする前に、テキストエディターで半角SP2個を全角SP1個に置換してから、投稿するとインデントが保たれます。 なお、こちらは、エディタの正規表現でスクリプト置換しています。 ^\x20 と\x20\x20 を一度に全角空白に置き換えています。 あまり、一般的ではないかもしれませんね。(^^ゞ >可読性が高い=『メンテナンス性が高い』 私は、最近、また基本に戻って、変数のやプロシージャなどの名前の付け方などを勉強しています。ハンガリアン表記法などは、私の場合は、ほとんど使いませんね。ただ、私の知っている範囲ですが、型宣言文字を、宣言に代用はしてはいけないようですね。あれは、やはり読みにくいです。 例 Dim myString& [my]と付けるのは、ローカル変数の意味ですが、これもあやふやです。(^^;

wan_wan
質問者

お礼

お世話になって降ります。 Mz-Tools30は、インストールしましたが、内容については、やはり難しいですね? とりあえずは、msgboxの自動作成ぐらいが使えると思いますが、がんばって、便利だと思えるぐらいのマクロを組みたいと考えています。また、ご伝授のほど宜しくお願いいたします。 ありがとう御座いました。

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

こんにちは。KenKen_SP です。 >デバイスドライバーの問題でしょうか? 他のアプリケーション(例えば Word )で問題なく印刷できるの であれば、コードの問題です。この点は Wendy02 さんがコメント されてますね。私も Wait 処理を入れた方が良いと思います。 コード自体は Wendy02 さんのもので大丈夫だと思いますので、それ 以外で気になった点を。 【1点目】 .LookIn = ActiveWorkbook.Path について とするとアクティブブックの存在するフォルダ内を検索するわけ ですが、アクティブブックはマクロが書かれたブックとは限りま せん。今回は、   Private Sub CommandButton2_Click() とあるので、シート上に配置したボタンでマクロを実行するので 大丈夫だとは思いますが、できれば、マクロが書かれたブックと いうことを明示的に    .LookIn = ThisWorkbook.Path とした方が安全です。 【2点目】 NewSearch メソッドについて 前回の検索条件をクリアするに、NewSearch メソッドを実行した 方が良いと思います。検索系処理のお約束です。 Set oafs = Application.FileSearch With oafs   .NewSearch 【3点目】 マクロの書かれた自己ファイルも検索される このコードは .LookIn = ActiveWorkbook.Path ですから、マク ロを実行している Excel のブックも検索されますよね。今回は ブックを開く動作がありますので、これを防止するコードを書か ないと 2重で開くことになってしまいます。 (警告が表示されますが) 例)If .FoundFiles(icount) <> ThisWorkbook.FullName Then FullName と比較して違っていれば、オープン処理するようにします。 【4点目】 FileSearch オブジェクトの信頼性について 確か Excel97~2000 の頃はショートカットが検索されてしまったり、 既に削除されたファイルが検索されたり、2重検索されたりと、問題 大有りの FileSearch オブジェクトでしたが、今はどうなんでしょ? 信頼性に不安があるので、私は実務では Dir 関数を使うか、 File System Object を使います。 【5点目】 ぶっちゃけた話 #1 の ・印刷するのは ActiveSheet だけなのですか? 問いかけ に対しレスがなかったということと、 >フォルダー内のエクセルファイルを全て印刷する ということと、コードを読む限り、 ActiveSheet.PrintOut とあるので、やっぱり印刷するのは ActiveSheet だけなんでしょ うか? それなら、ぶっちゃけた話、 1. エクスプローラーでフォルダを開く 2. ファイルの種類でソート 3. Excel のファイルををまとめて選択 4. 右クリック-[印刷] でOK! なので、マクロを組む必要性が、、、

wan_wan
質問者

お礼

大変詳しい解説とご指導ありがとう御座います。ますますの自己研鑽に役立てたいと思います。 このマクロを作ろうと思ったきっかけは、ご指摘の5点目の方法では、エラーになる(多分皆さんのご指摘の通りのウェイトの問題)ことからでした。冷静に考えれば、その時点で、ウェイトに気づくべきでした。 特に、プログラムに限らすマクロでも、美的センスって言うか?品って言うか?が現れますね?もっと、勉強したいと思いました。アクティブセル等の補足要求に対しては、一度レスを書き始めたところで、自分で確認してからと思い一度中断したことが欠落につながりました。ここにお詫び申し上げます。今後とも宜しくお願いいたします。ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

サブフォルダには対応していませんが、フォルダにある全てのブックのシートを印刷するものです。 参考にしてください。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1517036
wan_wan
質問者

お礼

ご指導ありがとう御座います。 今後は、履歴の検索も心がけたく思います。

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

こんばんは。 たぶん、問題のある点は、.FoundFile(iCount) は、.FoundFiles(iCount) の間違いです。それから、ActiveWindowというのは、良くありません。 一応、Wiat を入れて、多少でも、プリンタバッファを軽減させないと、途中で、全体がスタックしてしまうような気がしますね。 それから、この意味がわかりませんでした。生きているようには思えません。 >maxrow = Range("E1").CurrentRegion.Rows.Count '------------------------------------------ Sub FilesOpenPrint() Dim iCount As Long Dim sFileName As String sFileName = Range("A2").Value With Application.FileSearch    .LookIn = ActiveWorkbook.Path    .FileName = sFileName    .SearchSubFolders = True Range("D2").Value = .FoundFiles.Count '検索を開始、ファイル名で並べ替え、昇順 If .Execute(SortBy:=msoSortByFileName, _       SortOrder:=msoSortOrderAscending) > 0 Then For iCount = 1 To .FoundFiles.Count  s_myPrintSheets (.FoundFiles(iCount)) Next iCount Else   MsgBox "検索条件を満たすファイルはありません。" End If End With End Sub Sub s_myPrintSheets(myFoundFile As Variant) '印刷サブルーチン On Error Resume Next With Workbooks.Open(myFoundFile)   .ActiveSheet.PrintOut   Application.Wait Now + TimeValue("00:00:10")   .Close SaveChanges:=False End With End Sub 実際に印刷してみたわけではありませんので、一度、チェックしてから実行してください。

wan_wan
質問者

お礼

ご指導ありがとう御座います。 具体的にマクロまで組んで頂いて誠に恐縮に感じます。VBAはたまにしか組まないのでいつまでたっても上達しませんが、いつの日か、僕も回答する立場になりたいと思います。それまでの間、お世話になることもあると存じますので宜しくお願いいたします。 書いて頂いたマクロを手本に自己研鑽に励みたく思います。ありがとうございました。

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

こんにちは。KenKen_SP です。 > ...上手く動きません。 どのように動かないのでしょう? ・コードはもっと全体像を見せてください。  File System Object を使っているみたいですが、途中からのご提示  なので、コードの全体がつかめません。文法的なエラーやケアレス  ミスは全体像がつかめないと、発見し難いです。 ・エラーメッセージはでてきますか? どのようなエラーメッセージ  ですか? ・コードは実行されるが、希望の動作とは異なるのですか? どのように  異なるのですか? ・印刷するのは ActiveSheet だけなのですか? ・処理を行うファイルには順番があって、それは大事ですか? この辺を補足すると、レスがつくと思います。 。

wan_wan
質問者

補足

早速の回答ありがとう御座います。その後自分でも色々試してみて新たにわかったことがあります。 print.outを実行すると深刻なエラーになってExcelがフリーズします。または、クローズメソッドのエラーになります。コメントにすると希望通りの動きになります。デバイスドラーバーの問題でしょうか?プログラムの問題でしょうか?(printの使い方が間違っている?)ご指導のほどよろしくお願い致します。 Private Sub CommandButton2_Click() Dim sfilename As String Dim icount As Long Dim oafs As Object Dim maxrow As Integer maxrow = Range("E1").CurrentRegion.Rows.Count '--- 検索ファイル名のセット --- sfilename = Range("A2").Value Set oafs = Application.FileSearch With oafs .LookIn = ActiveWorkbook.Path 'ファイル検索の対象となるフォルダのセット .FileName = sfilename '検索するファイル名のセット .SearchSubFolders = True 'サブフォルダーを含め検索(=True) '検索を開始、ファイル名で並べ替え、昇順 If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then Range("D2").Value = .FoundFiles.Count For icount = 1 To .FoundFiles.Count Workbooks.Open FileName:=.FoundFiles(icount) ActiveSheet.PrintOut '←これをコメントにすると上手く行きます。 ActiveWindow.Close savechanges:=False Next icount Else MsgBox "検索条件を満たすファイルはありません。" End If End With End Sub