Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1218 / 2272 ツリー ←次へ | 前へ→

【8194】Printoutメソッドのページ指定 sim 06/7/10(月) 20:08 質問[未読]
【8197】Re:Printoutメソッドのページ指定 hatena 06/7/10(月) 23:21 回答[未読]
【8202】Re:Printoutメソッドのページ指定 sim 06/7/11(火) 10:10 質問[未読]
【8205】Re:Printoutメソッドのページ指定 hatena 06/7/11(火) 12:06 回答[未読]
【8206】Re:Printoutメソッドのページ指定 sim 06/7/11(火) 14:34 お礼[未読]
【8207】Re:Printoutメソッドのページ指定 hatena 06/7/11(火) 15:10 回答[未読]

【8194】Printoutメソッドのページ指定
質問  sim  - 06/7/10(月) 20:08 -

引用なし
パスワード
   環境: Access 2003
   Windows XP Pro

度々お世話になっております。simと申します。

現在、以下のようなコード(1.)で帳票出力処理を作成しております。
帳票を、複数のプリンターに対して、指定した開始、終了ページ数で
出力したいと考えております。プリンターはテーブルに登録されており、
開始ページ、出力ページのカラムを持っています。

この関数のprintoutメソッドにてページ指定をして出力したところ、
最初の2ページが飛ばされて印刷されてしまう状況です(例:1〜6ページを
指定すると、3〜8ページが出力される)。

留意点として、この帳票は、特定のレコードソースを持たず、Open時に読み
こんだレコードセットを、詳細_Format時に一行ずつ読み込んでレポートを
出力するつくりになっております(コード2.)。一ページに対し、レコード
セット一行が対応します。このあたりが悪さをしていると思われますが、
printoutメソッドが悪いのか、format時イベントが悪いのか切り分けが
できません。

とりあえずprintoutメソッドの使用法に間違いがあるのかと考え、投稿
させていただきました。printoutメソッドについて情報をお持ちの方、
よろしくご教示ください。

1. PrintOutメソッド使用プロシージャ

  DoCmd.openReport REPORT_NAME, acViewPreview, , , , acHidden
  DoCmd.SelectObject acReport, REPORT_NAME, True
  
  'テーブルを開く
  Set Prtcnn = CurrentProject.Connection
  Set Prtrst = New ADODB.Recordset
  
  Prtrst.Open "select * from " & TBL_NAME_PRT_PCK & " where SIYO_FLG=true order by PAGE_FROM ", Prtcnn, adOpenKeyset, adLockReadOnly
  
  Prtrst.MoveFirst
  
  Do Until Prtrst.EOF
    strPrinter = Prtrst!PRT_NM
    Set prt = Application.Printers(strPrinter)
    Set Application.Printer = prt
    
    DoCmd.PrintOut acPages, Prtrst!PAGE_FROM, Prtrst!PAGE_TO
    
    Prtrst.MoveNext
  
  Loop

  DoCmd.Close acReport, REPORT_NAME, acSaveNo

  Prtrst.Close
  Prtcnn.Close

2.帳票イベント

Private Sub Report_Open(Cancel As Integer)
  'テーブルを開く
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  rst.Open TBL_NAME_PCK, cnn, adOpenKeyset, adLockReadOnly

  rst.MoveFirst
  
End Sub

Private Sub 詳細_Print(Cancel As Integer, FormatCount As Integer)
  
  〜各処理〜
   
  rst.MoveNext
  
  If rst.EOF Then
    rst.Close
    cnn.Close
  End If
End Sub

【8197】Re:Printoutメソッドのページ指定
回答  hatena E-MAIL  - 06/7/10(月) 23:21 -

引用なし
パスワード
   レポートのレコードソースは何も設定していないのですか。(非連結レポート?)

その場合、詳細セクションは1行のみになりますが、
どのように複数ページ出力をしているのですか。

>  〜各処理〜

肝心な部分を省略されては、回答しようがありません。

【8202】Re:Printoutメソッドのページ指定
質問  sim  - 06/7/11(火) 10:10 -

引用なし
パスワード
   ▼hatena さん:
>レポートのレコードソースは何も設定していないのですか。(非連結レポート?)
>
>その場合、詳細セクションは1行のみになりますが、
>どのように複数ページ出力をしているのですか。

レコードソースを指定していないつもりでつくっていましたが、いつの間にか指定しておりました。不正確な記述で申し訳ありません。レコードソースの指定を削除しましたところ、hatenaさまのおっしゃるとおり、1件分しか出力されなくなりました。追加質問ですが、レコードソースの指定をせずに、1レコードがレポート1枚に対応した帳票(単票?)を複数ページ出力するような処理は可能でしょうか?

