dポイントプレゼントキャンペーン実施中!

アクセス初心者です。
バージョンは2002を使っています。
ネットで探して詳しく分からないままプログラムしています。

フォームで印刷のコマンドボタンを作ってそのボタンをクリックすると表示されてる
1ページのみ印刷したいのですが全てのレコードが印刷されてしまいます。
どうすればいいのか教えて下さい。

下記が今現在のVBAです。

Private Sub 印刷_Click()

Dim varCopies As Variant

varCopies = InputBox("部数を数字で入力してください", "印刷部数の指定")

If Len(varCopies) = 0 Then
Exit Sub
End If

If IsNumeric(varCopies) = False Then
MsgBox "部数は数字で入力してください", vbOKOnly + vbCritical, "入力エラー"
Exit Sub
ElseIf CLng(varCopies) = 0 Then
MsgBox "部数は0以上で入力してください", vbOKOnly + vbCritical, "入力エラー"
Exit Sub
End If

If MsgBox("印刷しますか?" & vbCrLf & "部数=" & varCopies _
, vbYesNo + vbInformation, "印刷の確認") = vbYes Then

DoCmd.OpenForm "伝票", acPreview, , , acFormReadOnly
DoCmd.PrintOut acPrintAll, , , , CLng(varCopies)


DoCmd.Close acForm, "伝票"
End If

End Sub

A 回答 (5件)

No.4 です。



> ただ本当はもっと簡単でいいので下記に変更してみたのですが

どう簡単でいいのか、他人には分かりませんよ。

> メッセージボックスまではうまくいくのですが「はい」をクリックするとエラーになってしまいます。

エラーと言っても、いろいろです。
コンパイルエラー、実行時エラーの別、
エラー番号、エラーメッセージ を 正確に書くようにしましょう。

回答する側にとっては、書かれていること以外は見えないのですから。

まあ今回はおまけ。

印刷を確認して、
「はい」 なら1部印刷する、ということとします。

Private Sub 印刷_click()

If MsgBox("印刷してよろしいですか?", vbYesNo, "印刷の確認") = vbYes Then
  DoCmd.PrintOut acSelection
Else

End If

End Sub


エラーの原因は
varCopies に 0 より大きい数値を代入する過程を削除してしまったため
CLng(varCopies) の値がゼロであること。
印刷部数は 1以上でなければいけません。
省略すると、1とみなされます。

なお
> Res = MsgBox("印刷してよろしいですか?", vbYesNo, "印刷の確認")
変数、 Res、varCopies ともに宣言されていない状態になっていますね。

CLng(varCopies) を削除し忘れるようなエラーは

Option Explicit
を、モジュールの先頭に記述することで、簡単に気付くことができます。

VBE の [ツール] - [オプション:] - [編集]タブ で
「変数の宣言を強制する」 にチェックを入れておくとよいでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
出来ました。
これからはもっと詳しく分かりやすい質問を心がけたいと思います。

お礼日時:2012/06/14 16:47

確認ですが、


この 「印刷」 ボタンは 「伝票」 フォーム上にあるんですよね?

だったら、プレビューを開く必要はありません。

acSelection を指定することで、現在表示されているレコードが印刷されます。

If MsgBox("印刷しますか?" & vbCrLf & "部数=" & varCopies _
, vbYesNo + vbInformation, "印刷の確認") = vbYes Then

  DoCmd.PrintOut acSelection, , , , CLng(varCopies)

End If
    • good
    • 0
この回答へのお礼

変更したらうまくいきました!!
ネットで探してそのままコピペしたのもので何が何やらでした。
ありがとうございます。

ただ本当はもっと簡単でいいので下記に変更してみたのですが
メッセージボックスまではうまくいくのですが「はい」をクリックするとエラーになってしまいます。

Private Sub 印刷_click()

Res = MsgBox("印刷してよろしいですか?", vbYesNo, "印刷の確認")

If Res = vbYes Then
DoCmd.PrintOut acSelection, , , , CLng(varCopies)
Else

End If

End Sub

お礼日時:2012/06/13 15:59

#2です。



うわぁぁぁぁ、かぶった。
しかも#1の方の投稿から1時間もたっているのに・・・・
そんなに時間かけて書いたかなぁ????

とにかく失礼しました。
    • good
    • 0

DoCmd.PrintOut acPrintAll, , , , CLng(varCopies)


ここで acPrintAll にしているから、全ページが印刷されるのは、あなたの仕様どおりです。

特定のページだけ印刷したいのなら、このオプションを acPages にして、その後のオプションで印刷開始のページと終了のページを指定します。
acPages,1,1,,CLng(varCopies)
という具合かな。実は、このメソッドは使ったことほとんど無いのですが。

あるいは、OpenForm メソッドのところで、欲しいレコードだけ選んで、それをacPrintAllで全部印刷してもいいと思います。

それから、質問するなと言っているわけじゃありませんが、こういうオプションの意味みたいなことはヘルプに全部書いてありますから、そっち見たほうが早いですよ。だって、ここで質問したって、すぐに答が返ってくるわけじゃないでしょう?ヘルプ見れば30秒で解決です。
カーソルをPringOutにおいて、F1を押せば、ヘルプのこの項目が開きます。
    • good
    • 0
この回答へのお礼

そうなんですか。
ネットで探してそのままコピペしたのもので何が何やらでした。
ありがとうございます。
ヘルプも見るのですがよく分からなくて。。。
細かい単語(?)で何となくはわかるのですがそれをどう組み合わせればいいのかが分かりません。
もっと勉強しないとダメですね。

これとは別にテキストボックスに検索文字を入れてボタンをクリックしたらフォームに表示されるところまでは何とかしましたがその指定したレコードだけを全て印刷するにはどうしたらいいのでしょうか?
すいませんが宜しくお願い致します。

お礼日時:2012/06/13 15:58

>>DoCmd.PrintOut acPrintAll


だから、全ページが印刷されているんです。

acPrintAll ではなく acPages を指定して、<開始ページ>,<終了ページ>を指定します。

1ページ目だけでいいのであれば

DoCmd.PrintOut acPages,1,1, , CLng(varCopies)
    • good
    • 0
この回答へのお礼

そうなんですか。
ネットで探してそのままコピペしたのもので何が何やらでした。
ありがとうございます。

本当はもっと簡単でいいので下記に変更してみたのですが
メッセージボックスまではうまくいくのですが「はい」をクリックするとエラーになってしまいます。

Private Sub 印刷_click()

Res = MsgBox("印刷してよろしいですか?", vbYesNo, "印刷の確認")

If Res = vbYes Then
DoCmd.PrintOut acSelection, , , , CLng(varCopies)
Else

End If

End Sub

お礼日時:2012/06/13 15:51

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A