[[20140723113049]] 『他ブックのシート名を検索し印刷したい』(mieko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『他ブックのシート名を検索し印刷したい』(mieko)

お世話になります。

 ブックが5つあり、それぞれが同じ形式で、同じ表が入力されシート名は
 m"月"d"日"(aaa)の形式でになっております。
 それらとは別に一覧ブックにそれぞれのブックへのハイパーリンクを作成し
 そこから、5ブックへアクセスしております。
 毎日5ブックそれぞれの明日の日付シートを3枚ずつ印刷しているのですが
 (明日の日付があるブックのみ)
 その作業をマクロに登録し自働化できないでしょうか?
 つまり、一覧ブックのマクロボタンを押すと
 5つのブックのシートを検索し、明日の日付があれば
 そのシートを3枚ずつ印刷印刷できるようにしたいのです。
 (各シートは印刷プレビューで印刷部分の指定をしてあります)
 仮に検索先のブックをAブックとし、それに対する日付の検索後に
 3枚の印刷をするマクロを教えて頂ければ助かります。
 よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 処理する時点での環境に左右されそうなので、とりあえずマクロは新規ファイルに、
 対象のファイルはすべて閉じている前提でのサンプルです。

 Sub Sample()
    Dim printFiles
    printFiles = Array( _
        "C:\Data\printFile1.xlsx", _
        "C:\Data\printFile2.xlsx", _
        "C:\Data\printFile3.xlsx", _
        "C:\Data\printFile4.xlsx", _
        "C:\Data\printFile5.xlsx")

    Dim tWsName
    tWsName = Format(Date + 1, " m""月""d""日""(aaa)")

    Dim pFile
    Dim ws As Worksheet
    For Each pFile In printFiles
        With Workbooks.Open(pFile) '// ★ここから
            For Each ws In .Worksheets
                If ws.Name = tWsName Then ws.PrintOut Copies:=3
            Next
            .Close False
        End With '// ★ここまで
    Next
 End Sub

 >仮に検索先のブックをAブックとし、それに対する日付の検索後に
 >3枚の印刷をするマクロを教えて頂ければ助かります。

 は★部分になります。

(Mook) 2014/07/23(水) 19:27


MooK様
 返信ありがとうございます。
 教えていただいたマクロを標準モジュールに登録して動かしてみましたが、
  With Workbooks.Open(pFile) の部分でエラーがでてしまいました
 「実行時エラー1004」「Openメソッドは失敗しましたWorkbooksオブジェクト」
 という内容でした。
 >>仮に検索先のブックをAブックとし、それに対する日付の検索後に
 >>3枚の印刷をするマクロを教えて頂ければ助かります。
 >は★部分になります。
 単純に日付を検索して印刷したかったのですが
 私が余計なことを加えたから何か誤解を招いたのでしょうか。。。
 お手数をお掛けします。
 頼りっきりで申し訳ありませんが、
 よろしくお願いします。
(mieko) 2014/07/24(木) 08:37

 一応念のための確認ですけれど、初めの printFiles のファイルパスは実際のファイルに
 書き換えてから実行しているでしょうか(このままでは動かないです)。
(Mook) 2014/07/24(木) 09:25

Mook様
 返信ありがとうございます。
 はい。フルパスに置き換えており、マクロを動かすと
 それぞれのブックが開いては閉じているので、きちんと
 指定できていると思います。
 お手数をお掛けします。
(mieko) 2014/07/24(木) 10:06

 >それぞれのブックが開いては閉じているので、きちんと
 >指定できていると思います。
 了解しました。

 ですが、そうであるとすると、
 >「実行時エラー1004」「Openメソッドは失敗しましたWorkbooksオブジェクト」
 の現象と矛盾する気がするのですが、エラーはすべてのファイルで起きるのでしょうか。
 それとも特定のファイルでしょうか。

 印刷は、一回も実行されないでしょうか。

 まずは STEP 実行して、どこまで進んでいるか(ループの初回?2回目以降?) 、
 あるいはエラー時のファイル名を確認できるでしょうか。
 (黄色い行で 変数にマウスを持っていくと出ると思います。)
(Mook) 2014/07/24(木) 10:59

Mook様
 大変申し訳ありません。私のフルパスの入力ミスでした。
 入力をやり直したら、最後までエラーなく動きましたが
 なぜか印刷はされません。
 シートには確かに明日の日付(7月25日(金))が入っております。
 何度か試しましたが…印刷はされませんでした。
 何か私が伝え方を間違っているのかもしれません。
 マクロは一覧ブックに入れてあり、検索・印刷の対象は
 そのブックとは別のA〜Eの5ブックです。
 一覧ブックのマクロボタンを押すと、A〜Eのブックが一つずつ開いて閉じます。
 しかし、印刷は実行されませんでした。(エラーも出ません)
 お手数をお掛けします。
(mieko) 2014/07/24(木) 12:58

 シート名は数字・括弧の全角半角、スペースの有無を含めて完全一致しないと「同じ」と
 識別しませんが

    tWsName = Format(Date + 1, " m""月""d""日""(aaa)")
    MsgBox tWsName

 として表示確認してみて、シート名と完全に一致しているでしょうか。

(Mook) 2014/07/24(木) 15:12


MooK様
 メッセージボックスが出ましたがシート名と同じでした。
 どうしてでしょうか??
 シート名はマクロでD1から取得しています。
 それが影響している可能性はありますか?
 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 If Target.Address = "$D$1" Then Sh.Name = Target.Text
 End Sub
 D1はm"月"d"日"(aaa)の書式になっております。
 試しにシート名を手入力してみましたが数字・括弧を半角・全角など
 試してみましたが、やはり印刷されませんでしたので、このマクロは
 関係ないかと思いますが…。
 Dim pFile
    Dim ws As Worksheet
    For Each pFile In printFiles
        With Workbooks.Open(pFile) '// ★ここから
            For Each ws In .Worksheets
                If ws.Name = tWsName Then ws.PrintOut Copies:=3
            Next
            .Close False
        End With '// ★ここまで
    Next
  End Sub
 確認ですが、ここの部分はそのままコピーでよかったでしょうか。
 他に何か原因があるのでしょうか…
 私が何かしでかしているかもしれません…

(mieko) 2014/07/24(木) 17:42


 マクロとしては
       If ws.Name = tWsName Then ws.PrintOut Copies:=3
 のコードで名前が一致するかどうかなのですが、先ほど提示されたのは
 手で打たれたのでしょうか?
 ()がコードは半角、提示のものは全角のようです。

 それではコードを下記のように変更してみてどうでしょうか。
     tWsName = Format(Date + 1, " m""月""d""日""(aaa)")
          ↓
     tWsName = Trim(StrConv(Format(Date + 1, " m""月""d""日""(aaa)"), vbNarrow))

     If ws.Name = tWsName Then ws.PrintOut Copies:=3
          ↓
     If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then ws.PrintOut Copies:=3

 これでダメなら、日付に変換して比較でしょうか。
(Mook) 2014/07/24(木) 18:20

MooK様
 マクロを変更したら、印刷できました!
 やはり私が何かヘマをしていたのでしょうか?
 半角、全角を試してみたつもりだったのですが…
 ところで、もし可能でしたらでいいのですが
 今日試した気づいたのですが(気づくのが遅くてごめんなさい)
 金曜日の場合、翌日ではなく、月曜日にしたいのですが、
 そういうことは可能でしょうか?
  tWsName = Trim(StrConv(Format(Date + 1, " m""月""d""日""(aaa)"), vbNarrow))
 ここを Date + 1WEEKDAYみたいにしてもだめですよね (^_^;) 
 何度もお手間をとらせて申し訳ありません。
(mieko) 2014/07/25(金) 08:33

 金曜日に月曜日を指定することはできますが、
 平日でも翌日が祝日だったり、月曜が祝日だった場合はどうするのでしょうか。

 そのあたりも決めてから対応を考えたほうが良いように思います。
(Mook) 2014/07/25(金) 11:25

MooK様
 おっしゃる通りです。慌て者ですいません。
 出来るならば、祭日を抜いた形で印刷できると非常に助かりますが
 可能なのでしょうか?
 何度も申し訳ありません。よろしくお願いします。

(mieko) 2014/07/25(金) 12:16


 祝日まで対応するとすると、祝日データをどこかに持って管理する必要も出てきそう
 ですが、まずはこのあたりで妥協できないでしょうか。

    Dim dt As Date
    dt = Date + 1
    If Weekday(dt) = vbSaturday Then dt = dt + 2
    If Weekday(dt) = vbSunday Then dt = dt + 1
    dt = CDate(InputBox("印刷日を指定してください。", "印刷日付確認", Format(dt, "yyyy/mm/dd")))

    Dim tWsName
    tWsName = Format(dt, " m""月""d""日""(aaa)")

 祝日対応だと、CountIf を使って、どこかに用意しておいた祝日リストに該当日がある
 場合は翌日にする。
 といった処理を書けばできると思います。
(Mook) 2014/07/25(金) 15:23

Mookさま
 すいません。教えて頂いたマクロは
 Dim pFile
     Dim ws As Worksheet
     For Each pFile In printFiles
         With Workbooks.Open(pFile) '// ★ここから
             For Each ws In .Worksheets
                 If ws.Name = tWsName Then ws.PrintOut Copies:=3
             Next
             .Close False
         End With '// ★ここまで
 この部分と差し替えるといいのでしょうか?
 まったく勉強不足ですいません。
(mieko) 2014/07/25(金) 17:13

Mookさん
 すいません。分かりました。
 Dim tWsName
    tWsName = Format(Date + 1, " m""月""d""日""(aaa)")
 と差し替えですね。
 申し訳ありません。
 今、操作できる環境でないので
 後からやってみます!
(mieko) 2014/07/25(金) 17:22

 はい。そちらと変更してください。

 一応全体にコメントを入れたので、全体の流れは確認して置いて貰えるとよいと
 思います。
 Sub Sample()
    '// 対象のファイル
    Dim printFiles
    printFiles = Array( _
        "C:\Data\printFile1.xlsx", _
        "C:\Data\printFile2.xlsx", _
        "C:\Data\printFile3.xlsx", _
        "C:\Data\printFile4.xlsx", _
        "C:\Data\printFile5.xlsx")

    '// 印刷するシートの日付
    Dim dt As Date
    dt = Date + 1  '// 仮に明日を設定
    If Weekday(dt) = vbSaturday Then dt = dt + 2    '// 土曜だったら月曜に
    If Weekday(dt) = vbSunday Then dt = dt + 1      '// 日曜だったら月曜に

    '// この日でいい?
    dt = CDate(InputBox("印刷日を指定してください。", "印刷日付確認", Format(dt, "yyyy/mm/dd")))

    '// シート名
    Dim tWsName
    tWsName = Format(dt, " m""月""d""日""(aaa)")

    Dim pFile
    Dim ws As Worksheet
    '// 各ファイルの処理
    For Each pFile In printFiles
        '// ファイルを開いて
        With Workbooks.Open(pFile)
            '// 各シートを順番に処理
            For Each ws In .Worksheets
                '// シート名が一致したら印刷
                If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then ws.PrintOut Copies:=3
            Next
            '// ファイルを閉じる
            .Close False
        End With
    Next
 End Sub
(Mook) 2014/07/25(金) 17:26

MooK様
 おはようございます。色々ありがとうございます。
 あれこれと試して見ました。
 教えてい頂いたマクロでは印刷まで至らなかったので
 tWsName = Format(dt, " m""月""d""日""(aaa)") を
 tWsName = Trim(StrConv(Format(Date + 1, " m""月""d""日""(aaa)"), vbNarrow))
 に変えたことで印刷可能でした。
 しかし、PCの日付を変更しながら試したのですが
 月〜木曜は正常に印刷されますが
 金・土曜は印刷されません。(日曜は月曜が印刷されます)
 If Weekday(dt) = vbFriday Then dt = dt + 3    '// 金曜曜だったら月曜に
 を加えてみましたが、やはり印刷されません(エラーもでません)
 金曜・土曜・日曜共にメッセージボックスには月曜日の日付がでてはいるのですが…
 どうしてでしょうか?
(mieko) 2014/07/26(土) 09:32

 > 金曜日の場合、翌日ではなく、月曜日にしたいのですが、
 とあったので、土曜・日曜でも月曜にしたいと思ったのですが違うのでしょうか?

 > 金・土曜は印刷されません。(日曜は月曜が印刷されます)
 というように作っているので、それは(私にとって)正しい動作です。
 だって、そういう処理を書いているのですから。
 >>    If Weekday(dt) = vbSunday Then dt = dt + 1      '// 日曜だったら月曜に

 いずれにせよマクロって、1行1行が目的のある処理なので、まずは STEP(F8) 実行して
 変数の中身を確認(ウォッチ ウィンドウに変数をドロップしておくと便利です)してみて
 ください。

 度々紹介させてもらっているリンク先ですが、参考になると思います。
『マクロを「書いてみた」「動かした」「ダメでした」。』
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200.html
『デバッグトレースの開始方法』
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html

 蛇足ですが、テストで印刷してるとしたら紙が勿体ないので、テスト中は
     If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then ws.PrintPreview
 や
     If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then MsgBox "【" & ws.Name & "】を印刷します!!"

 などとしておくとよいと思います。
(Mook) 2014/07/26(土) 10:29

 追加のコメント。

 >If Weekday(dt) = vbFriday Then dt = dt + 3    '// 金曜曜だったら月曜に
 もともと dt は明日の日付なので、これだと木曜に実行したときに月曜になってしまいます。

 計算結果が期待に添わなければ、確認表示で手で変更してしまえばよいのですが、
 その部分は動いているでしょうか。

 想定が違うとすると質問からは読み取れないのですが、どのように印刷したいの
 でしょうか。

 月 ⇒ 火
 火 ⇒ 水
 水 ⇒ 木
 木 ⇒ 金
 金 ⇒ 月
 土 ⇒ ??? 月曜ではない?
 日 ⇒ ??? 月曜ではない?

(Mook) 2014/07/26(土) 10:36


MooK様
 印刷したいのはご指摘通りで、月〜木までは翌日で、金は月曜です
 (金曜に月曜を印刷し、土日に月曜分を印刷することはありません)
 昨日最終のマクロを実行したのですが、金曜だと月曜が印刷されず
 テスト用に入れていた土曜日の印刷がされました。
 (表示されたメッセージは7月28日でしたが)

 Mookさんのマクロの説明に 「金曜日だったら月曜」がなかってので
 印刷されないのかと思い
 If Weekday(dt) = vbFriday Then dt = dt + 3    '// 金曜曜だったら月曜に
 を付け加えてみました。(私の勘違いだったようです。すいません)
 しかし、本日の日付にしても月曜のシートが印刷されず、
 明日の日付にしたら、月曜のシートが印刷されたので
 (翌日のシートというのだけが読み込まれているのかと思い)
 週末の処理が上手くできていないのかと思って今朝書かせて頂いた次第でした。
 STEP(F8)やってみましたが、理解には少し時間がかかりそうなので
 また少ししたらご報告します。
 何度もすいません。

(mieko) 2014/07/26(土) 13:22


Mook様
 STEP(F8)ですが
  For Each Ws In .Worksheets にカーソルを当てると 
 Worksheets = <オブジェクト変数またはwithブロック変数が設定されていません。>

 If Trim(StrConv(Ws.Name, vbNarrow)) = tWsName Then Ws.PrintOut Copies:=3には
 Ws.name =<オブジェクト変数またはwithブロック変数が設定されていません。>
 が示されます。これは正常ですか?
 Date=2014/07/25(時計を1日ずらしたため)
 dt=2014/07/28
 になっていましたが、印刷するとやはり、7月26日(土)のシートが印刷になります。
 7月28日(月)が印刷されるはずですよね…不思議です。
 どうしてでしょうか?

(mieko) 2014/07/26(土) 16:30


 どのタイミングでカーソルを当ててみているでしょうか。
 Workbooks.Open(...) の前に .Worksheets を見ても提示の表示になります。
 Worksheets は Workbook が開いている間だけ使用できるオブジェクトですから。

 基本的に変数を見るのはカーソルがあるとき(行が黄色くなったとき、もしくは処理が
 終わって次の行が黄色くなったとき)です。

 でも、土曜のシートが印刷されるのは、まったく理由がわかりません。
  印刷している部分を

  If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then
      MsgBox "シート名は【" & ws.Name & "】です。" & vbNewLine _
             "指定日付は【" & tWsName & "】です。"
      ws.PrintPreview
  End If

 としてみても、7/26 と 7/28 が表示され、表示されるシートの内容も7/26 の中身
 なのでしょうか。
(Mook) 2014/07/26(土) 23:40

Mook様
 何度もありがとうございます。
 >If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then
 >      MsgBox "シート名は【" & ws.Name & "】です。" & vbNewLine _
 >             "指定日付は【" & tWsName & "】です。"
 >      ws.PrintPreview
 >  End If
 勉強不足で申し訳ありません。これらをどこに入れればいいのでしょうか?
 何箇所か思いあたる場所に入れてみましたが
 「構文エラー」がでてしまいます。

 ステップアップですが(日付を25日にしてテストしました)
 前半では date=25日 dt=28日で正常?でしたが
 If Trim(StrConv(Ws.Name, vbNarrow)) = tWsName Then Ws.PrintOut Copies:=3 
 の部分で Ws.Name="カレンダー"   tWsName=7月26日(土) になっております
 カレンダーというのは開く対象ブックで Workbooks.Open で指定しているしーとです
 ここで26日(土)になっているのは正常でしょうか?
 何度も本当にすいません。
(mieko) 2014/07/27(日) 09:24

 すみません提示が間違っていました。

 If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then
       MsgBox "シート名は【" & ws.Name & "】です。" & vbNewLine _
            & "指定日付は【" & tWsName & "】です。"
       ws.PrintPreview
   End If

 ですね。
 これを、
     If Trim(StrConv(ws.Name, vbNarrow)) = tWsName Then Ws.PrintOut Copies:=3 
 の変わりに置いてください。
 (印刷はされなくなりますが、プレビューとメッセージが出るはずです。)

 If 文自体はすべてのシートで実行(比較)されますが、条件が一致した場合のみ Then
 の後ろの ws.Print..... が実行されます。

 書くときには1行で書けて便利なのですが、デバッグ時は条件判定の結果が見えないので
 上記のように分けた方がわかりやすいです。
 上のように変更すれば、MsgBox の行にブレイクポイント(F9)をセットしておくことで、
 F5 で実行してもそこに処理が来たときに止まる、ということもできます。
 ブレークポイントの解除は再度 F9 です。

 このあたりの詳細は先の紹介サイトにあると思うので、いろいろと試してみてください。

 でも、
 tWsName=7月26日(土)
 となっているのは計算がおかしいのではないでしょうか。
 今の実際のコードの全文を提示できますか。

 先頭のファイル名だけは
 printFiles  = Array("A","B","C","D","E")
 のように削除していいです。
(Mook) 2014/07/27(日) 09:35

Mook様
 Sub Sample()
    '// 対象のファイル
    Dim printFiles
    printFiles = Array( _
        "C:\Users\A.xlsm", _
        "C:\Users\B.xlsm", _
        "C:\Users\C.xlsm", _
        "C:\Users\D.xlsm", _
        "C:\Users\E.xlsm")

    '// 印刷するシートの日付
    Dim dt As Date
    dt = Date + 1  '// 仮に明日を設定

    If Weekday(dt) = vbSaturday Then dt = dt + 2    '// 土曜だったら月曜に
    If Weekday(dt) = vbSunday Then dt = dt + 1      '// 日曜だったら月曜に

    '// この日でいい?
    dt = CDate(InputBox("印刷日を指定してください。", "印刷日付確認", Format(dt, "yyyy/mm/dd")))

    '// シート名
    Dim tWsName
    tWsName = Trim(StrConv(Format(Date + 1, " m""月""d""日""(aaa)"), vbNarrow))

    Dim pFile
    Dim Ws As Worksheet
    '// 各ファイルの処理
    For Each pFile In printFiles
        '// ファイルを開いて
        With Workbooks.Open(pFile)
            '// 各シートを順番に処理
            For Each Ws In .Worksheets
                If Trim(StrConv(Ws.Name, vbNarrow)) = tWsName Then
                   MsgBox "シート名は【" & Ws.Name & "】です。" & vbNewLine _
                   & "指定日付は【" & tWsName & "】です。"
                Ws.PrintPreview
            End If
            Next
            '// ファイルを閉じる
            .Close False
        End With
    Next
 End Sub
 コード全体です。これを入れて動かしたら、
 やはり「シート名は7月26日です。指定日は7月26日です」と表示され
 7月26日(金)のシートがプレビューされます。
 日付を26日にしたら「シート名は7月27日です。指定日は7月27日です」と表示されます。
 ・・・・!
 自己解決できたように思います。
 2014/07/26(土) 09:32に印刷できないので置き換えたと書きました
 tWsName = Trim(StrConv(Format(Date + 1, " m""月""d""日""(aaa)"), vbNarrow))
 ここの Date がダメだったのですね! dt に直したら
 25日(金)にしても26日(土)にしても 28日のプレビューができました。
 どうでしょうか??

(mieko) 2014/07/27(日) 13:08


 そういう事のようですね。

 いろいろ試行錯誤して大変だったとは思いますが、今回やった作業が
 マクロを作る(完成させる)「デバッグ」という作業です。

 質問して回答があっても、そこで頭を使わず「できません」「こう変えたい」
 というのが延々と続く質問が多いですが、回答をもとに自分で動くように修正やアレンジ
 ができるようになってこそ、本当の意味でマクロを使っている、と言えるのだと思います。

 そういう意味で、今回は mieko さんがマクロを使って作業をしていると、胸を張って
 言えると思います。
(Mook) 2014/07/27(日) 13:52

MooK様
 長い間本当にありがとうごあいました。
 人が作ったマクロを頂いて使用することしか
 なかったのですが、Mookさんのお陰で
 少しマクロが身近になりました。
 もう少し勉強したいと思います。
 ご指導ありがとうございました。
(mieko) 2014/07/27(日) 14:39

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.