人に聞けない痔の悩み、これでスッキリ >>

ACCESSで明細を印刷する方法を教えて下さい。

利用環境はWindowsXP、ACCESSは2002 SP3です。

5000人程の利用者名データと、
利用者毎の利用履歴データ(1人あたり1~200件)が入ったテーブルがあります。

この度、各利用者宛てに明細を送ることになりました。

印刷する用紙と内容が決められていて、
A4縦の用紙の左上に送付先宛名と総ページ数を印刷する欄、
中段に明細行(15行まで)、
下段に中段と全く同じ明細行(お客様控え用)を印刷する欄を設けることになっています。

レポートやフォーム、サブレポート等を使えば実現できるのではないかと思っていますが、
Accessはテーブルと選択クエリーしか触ったことがなかく、方法が分からずに困っています。

実現したいことは上記の通り、
・用紙の左上には「宛名」を表示。明細が15行を超える人の場合、「現ページ/総ページ」も表示したい
・1件しか利用履歴が無い場合でも、人が変わればページを変えたい
・利用明細行は15行までとして、同じ人でも16行目以降は次ページにしたい(次ページで再び「宛名」を印字)
・明細行は全く同じものを上下に2個(最大15行×2になります)配置したい

です。

人ごとにページを変える方法は何とかできましたが、明細行の改ページが上手くいきません。
明細行のあるサブレポートの表示枠を小さくすると、表示を15行に抑えることはできますが、
16行目以降は印刷されず、次の人になってしまいます。
枠のサイズを変える以外にページを変える方法はありますか?

うまく説明できずに申し訳ありませんが、急に指示されたため、困っているところです。
なにとぞよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

前回メニュー画面の添付が出来ていなかったのであらためて添付します。


この現象はたまに発生します。 何故なんでしょうね

前回説明が足らなかったようなのであらためて
>15行分の高さのサブレポートを(2段分)用意するということでしょうか。
>下段に中段と全く同じ明細行(お客様控え用)を印刷する欄を設けることになっています。

顧客抽出TBLを基に主レポート(利用履歴RPT)
利用履歴抽出TBLを基に副レポート(利用履歴RPTSUB、利用履歴RPTSUB副)
・利用履歴RPTSUB副は利用履歴RPTSUB をコピーします。

利用履歴RPT
・ページヘッダーに送付先宛名とページ/総ページ数
ここでのページは15行単位で分割するためブロック単位でリセットされます。
最初のブロックの総ページ数は送付対象の顧客数になります
詳細欄に
・利用明細の見出しとメニューのform!メニュー!ページNo.
・利用履歴RPTSUB
・お客様控えの見出しとメニューのform!メニュー!ページNo.
・利用履歴RPTSUB副
お客様単位の総ページ数を印刷するには
顧客TBLにご利用回数フィールドを追加しこれの1/15(切上げ)を印字
「ACCESSで明細を印刷する方法を教えて」の回答画像5
    • good
    • 0

お待たせしました。


サイトのご紹介有難うございます。これから見させていただきます。

>15行分の高さのサブレポートを(2段分)用意するということでしょうか。
>>下段に中段と全く同じ明細行(お客様控え用)を印刷する欄を設けることになっています。
中段の御社用と下段のお客様控え用です

> 明細に行No.が付いていれば印字対象を15以下と15超にする
> 明細に行No.が付いていなければ明細テーブルに印刷コントロールのフィールドを追加する
利用テーブルに「ご利用回数」といったフィールドを増やして
1.今までのデータはエクセルにエキスポートして、メンテして履歴IDとご利用回数だけの
テーブルにインポートし、これで利用履歴テーブルをUPDATEする
2.新しいデータは履歴登録の仕組みに組み込む

さて本題ですが
少し仕掛けをして何とかなりそうです。
ただデータを分割処理するので後で名寄せが必要です。

1.利用履歴を行No.で分割保存する利用履歴抽出TBL 追加
  項目は利用履歴IDを外して他は同じ項目で主キー無し
2.利用履歴抽出TBLに対応する顧客抽出TBL
  項目は顧客TBLで顧客IDの主キー設定を外し
  、顧客IDのデーター型を長整数型 インデックスに重複なし
3.メインレポートの基になるテーブルを顧客抽出TBL
  サブレポート1、サブレポート2の元になるテーブルを利用履歴抽出TBL
4.レポートの起動はメニューフォーム上のレポート名のクリックイベントで
 データーを分割抽出してから起動する
5.その他 テーブルの項目名は適当に考えました。

