|
>数がかなり多いので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
というコードを書くことになります。
|
|