>
>>  〜各処理〜
>
>肝心な部分を省略されては、回答しようがありません。

長いのと必要ないかと考えたのとで、省略してしまいました。
冗長となりますが、レポートのイベントを重複部分も含めて再掲いたします。
レポートのレコードソースにはTBL_NAME_PCKが指定してあります。レコード1件と
レポート1枚は基本的に1:1の対応なのですが、レコードの内容によって
2:1の対応になる場合があります。

自分でも調査したところ、2ページ分飛ばされてしまうのは、openReport実行時と
PrintOut時共に詳細_formatが走ってしまうため?と考えています。実際OpenReportをコメントアウトしたところ、飛ばされるのは1ページに減りました。
ですがこの場合、複数プリンタから、同じ開始ページで帳票が出力されてしまいました。PrintOutメソッドは実行時に自らレポートを開いて印刷し、既にOpenしたレポートをそのまま印刷してくれるわけではないということでしょうか?

Option Compare Database
Option Explicit

Private cnn As ADODB.Connection
Private rst As ADODB.Recordset

Private Sub Report_Close()
  rst.Close
  cnn.Close
End Sub

Private Sub Report_Open(Cancel As Integer)
  'テーブルを開く
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  rst.Open TBL_NAME_PCK, cnn, adOpenKeyset, adLockReadOnly

  rst.MoveFirst
  
End Sub

Private Sub 詳細_Print(Cancel As Integer, FormatCount As Integer)
  '全てのコントロールを不可視にする
  Call setCtlVisiblePCK(0, False)
  Call setCtlVisiblePCK(5, False)
  Call setCtlVisibleBLK(1, False)
  Call setCtlVisibleBLK(2, False)
  Call setCtlVisibleBLK(3, False)
  Call setCtlVisibleBLK(4, False)

  'rst!PGBLKSUM =2かつ 次レコードの値がrst!PGBLKSUM =2
  'のとき、レポート1枚に対して2件のレコードを出力する。
  If (rst!PGBLKSUM = 2) Then
    rst.MoveNext
    If rst!PGBLKSUM = 2 Then
      '2:1
      rst.MovePrevious
      'P0,B1に値を入れる
      Call setCtlVisiblePCK(0, True)
      Call setCtlValuePCK(0)
      Call setCtlVisibleBLK(1, True)
      Call setCtlValueBLK(1, 1)
      rst.MoveNext
      'P5,B3に値を入れる
      Call setCtlVisiblePCK(5, True)
      Call setCtlValuePCK(5)
      Call setCtlVisibleBLK(3, True)
      Call setCtlValueBLK(3, 1)
      'B2,B4を不可視
      Call setCtlVisibleBLK(2, False)
      Call setCtlVisibleBLK(4, False)
    Else
      'P0,B1に値を入れる
      Call setCtlVisiblePCK(0, True)
      Call setCtlValuePCK(0)
      Call setCtlVisibleBLK(1, True)
      Call setCtlValueBLK(1, 1)
      'B2,B3,B4,P5を不可視
      Call setCtlVisibleBLK(2, False)
      Call setCtlVisibleBLK(3, False)
      Call setCtlVisibleBLK(4, False)
      Call setCtlVisiblePCK(5, False)
    End If

  Else
    'P0,B1,B2,B3に値を入れる
    Call setCtlVisiblePCK(0, True)
    Call setCtlValuePCK(0)
    Call setCtlVisibleBLK(1, True)
    Call setCtlValueBLK(1, 1)
    Call setCtlVisibleBLK(2, True)
    Call setCtlValueBLK(2, 2)
    Call setCtlVisibleBLK(3, True)
    Call setCtlValueBLK(3, 3)
    
    'B4,P5を不可視
    Call setCtlVisibleBLK(4, False)
    Call setCtlVisiblePCK(5, False)
  End If
  
  rst.MoveNext
  
  If rst.EOF Then
    rst.Close
    cnn.Close
  End If
End Sub

Private Sub setCtlVisiblePCK(i As Integer, blnVisible As Boolean)
  
  Me("UNYOBI" & i).Visible = blnVisible
  Me("ADD1" & i).Visible = blnVisible
  Me("ADD2" & i).Visible = blnVisible
     
      〜省略〜
     
End Subnd Sub

