[[20150207150227]] 『マクロで印刷設定』(SHINJI) ページの最後に飛ぶ

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

 

『マクロで印刷設定』(SHINJI)

お世話になります

 1シートに1週間分の予定表が入っています
 1日5列で1番上(3行目)の2列目に日付(m月d日(aaa))が
 5日分横にならんでいます。(1日は70列程度)
 毎日、翌日分の印刷を行っておりますが
 これをマクロで行いたいのですが可能でしょうか。
 「翌日」を検索し1日分の印刷をしたいのです。
 金曜日は月曜を印刷、土日に印刷することはありません。
 祭日があることを考え、印刷日をメッセージボックスで
 確認してから実行したいのです。
 あれこれ贅沢で申し訳ありませんが、よろしくお願いします。

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


 一日分の印刷というのは、どうやっているのでしょうか。
 現在の一日分の印刷をマクロの記録にとって、提示でないでしょうか。
(Mook) 2015/02/08(日) 13:52

MooKさん
 ありがとうございます。
 1日分でA4 2枚になるように改ページプレビューで
 設定してあり、毎日 金曜は1-2、火曜は3-4ページと
 手動で印刷しています。下は金曜に翌月曜を印刷する時のものです。
 Sub Macro1()
 ' Macro1 Macro
     ActiveWindow.SelectedSheets.PrintOut From:=1, To:=2, Copies:=1, Collate _
         :=True, IgnorePrintAreas:=False
 End Sub
 よろしくお願いします。
(SHINJI) 2015/02/08(日) 14:10


 印刷するシートはいつも同じシートなのですか?
 そうであれば、曜日に応じて印刷するページを変更するだけでもできるのでしょうか。
(Mook) 2015/02/08(日) 17:11

Mookさん
 お手数をおかけします。説明が足りず申し訳ありません。
 シートは1週1シートで、シート名はその週の月曜の日付となっています。
 (今週なら「2月9日」)
 最初のシートに「先週」「今週」「来週」のハイパーリンクを張り
 各シートにも「先週」「来週」のハイパーリンクを張り機能させています。
 毎日「翌日」の表を印刷しているのですが、PC操作苦手なスタッフがおり
 印刷のページ指定が難しいとのことで、マクロでなんとか…と思った次第です。
 あれこれ検索していたら、丁度MOOKさんが書き込んだマクロ
 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

 に当たりました。
 これは、明日の日付名のシート全体を印刷するので
 検索対象をセルにして…とか考えていたのですが
 それにしても、その後の印刷範囲指定をどうすしたら…
 と考えていたところでした。
 少し自分でも考えてみます。
(SHINJI) 2015/02/08(日) 17:35

 だいたいこの手の話で問題になるのはシート名や日付の書式に関することが多い気がします。
 シート名は手入力で入れているでしょうか。
 日付の数字は全角、半角、スペースが混在したりしていないでしょうか。 

 >設定してあり、毎日 金曜は1-2、火曜は3-4ページと
 は
 設定してあり、毎日 月曜分は1-2、火曜分は3-4ページと
 ということでしょうか。祝日は考慮していないですが、提示された条件でのサンプルです。

 Sub Sample()
    '// 印刷するシートの日付
    Dim prDate As Date
    Select Case Weekday(Date)
    Case vbFriday
        prDate = Date + 3  '// 金曜は月曜を設定
    Case vbSaturday
        prDate = Date + 2  '// 土曜は月曜を設定
    Case Else
        prDate = Date + 1  '// その他は翌日を設定
    End Select
    '// この日でいい?
    prDate = CDate(InputBox("印刷日を指定してください。", "印刷日付確認", Format(prDate, "yyyy/mm/dd")))

    If Weekday(prDate) = vbSaturday Or Weekday(prDate) = vbSunday Then
        MsgBox "土日は印刷できません" & vbNewLine _
           & Format(prDate, "m""月""d""日""(aaa)")
        Exit Sub
    End If

    '// その週の月曜
    Dim wsDate As Date
    wsDate = prDate - ((prDate - 2) Mod 7)

    '// シート名
    Dim wsName
    wsName = Format(wsDate, "m""月""d""日""")

    On Error Resume Next
    Dim prWS As Worksheet
    Set prWS = ThisWorkbook.Worksheets(wsName)
    On Error GoTo 0

    If prWS Is Nothing Then
        MsgBox "指定日付のシートがありません。" & vbNewLine _
            & "印刷日:" & Format(prDate, "m""月""d""日""") & vbNewLine _
            & "シート:" & wsName
        Exit Sub
    End If

    Dim startPage As Long
    '// 開始ページの計算
    startPage = ((prDate - 2) Mod 7) * 2 + 1
    prWS.PrintOut From:=startPage, To:=startPage + 1, Copies:=1, Collate:=True, IgnorePrintAreas:=False
 End Sub
(Mook) 2015/02/08(日) 20:18

Mookさん
 何から何まで全てうまく印刷できました。
 本当にありがとうございました。
 親切に説明を書いて頂き、全体的な流れは分かりました
 (細かい部分はこれから勉強します (^_^;))が、
 最後の
  startPage = ((prDate - 2) Mod 7) * 2 + 1
     prWS.PrintOut From:=startPage, To:=startPage + 1, Copies:=1, Collate:=True, IgnorePrintAreas:=False
 この部分の意味が難しくてわからないのですが…
 どのようになっているのでしょうか?
 お手数をおかけします。
 (時間ある時で結構です)
(SHINJI) 2015/02/08(日) 21:16

 そうですね。
 そこはちょっとわかりずらい書き方でした。

 Mod はExcel 関数でも剰余なので数式で、
 =Mod(Date() - 2, 7 ) * 2 + 1
 とすれば、確認できると思いますが、別の関数を使って
 StartPage = Weekday(Date, vbMonday) * 2 - 1
 としても同じです。

 Weekday は開始曜日(第二引数)に応じて 1 〜 7 を返す関数です。
 剰余は結果が 0 〜 6 になるので、調整が +1 と -1 で異なります。

 A列に日付、B列に下記式を入れてみたら曜日に応じた開始ページになるのがわかるかと
 思います。
 B1  =Mod(A1 - 2, 7 ) * 2 + 1
(Mook) 2015/02/09(月) 07:47

Mookさま
 丁寧な説明ありがとうございました。
 Dim startPage As Long
    startPage = ((prDate - 2) Mod 7) * 2 + 1
  ここで、印刷の最初のページを設定していたのですね!
 そして、その下で2ページ目を指定していたんですね。
 見ただけでは、全くわかりませんでした… (^_^;)
 本当に色々お世話になりました。
(takaz) 2015/02/09(月) 12:47

コメント返信:

[ 一覧(最新更新順) ]


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