- ベストアンサー
教えて!エクセルでの印刷マクロ
シート1に下のようなデータベースがあります。 受付番号 氏名 〒 住所 1 2 3 データを1から順に入力して、入力内容が日によって違いがあるのですが、入力した分だけ印刷できるマクロがわかりません。 前日、1から15まで入力して印刷、今日は16から50まで入力して、その分(16~50まで)を印刷(前日印刷した分は印刷しない)、次の日は50件入力(印刷は51~100まで)となるようなマクロです。 どなたか、ご教授くださいませ。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 印刷できて”0件印刷しました。”になってしまいます。 提示したコードでは、そんなことは、絶対あり得ません。 「指定事項」以外のコードを<<変更>>したとしか考えられませんよ。 指定項目を1個追加しましたので、これでテストしてみてください。 今度のは、指定事項だけで設定出来ますので、他のコードは、変更しないでください。 Sub 最終処理分印刷() '----- 印刷範囲 列指定 --------- Const Sh = "Sheet1" ' <----- シート名指定 Const Left_Col = "A" ' <------ 印刷範囲の左端列 Const Right_Col = "P" ' <----- 印刷範囲の右端列 Const Target_Col = "O" ' <----- 印刷データ判定列(日付形式) Const Prev_Mode = 0 ' <----- 0 = 直接印刷 / 1 = プレビュー '------------------------------ Dim TopRw As Long Dim EndRw As Long Dim Target_Date As Date Dim N As Long With Worksheets(Sh) EndRw = .Range(Target_Col & "65536").End(xlUp).Row If Not IsDate(.Range(Target_Col & EndRw).Value) Then MsgBox "印刷するデータがありません。 終了します。" Exit Sub Else Target_Date = .Range(Target_Col & EndRw).Value End If TopRw = EndRw Do While .Range(Target_Col & TopRw).Value = _ .Range(Target_Col & TopRw).Offset(-1).Value TopRw = TopRw - 1 If TopRw = 1 Then Exit Do Loop N = EndRw - TopRw + 1 .PageSetup.PrintArea = Range(Left_Col & TopRw & _ ":" & Right_Col & EndRw).Address If Err.Number > 0 Then MsgBox "プリンターの準備が、出来ていません。" Exit Sub End If If Prev_Mode = 1 Then .PrintOut preview:=True Else .PrintOut preview:=False MsgBox Target_Date & " 入力分を " & N & _ " 件 印刷しました。", , "印刷完了" End If .PageSetup.PrintArea = False End With End Sub
その他の回答 (3)
- ja7awu
- ベストアンサー率62% (292/464)
> メッセージボックスに件数に関係なく”0件印刷しました。”と表示されます。 「印刷されたのに」0件 ということですか? それとも、印刷されるべきデータがあるのに「印刷されずに」ということですか。 ちょっと考えれませんが、もう一度、コードを貼り付け直してやってみてもらえませんか。 こちらで、色々検証していますが、そのような現象は、出ませんし、印刷しないのに メッセージボックスが表示になるコードには、なっていないのですが・・・ 日付データは、N列 ですよね。 N列の右にも印刷データがあるのですか? 現在は、「右端列を指定(日付データ)」で指定した列が印刷最終列にしています。 これとは、関係ありませんが、プリンターの準備が出来ていないとき、メッセージを出す ようにしましたので、下記のコードを使ってください。 Sub 最終処理日分印刷() '----- 印刷範囲 列指定 -------- Const Sh = "Sheet1" ' <------- シート名指定 Const Left_Col = "A" ' <------ 左端列を指定 Const Right_Col = "N" ' <------ 右端列を指定(日付データ) Const Prev_Mode = 0 ' <--------- 0 = 直接印刷 / 1 = プレビューモード '------------------------------ Dim TopRw As Long Dim EndRw As Long Dim Target_Date As Date Dim N As Long On Error Resume Next With Worksheets(Sh) EndRw = .Range("N65536").End(xlUp).Row If Not IsDate(.Range("N" & EndRw).Value) Then MsgBox "印刷するデータがありません。 終了します。" Exit Sub Else Target_Date = .Range("N" & EndRw).Value End If TopRw = EndRw Do While .Range("N" & TopRw).Value = .Range("N" & TopRw).Offset(-1).Value TopRw = TopRw - 1 If TopRw = 1 Then Exit Do Loop N = EndRw - TopRw + 1 .PageSetup.PrintArea = Range(Left_Col & TopRw & ":" & Right_Col & EndRw).Address If Err.Number > 0 Then MsgBox "プリンターの準備が、出来ていません。" Exit Sub End If If Prev_Mode = 1 Then .PrintOut preview:=True Else .PrintOut preview:=False MsgBox Target_Date & " 入力分を " & N & " 件 印刷しました。", , "印刷完了" End If .PageSetup.PrintArea = False End With End Sub
補足
ja7awu さま 色々とありがとうございます。 コードを貼り付け直してみたところ印刷できました。がしかし・・・ データを2~3増やして日付データをN列からO列あるいはP列になった時にコードの”N”を”O”または”P”にただ単に変更して実行したところ、印刷できて”0件印刷しました。”になってしまいます。 お力をお貸しください。
- ja7awu
- ベストアンサー率62% (292/464)
可也融通性を持たせて作成しましたが、これで如何でしょうか。 メニュー[ファイル]--->[ページ設定]--->[シート]タブで、「行のタイトル」欄に、 見出し行の部分を設定します。 例えば、見出し部分が、1行だけの場合は、$1:$1 と指定します。 標準モジュールに記述 Sub 最終処理日分印刷() '----- 印刷範囲 列指定 --------- Const Sh = "Sheet1" ' シート名指定 Const Left_Col = "A" ' 左端列を指定 Const Right_Col = "N" ' 右端列を指定 Const Prev_Mode = 0 ' 0 = 直接印刷 / 1 = プレビューモード '------------------------------ Dim TopRw As Long Dim EndRw As Long Dim Target_Date As Date Dim N As Long With Worksheets(Sh) EndRw = .Range("N65536").End(xlUp).Row If Not IsDate(.Range("N" & EndRw).Value) Then MsgBox "印刷するデータがありません。 終了します。" Exit Sub Else Target_Date = .Range("N" & EndRw).Value End If TopRw = EndRw Do While .Range("N" & TopRw).Value = .Range("N" & TopRw).Offset(-1).Value TopRw = TopRw - 1 If TopRw = 1 Then Exit Do Loop N = EndRw - TopRw + 1 .PageSetup.PrintArea = Range(Left_Col & TopRw & ":" & Right_Col & EndRw).Address If Prev_Mode = 1 Then .PrintOut preview:=True Else .PrintOut preview:=False MsgBox Target_Date & " 入力分を " & N & " 件 印刷しました。", , "印刷完了" End If .PageSetup.PrintArea = False End With End Sub
補足
ありがとうございます。 メッセージボックスに件数に関係なく”0件印刷しました。”と表示されます。 あと少しなんですけど・・・
- ja7awu
- ベストアンサー率62% (292/464)
このデータ構成では、「今日入力した分」だと認識できるものが、何も無いから 今日入力した行を選択状態にするなどして、マクロを実行しなければなりません。 それを無くし、効率的に、印刷するためには、[受付日]の項目を設けたら如何でしょうか。 そうすれば、印刷対象日を指定して印刷することが、出来るようになります。 その辺の識別の方法が、はっきりすれば、サンプルコードを提示できるかも知れません。
補足
ja7awuさんアドバイスありがとうございます。 シート1の項目欄最後(N列)に処理日(データの入力日と考えていただければ)を入力項目があります。 サンプルコードの提示よろしくお願いいたします。
お礼
何度も何度もすみませんでした。出来ました。 指定事項のみ変更でよかったのですね。 コードの中の"N"も変更したからのようです。VBA素人の質問にお付き合い頂きありがとうございました。