Access VBA質問箱 IV

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

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


283 / 9994 ←次へ | 前へ→

【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

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

161 hits

【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 回答[未読]

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