*メインフォームに配置するボックス
・起動レポート名 ラベル
・ページNo.、開始No.、終了No. テキストボックス
これで起動レポート名をクリックする都度15行単位で分割してレポートして
ページNo.がカウントアップし次のクリックを待ちます。

*メインフォームのコード
Option Compare Database
Option Explicit
Private Sub Form_Load()
ページNo. = 1
End Sub
Private Sub 利用履歴発行_Click()
利用履歴発行RTN
ページNo. = ページNo. + 1
End Sub

Private Sub 利用履歴発行RTN()
終了No. = ページNo. * 15
開始No. = 終了No. - 14
DoCmd.SetWarnings False
DoCmd.RunSQL ("delete from 履歴抽出TBL ;")
DoCmd.RunSQL ("insert into 履歴抽出TBL(顧客ID,行No.,利用日,利用内容) " _
& " select 顧客ID,行No.,利用日,利用内容 from 履歴TBL where 行No. >= 開始No. and 行No. <= 終了No.; ")

DoCmd.RunSQL ("delete from 顧客抽出TBL ;")
DoCmd.RunSQL ("insert into 顧客抽出TBL(顧客ID) select 顧客ID from 履歴抽出TBL ; ")
DoCmd.RunSQL ("Update 顧客抽出TBL Inner Join 顧客TBL On 顧客抽出TBL.顧客ID = 顧客TBL.顧客ID " _
& "set 顧客抽出TBL.顧客名=顧客TBL.顧客名,顧客抽出TBL.郵便番号=顧客TBL.郵便番号 " _
& " ,顧客抽出TBL.都道府県=顧客TBL.都道府県,顧客抽出TBL.市区町村=顧客TBL.市区町村; ")
DoCmd.SetWarnings True
DoCmd.OpenReport "利用履歴RPT", acViewPreview
End Sub

動作確認しました。
ここの説明はきりがありませんので省かせていただきます。
ある程度ご理解いただけたらこのURLを付けて新規に質問されると
他の人の別のアドバイスも頂けるのでは
    • good
    • 0

こんばんは、色々勉強させてもらってます。



>「任意の行で改ページをしたい」
この意味が理解できなくて飛ばしました。 何か条件があるだろうと
15行を越えると次ページと理解してよろしいですね

サブレポート(主レポート内)のプロパティーの書式タグの下の方に
印刷時拡張、印刷時縮小があります。 規定値は両方とも「はい」
このときは行数によってフレームが伸縮します。

今回は印刷時縮小は「いいえ」ですね

1)印刷時拡張「はい」のままにするとフレームが伸びて全ての明細が印字されます。
控えのサブレポートがページ内に収まらないときはサブレポート単位で次ページへ移ります。

2)印刷時拡張「いいえ」にするとフレームに入らない明細は無視されます。
サブレポートのフレーム高さを15行分にして
明細の印字対象を二つに分けて印刷しては
明細に行No.が付いていれば印字対象を15以下と15超にする

明細に行No.が付いていなければ明細テーブルに印刷コントロールのフィールドを追加する
「ACCESSで明細を印刷する方法を教えて」の回答画像3
    • good
    • 0
この回答へのお礼

shinkamiさん、こんばんは。

何度もありがとうございます。

> この意味が理解できなくて飛ばしました。

すみません、私の説明が下手でした。


改ページは「顧客別」「行数別」に発生させようと思っています。


同じ「顧客」でも15行を超える利用履歴をお持ちのお客様は、
1行目から15行目はでは1ページ目に印字。
16行目から30行目までを2ページ目に印字。
31行目からは3ページ目に。といった具合です。

顧客が「Aさん」から「Bさん」に変わったら、そのタイミングでまた改ページ。


「Aさん」が35行、「Bさん」が24行の明細を持っていたとしたら、
「Aさん」は4ページ(4ページ目は5行のみ)、「Bさん」は3ページ(3ページ目は4行のみ)
としたいと考えています。

社名やロゴの入った用紙が既に印刷されていて、15行分の罫線が2段分(発送用と返送用)用意されている用紙なのです。
15行分の「空の罫線」が引かれた用紙に、うまく位置を合わせて印字したいのです。


このご回答を頂いたあと、「なるほど」と思い、
http://office.microsoft.com/ja-jp/access-help/HA …
を見てみました。

確かに、「印刷時縮小」は関係がなさそうですね。
無駄な動き(行の削除)を避けるためにも、「いいえ」にしておいたほうがよさそうです。

