プロが教える店舗&オフィスのセキュリティ対策術

シート1に下のようなデータベースがあります。
 受付番号 氏名 〒 住所
   1
   2
   3
データを1から順に入力して、入力内容が日によって違いがあるのですが、入力した分だけ印刷できるマクロがわかりません。
前日、1から15まで入力して印刷、今日は16から50まで入力して、その分(16~50まで)を印刷(前日印刷した分は印刷しない)、次の日は50件入力(印刷は51~100まで)となるようなマクロです。
どなたか、ご教授くださいませ。 

A 回答 (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
    • good
    • 0
この回答へのお礼

何度も何度もすみませんでした。出来ました。
指定事項のみ変更でよかったのですね。
コードの中の"N"も変更したからのようです。VBA素人の質問にお付き合い頂きありがとうございました。

お礼日時:2005/04/16 21:45

> メッセージボックスに件数に関係なく”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件印刷しました。”になってしまいます。
お力をお貸しください。

補足日時:2005/04/16 17:03
    • good
    • 0

可也融通性を持たせて作成しましたが、これで如何でしょうか。



メニュー[ファイル]--->[ページ設定]--->[シート]タブで、「行のタイトル」欄に、
見出し行の部分を設定します。
例えば、見出し部分が、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件印刷しました。”と表示されます。
あと少しなんですけど・・・

補足日時:2005/04/15 21:15
    • good
    • 0

このデータ構成では、「今日入力した分」だと認識できるものが、何も無いから



今日入力した行を選択状態にするなどして、マクロを実行しなければなりません。

それを無くし、効率的に、印刷するためには、[受付日]の項目を設けたら如何でしょうか。

そうすれば、印刷対象日を指定して印刷することが、出来るようになります。

その辺の識別の方法が、はっきりすれば、サンプルコードを提示できるかも知れません。

この回答への補足

ja7awuさんアドバイスありがとうございます。
シート1の項目欄最後(N列)に処理日(データの入力日と考えていただければ)を入力項目があります。
サンプルコードの提示よろしくお願いいたします。

補足日時:2005/04/12 20:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!