Access VBA質問箱 IV

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

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


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

【13018】レポートの分割 ゆう 16/5/26(木) 16:59 質問[未読]
【13019】Re:レポートの分割 かるびの 16/5/27(金) 13:00 回答[未読]
【13024】Re:レポートの分割 ゆう 16/6/1(水) 16:25 発言[未読]
【13025】Re:レポートの分割 かるびの 16/6/2(木) 11:22 回答[未読]

【13018】レポートの分割
質問  ゆう  - 16/5/26(木) 16:59 -

引用なし
パスワード
   Accessでレポートを作成して紙で印刷をして配布しているのですが、
PDFに出力してファイルを作成したいと考えています。

元々のVBAは下記のとおりです。
パターン別に出力するレポートが違っていてレポートは、個人・法人IDで
グループ化して個人毎、法人毎に明細書が出るようになっています。
また、全てのレポートは共通のQ_データ一覧と言うクエリーからデータを
参照しています。
PDF作成の際にこのグループ化されている個人・法人ID毎に分割してそれぞれの
IDが付いたPDFに出力したいと思います。

どなたかご教示ください。
よろしくお願い致します。


Private Sub 印刷_Click()
On Error GoTo Err_印刷_Click

  If data_chk Then
    Select Case Me![振込先区分]
      Case "1" '口座振込み
        If Me![種別内容] = "実績" Then
         DoCmd.OpenReport "個人実績明細", acViewNormal, , wk_where
        Else '登録
         DoCmd.OpenReport "D302R_012", acViewNormal, , wk_where
        End If
      Case "2" 'カード返金
        If Me![種別内容] = "実績" Then
         DoCmd.OpenReport "個人実績明細(カード)", acViewNormal, , wk_where
        Else '登録
         DoCmd.OpenReport "D302R_022", acViewNormal, , wk_where
        End If
      Case "4" '法人
        If Me![種別内容] = "実績" Then
         DoCmd.OpenReport "法人実績明細", acViewNormal, , wk_where
        Else '登録
         DoCmd.OpenReport "D302R_032", acViewNormal, , wk_where
        End If
      Case "HM" 'A社
        If Me![種別内容] = "実績" Then
         DoCmd.OpenReport "個人実績明細", acViewNormal, , wk_where
        Else '登録
         DoCmd.OpenReport "D302R_012", acViewNormal, , wk_where
        End If
      Case "SW" 'B社
        If Me![種別内容] = "実績" Then
         DoCmd.OpenReport "個人実績明細", acViewNormal, , wk_where
        Else '登録
         DoCmd.OpenReport "D302R_012", acViewNormal, , wk_where
        End If
      Case "SG" 'C社
        If Me![種別内容] = "実績" Then
         DoCmd.OpenReport "個人実績明細", acViewNormal, , wk_where
        Else '登録
         DoCmd.OpenReport "D302R_012", acViewNormal, , wk_where
        End If
    End Select
  End If
  Exit Sub

Err_印刷_Click:
  MsgBox err.Description

End Sub

【13019】Re:レポートの分割
回答  かるびの  - 16/5/27(金) 13:00 -

引用なし
パスワード
    現状は、

レポートには、全ての個人法人のデータが出力される、
それらは「個人・法人ID」フィールドの値によりグループされている

ということでしょうか。
 そして、そのレポートを、「個人・法人ID」が異なれば、異なるPDFファイルに出力したい
ということでしょうか。


 1通のレポートを分割して、PDFファイルに出力することはできません。
 なので、
「個人・法人ID」ごとに異なるレポートを作り、このレポートをPDFファイルに出力する
という方法になると思います。

 この過程を一々手動で行うのが面倒であれば、VBAによりループ処理を使って自動化するということになると思います。

【13024】Re:レポートの分割
発言  ゆう  - 16/6/1(水) 16:25 -

引用なし
パスワード
   かるびの さんレスありがとうございます。
返信が遅くなり申し訳ございません。

現在のレポートは、全ての個人法人データが出力される形になっていて、個人・法人ID別にページが分かれている状態です。

数がかなり多いのでVBAでLOOP処理できればと思っています。


▼かるびの さん:
> 現状は、
>
>レポートには、全ての個人法人のデータが出力される、
>それらは「個人・法人ID」フィールドの値によりグループされている
>
>ということでしょうか。
> そして、そのレポートを、「個人・法人ID」が異なれば、異なるPDFファイルに出力したい
>ということでしょうか。
>
>
> 1通のレポートを分割して、PDFファイルに出力することはできません。
> なので、
>「個人・法人ID」ごとに異なるレポートを作り、このレポートをPDFファイルに出力する
>という方法になると思います。
>
> この過程を一々手動で行うのが面倒であれば、VBAによりループ処理を使って自動化するということになると思います。