ただ、「印刷時拡張」が知識不足のため、うまく把握できません。

「印刷時拡張」プロパティを「いいえ」にして、
15行分の高さのサブレポートを(2段分)用意するということでしょうか。


拙いながらも試してみたところ、確かに15行目までの印字になりますが、
次ページは16行目からの印字ではなく、Bさんの1行目から印刷されてしまいます。
(つまり、16行目から35行目が無視される)

もう少しお付き合い頂ければ幸いです。

特に、

> 明細に行No.が付いていれば印字対象を15以下と15超にする
> 明細に行No.が付いていなければ明細テーブルに印刷コントロールのフィールドを追加する

の部分をどう実現したらよいのかがわかりません。
明細テーブルに、顧客ごとの明細に連番を付与して、VBAで制御するということでしょうか?

お時間があるときで結構ですので、
詳しく方法を教えて頂ければ幸甚に存じます。

宜しくお願い致します。

お礼日時:2010/09/20 23:37

こんなの初めてです。


苦し紛れでやりましたので、他にもっとよい方法があるかと思いますが

仕訳伝票テーブルと仕訳明細テーブルで試してみました。

1.仕訳伝票テーブルで単票形式の仕訳伝票レポートを作ります。
2.仕訳明細テーブルで帳票形式の仕訳明細レポートサブを作ります。
3.仕訳伝票レポートの必要な項目を詳細枠に移動します。
4.仕訳明細レポートサブを仕訳伝票レポートのサブとしてサブレポートツールを用いて
  仕訳伝票レポートに2度縦に並べて配置します。
5.サブレポートの項目見出しは表示されませんので、仕訳伝票レポートにラベルを追加します。

※仕訳伝票テーブルと仕訳明細テーブル1:n のリレーション設定し照ります。
色々勉強させていただきました。
「ACCESSで明細を印刷する方法を教えて」の回答画像2
    • good
    • 0
この回答へのお礼

shinkamiさん、ありがとうございます。

大変申し訳ありませんが、ご回答頂いた方法は私でも最初から試しています。
ただしサブレポートでは改ページが制御できません。

「任意の行で改ページをしたい」と言う点については、
「わからない」というご回答ということですね。

お時間を割いて頂きありがとうございました。

お礼日時:2010/09/20 09:29

レポートに関してはトップクラスの実力者 hatena さんのスーパーテクニックです。



明細を持つ伝票とその複写を同じページに2分割して表示する
http://hatenachips.blog34.fc2.com/blog-entry-233 …

ちょこっと修正すれば使えるでしょう。
    • good
    • 0
この回答へのお礼

bonaronさん、こんばんは。ありがとうございます。

現在の知識ではちょっと内容が難しいですが、
今日明日で頑張って理解してみます。

お礼日時:2010/09/19 00:30

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessでレポート内の繰り返しレコードの行数を固定したいです。

Accessでレポート内の繰り返しレコードの行数を固定したいです。

Access2007を使っています。

社内のフォーマットに合わせた物品購入申請書のようなものを
Accessのレポート機能を使って印刷したいと思っています。

大きく2つのテーブルから構成されます。

 (申請書テーブル)
  1文書に1レコードが該当するもの
  書類番号、申請日や申請者名、購入目的等が入ります。

 (購入物品テーブル)
  1文書に複数のレコードが該当するもの
  購入する物品の名前や金額等が入ります。
  書類番号を外部キーとして申請書テーブルとリンクします。


レポート機能で、この二つのテーブルを対象として、
(正確には、申請書テーブルはフォーム上で開いているレコードのみを対象と
 するために、クエリを仲介して)
購入物品は繰り返しにするようにすることで、ひととおり形にはなったのですが、
1つうまくいかないことがあります。

社内のもともとの手書き用フォーマットには、購入物品の記入枠が20行あります。
これは多めにつくってあるので、当然購入物品数が20以下の場合は、残りの行は
空白になっています。
しかし、Accessのレポートで作ったものは空白行がなく、おかげで購入物品件数
により「詳細」と「フッタ」の間の不自然な空白が広くなったりします。

フッタと言っても、内容的には、「上記物品の購入云々~、お願い致します。」
とかサインするエリアとかですので、繰り返しが終わったらすぐに開始をして
ほしいのです。

購入物品の数に関わらず全体の行数を20に固定する方法はありますでしょうか?

Accessでレポート内の繰り返しレコードの行数を固定したいです。

Access2007を使っています。