Private Sub setCtlValuePCK(i As Integer)

  Me("UNYOBI" & i) = rst!UNYOBI
  Me("ADD1" & i) = rst!ADD1
  Me("PGTEN" & i) = rst!PGTEN
  Me("PGBLK" & i) = rst!PGBLK
     
      〜省略〜
     
End Sub

Private Sub setCtlVisibleBLK(i As Integer, blnVisible As Boolean)
  
  Me("UNYOBI" & i).Visible = blnVisible
  Me("ADD1" & i).Visible = blnVisible
     
      〜省略〜
End Sub

Private Sub setCtlValueBLK(i As Integer, j As Integer)
  
  Me("BLKCD" & i) = rst("BLKCD" & j)
  Me("BLKNM" & i) = rst("BLKNM" & j)
  Me("PGBLK" & i) = rst("PGBLK" & j)
     
      〜省略〜

End Sub

【8205】Re:Printoutメソッドのページ指定
回答  hatena E-MAIL  - 06/7/11(火) 12:06 -

引用なし
パスワード
   まず、最初に、なぜ非連結レポートなのでしょうか。
その理由、目的をお聞かせいただけませんか。

個人的には、非連結レポートにはなんらメリットは
ないと思っています。


ページが飛ばされるのは、レポートヘッダーのフォーマット時で
初期化していないからだと思われます。

レポートは、プレビューから印刷したとき、
プレビューでフォーマット/印刷イベントが発生して、
印刷でもフォーマット/印刷イベントが発生します。

一例を挙げると、10ページのレポートがあり、
プレビューで、2ページまで表示させた。
その後、PrintOut で、8ページから10ページを指定して
印刷したとします。

主なイベントの発生順は、

(プレビュー開始)
 開くとき
 レポートヘッダーフォーマット時/印刷時
 詳細フォーマット時/印刷時(1ページ目)
(次ページを表示)
 詳細フォーマット時/印刷時(2ページ目)
(印刷開始 8〜10ページ指定)
 レポートヘッダーフォーマット時
 詳細フォーマット時(1ページ目)
 詳細フォーマット時(2ページ目)
 ・・・
 詳細フォーマット時(7ページ目)
 詳細フォーマット時/印刷時(8ページ目)
 詳細フォーマット時/印刷時(9ページ目)
 詳細フォーマット時/印刷時(10ページ目)
 レポートフッターフォーマット時/印刷時

とこのように複雑な動きになります。
非連結レポートをこれを完全に把握したうえでないと
コントロールし切れません。

その手間とコード量を考えたら、はるかに通常の連結レポート
のほうが楽でしょう。

【8206】Re:Printoutメソッドのページ指定
お礼  sim  - 06/7/11(火) 14:34 -

引用なし
パスワード
   ▼hatena さん:
>まず、最初に、なぜ非連結レポートなのでしょうか。
>その理由、目的をお聞かせいただけませんか。

これは現在開発中のWebシステムの一部です。

1.ブラウザ内の印刷ボタンを押下
2.データを入れたCSVファイル作成
3.CSVをクライアントにダウンロード
4.CSVをそのままMDBのテーブルにインポート
5.帳票作成、印刷

という流れで処理を行います。このとき、CSVからインポート
したデータをそのままのレイアウトで帳票作成しようと
考えていたため、帳票出力時にレコードセットをMoveさせる
必要が生じ、そのため非連結レポートという形で帳票出力を
実現しようとしておりました。

自分でも試しましたが、hatenaさんのおっしゃるとおり、非連結
ではレコードセットの制御が複雑になってしまいますね。CSV
ファイルの出力仕様の方を変更して、連結レポートで実現させて
みようと思います。

勉強になりました。どうもありがとうございました。

【8207】Re:Printoutメソッドのページ指定
回答  hatena E-MAIL  - 06/7/11(火) 15:10 -

引用なし
パスワード
   MDBのテーブルにインポートできていて、
そのままのレイアウトでレポート出力なら、
連結レポートでそのままできそうなものですが、

連結レポートでも、グループ化の機能、「改ページ」プロパティ
など、一般的な機能で、かなりいろいろなことができますよ。

VBAでの、可視の制御、テキストボックスへの代入、NextRecord, MoveLayout
での制御等を使えば、たいていのことはできます。

テーブルのデータ例、そのデータ例からレポートへの出力レイアウト
を提示いただければ、意外と簡単な方法を紹介できるかもしれません。

あと、PrintOut でページ数を指定するより、
OpenReport で抽出条件を設定したほうが効率的だと
思います。

1218 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078226
(SS)C-BOARD v3.8 is Free