【13025】Re:レポートの分割
回答  かるびの  - 16/6/2(木) 11:22 -

引用なし
パスワード
   >数がかなり多いのでVBAでLOOP処理できればと思っています。

 私の回答の方針として、コードは示しません。コードを書くのは、 ゆうさんの仕事です。
 

 そこで、VBAでの考え方ですが、ループ処理の各回において行うことは、

第1に、特定の「個人・法人ID」を取得する。
第2に、当該「個人・法人ID」についてのレコードだけを表示するレポートを開く。
第3に、出力先PDFファイル名を生成する。
第4に、このレポートをPDFファイルに出力する。

です。


 第1の、特定の「個人・法人ID」を取得するためには、
処理する「個人・法人ID」の一覧、ただし重複のないものを得る必要があります。
 これには、そのようなクエリ(Q_ID一覧)を作ります。
 そのためには、SQLで言えば、DISTINCT を使いますが、クエリをデザインビューで作るなら、
「クエリ プロパティ」における「固有の値」プロパティを使います。


 次に、「Q_ID一覧」における「個人・法人ID」フィールドの各セルの値を取得する必要があります。
 これには、レコードセットを使います。
 「Q_ID一覧」をレコードセットとして取得することになります。
 具体的なコードを示すと、

 Dim db as DAO.Database
 Dim rs as DAO.Recordset

 Set db = CurrentDB
 Set rs = db.Openrecordset("Q_ID一覧",dbOpenDynaset)

です。
 「Q_ID一覧」は、レコードセットとして、rs 変数に格納されます。

 なお、ADOのレコードセットを取得する方法もありますが、私は、ADOは使ったことがないので、
うまくアドヴァイスできません。

 そして、「Q_ID一覧」における「個人・法人ID」フィールドの各セルの値は、
   rs.Fields("個人・法人ID").Value
というコードにより取得できます。

 ここでは、どこをループに入れ、どこをループに入れないかはよく考えてみてください。


 第2の、特定の「個人・法人ID」についてのレコードだけを表示するレポートを開く方法としては、
まず、レポートのレコードソースをその都度設定する方法があります。
 つまり、特定の「個人・法人ID」についてのレコードだけを表示するようなクエリを、SQL文で書き、
そのSQL文をレポートのレコードソースに設定する方法です。
 次に、レポートのフィルタを使う方法があります。
 さらに、OpenReport メソッドの第4引数を指定する方法があります。

 最後の方法が最も手軽でしょう。


 第3の処理、つまり、出力先PDFファイル名を生成することについてですが、
個々の個人・法人IDが取得できていれば、これにあれこれの文字列をつなげて、
ファイル名を生成することになります。


 第4の処理、つまり、PDFファイルへの出力ですが、
OutputTo メソッドを使うらしいです。
 OutputTo メソッドは、2007からの新機能なので、未だに2003を使っている私は、全く疎いです。


 ここで、レコードセットから個々の「個人・法人ID」を取得することに話を移します。
 「 rs.Fields("個人・法人ID").Value 」というコードにより、個々の「個人・法人ID」を取得できるとしても、それはどの行の「個人・法人ID」なのでしょうか。
 答えは、「Q_ID一覧」の先頭行の「個人・法人ID」です(厳密に言うと、ちょっと違うけど)。
 ループ1回目は、「Q_ID一覧」の先頭行の「個人・法人ID」を取得するとしても、
ループ2回目も「Q_ID一覧」の先頭行の「個人・法人ID」を取得するのでは、困ってしまいますよね。
 では、どうやったら、「Q_ID一覧」の次の行の「個人・法人ID」を取得できるのでしょうか。
 そのためには、レコードセットに対して MoveNext メソッドを使います。
 このメソッドを使うと、レコードセットにおける次の行の「個人・法人ID」を取得できます。


 さらに次の問題です。 
 レコードセットに対して MoveNext メソッドを使って、次々と「個人・法人ID」を取得するとしても、その終わりは、どうやって認識したらいいのでしょうか。
 言い方を変えると、いつまでループを続けるのかということです。
 それは、レコードセットが終わるまでということになるわけですが、
ループ化のところだけをコード化すると、

Do Until rs.EOF = True
  (ここにループ各回で処理するコードを書く)
Loop

というコードを書くことになります。

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