社内のフォーマットに合わせた物品購入申請書のようなものを
Accessのレポート機能を使って印刷したいと思っています。

大きく2つのテーブルから構成されます。

 (申請書テーブル)
  1文書に1レコードが該当するもの
  書類番号、申請日や申請者名、購入目的等が入ります。

 (購入物品テーブル)
  1文書に複数のレコードが該当するもの
  購入する物品の名前や金額等が入ります。
  書類番号...続きを読む

Aベストアンサー

レコードがない場合も用紙の最後まで罫線を出力する
http://hatenachips.blog34.fc2.com/blog-entry-17.html

レポートに関してはトップクラスの hatena さんのページです。

参考URL:http://hatenachips.blog34.fc2.com/blog-entry-17.html

Qアクセスのレポートでレコード数をカウントしたい

お世話になります。
アクセスで、クエリで抽出した結果のレコード数をカウントし、レポートに出力させたいのですが、うまくいきません。
各クエリのレコード数が、レポートを見て分かればいいのですが、
出来ればXXXX/総レコード数XXXXという形で出力できれば尚嬉しいです。

宜しくお願いします。

Aベストアンサー

ごめんなさい。
コントロールボックスじゃなくてテキストボックスですね。
変な説明になってしまいました。

まず、必要に合わせてページヘッダー
又はレポートヘッダーにテキストボックスを作ります。
そのテキストボックスにカウント関数”=Count([****])”を入力し
****に詳細にあるフィールドを何でも良いので指定します。
(何を指定しても、レコード数は同じなので何でも大丈夫だと思います。)
そうすると、そのフィールドのレコード数が
カウントされて出てくると思うのですが。

braidalさんがどのようにレポートを作っているかが
分からないので、よく分からないのですが
総レコート数というのは、抽出する前のレコード数ということでしょうか?
でも、この場合最初にも書きましたが
クエリで既に抽出されたデータだけしか
レポートには出て来ていませんので
総数=抽出されたレコード数となります。

レポートでXXXX/総レコード数XXXXというのを
表示させる方法は、分かりません。
クエリで抽出をしていなければ
(全データを表示してレポートを作っている場合)
グループフッターでグループごとにカウントさせ(上記と同じ方法です)
またレポートフッターでカウントさせる方法は出来ますが。
もしかしたら、VBAなどで出来るかもしれません・・・

詳しい方法は、こちらを参考にしてみて下さい。
また、カウントと検索するとカウント関数のやり方も分かります。
http://www.mahoutsukaino.com/ac/ac97/basic/nyumon_r3.htm

ごめんなさい。
コントロールボックスじゃなくてテキストボックスですね。
変な説明になってしまいました。

まず、必要に合わせてページヘッダー
又はレポートヘッダーにテキストボックスを作ります。
そのテキストボックスにカウント関数”=Count([****])”を入力し
****に詳細にあるフィールドを何でも良いので指定します。
(何を指定しても、レコード数は同じなので何でも大丈夫だと思います。)
そうすると、そのフィールドのレコード数が
カウントされて出てくると思うのですが。

braidalさんが...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qアクセスのレポートのヘッダーを2ページ以降にもつけるには?

アクセスでスタッフの交通費の集計をしレポートに出力しています。1ページ目に所属部署、行き先などヘッダーがあります。2ページ目にも同様のヘッダーを入れたいのですが、どうすればいいのでしょうか?初歩的な質問ですいませんが、困っています。

Aベストアンサー

レポートヘッダーにヘッダーを設定しているとレポートの最初だけ表示されます。
所属部署・行き先等のヘッダーをページヘッダーに移動してレポートヘッダの高さを0にしてください。(レポートヘッダー部に表示するラベル等があればそれに合わせて高さを設定してください。)
そうすれば各ページにヘッダーが表示されます。
ページヘッダーにある各ヘッダーを移動後レポートヘッダー・フッターに何も表示するものがなければレポートヘッダー・フッターを削除してもかまいません。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QAccess で 特定の文字の個数をしりたい

テーブルのフィールドに特定の文字があります。
たとえば、@があったとすると、1フィールド内に何個@があるか調べるにはどうしたらよいのでしょうか。

宜しくお願いします。

Aベストアンサー

個数を調べつ関数を作り、クエリから呼ぶようにすれば

よいと思います。

---
標準モジュール

Public Function cnt(wk As Variant) As Long

cnt = UBound(Split(wk, "@"))

End Function

SQL

SELECT cnt([フィールド]) AS 個数
FROM テーブル;


人気Q&Aランキング