- ベストアンサー
Access:帳票形式を10件づつ表示する方法
いつもお世話になっております。Accessの帳票形式について教えて下さい。 行いたい事は、フォームは帳票形式とし、レコードを10件づつ表示させる事です。画面上に「次」ボタンを配置し、クリックすることで次の10件を表示したいのですが、良い方法が思い付きません。 DoCmdコマンドのGoToRecordメソッドを使い、10件区切りで移動する事はできたのですが、区切りの先頭となる11、21、31などのレコードを一番上に表示できず断念しました。 PageUp、PageDownキーのように移動できると良いのですが。 もし良い方法がありましたらご教授下さい。宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず、(既にご存知のことかも知れませんが、)レコードが10件表示できるサイズのサブフォームをメインフォームに配置すれば、レコードを10件づつ表示させることができます。 さて次に、11、21、31などのレコードを一番上に表示させる方法ですが、 (少々裏技っぽいですが、)レコードを一旦「表示させる件数+1」(ご質問の場合は11ですね)先に移動してから、一番上に表示させたいレコード(11とか21)まで戻してやればできます。 例えば現在のレコードが15なら、26まで移動して5(11まで)戻す、20なら、31まで移動して10(21まで)戻す、といった要領です。 具体的には、(次の10件に進む場合)以下のようなコードになります。 Private Sub 次の10件コマンド_Click() Dim formSub As Form, CurRec As Long, PrevNum As Long, RecNum As Long, TempPrev As Long 'サブフォームのフォームオブジェクトを取得 Set formSub = Me.サブフォームのコントロール名.Form 'サブフォームのカレントレコードを取得 CurRec = formSub.CurrentRecord 'レコードの総数を取得 RecNum = formSub.RecordsetClone.RecordCount 'レコードを行ったり来たりすることによる画面のチラツキをなくす Application.Echo False 'サブフォームにフォーカスを移動 Me!サブフォームのコントロール名.SetFocus 'レコードを11移動できない(レコード総数を超えてしまう)場合の処理 If CurRec + 11 > RecNum Then 'いくつ超えてしまうかを取得 TempPrev = CurRec + 11 - RecNum '超えてしまう分だけ、一旦前のレコードに戻る DoCmd.GoToRecord , , acPrevious, TempPrev CurRec = CurRec - TempPrev End If 'カレントレコードの1の位の値を取得 PrevNum = CurRec Mod 10 'もし1の位が0なら、レコードを前に戻る値を10にする If PrevNum = 0 Then PrevNum = 10 End If 'レコードを11前方へ移動 DoCmd.GoToRecord , , acNext, 11 '一番上に表示させたいレコードへ戻る DoCmd.GoToRecord , , acPrevious, PrevNum '画面表示を元に戻す Application.Echo True End Sub 前の10件に戻す場合は難しく考えないでも、以下のコードでよいでしょうか? Private Sub 前の10コマンド_Click() Dim formSub As Form, CurRec As Long, PrevNum As Long Set formSub = Me.サブフォームのコントロール名.Form CurRec = formSub.CurrentRecord Me!サブフォームのコントロール名.SetFocus PrevNum = CurRec Mod 10 + 9 If CurRec < 10 Then DoCmd.GoToRecord , , acFirst Else DoCmd.GoToRecord , , acPrevious, PrevNum End If End Sub (今私が使っているのは Access97 ですが、)こんな方法で経験がありますので、ベストな方法かはわかりませんが、一応「自信あり」とさせていただきます。
その他の回答 (3)
- oka123
- ベストアンサー率31% (69/219)
ご回答ありがとうございました。今までマクロは使った事がなく、レコード移動も簡単に出来て驚きました!ただ10件先のレコードに移動した際、移動先のレコードが一番上に表示される場合とされない場合がありました。帳票形式で、フォームに表示できる数が指定できると良いのですが・・・。 ----------------------------------------------- ----------------------------------------------- こんにちわ 追加です 先頭に出す方法ですが。 フォームの縦方向の大きさ(詳細エリア)を少なめにして (ヘッダー、フッターも使って全体大きさを 調整できる手もありますが) ちょうど10件表示させるおおきさにしておけば レコード選択カーソル(黒→)が11件目へ飛んだときに 下部に隠れている11件目をひっぱりあげて表示するので 先頭に11件目がくるとおもいます 選択カーソルやマウスポインターが現在見えている 場合には画面が動かずにカーソルだけが動くのですが 別区域へ移った場合は画面ごと位置移動していくという 理屈と同じことを応用します とりあえず、こ参考まで。
お礼
ご回答ありがとうございました! 詳細エリアの縦幅を調節し、10件分だけ表示する手法を試してみました。それによりますと、カレントレコードが1の時、レコード11へ移動すると、一番下にレコード11が現れてしまいます。なおレコード30とか、ある程度距離のあるレコードに移動する場合は、そのレコードが一番上に表示されました。 ちなみにこのフォームをサブフォーム化もしてみたんですが同じ結果でした。今回の手法でイケるかな?と思ってたんですが、「なんでじゃ~!」状態です・・・。 「○件単位でレコードを表示する」という操作自体それほどレアなケースではないと思うんですが~・・・。
- imogasi
- ベストアンサー率27% (4737/17069)
テストデータとして、ファイル「db6」 テーブル名を「テーブル1」とし ID 店コード 店名 1 035 新宿 2 036 渋谷 3 037 池袋 4 038 田端 5 039 板橋 6 040 ときわ台 7 041 飯田橋 8 042 御茶ノ水 9 035 市川 10 035 千葉 11 035 大宮 12 035 浦和 13 035 川越 14 035 浦安 とします。 フォーム1として、テキストボックス1つ、コマンドボタン 1つを貼り付ける。コマンドボタン(コマンド2)のイベントプロシージュアーとして Dim nr Private Sub コマンド2_Click() Set db = OpenDatabase("db6") Set rs = db.OpenRecordset("テーブル1") fn = nr MsgBox fn a = "" nr = 0 Do While Not rs.EOF rs.MoveNext nr = nr + 1 If nr > fn Then a = a & rs!店コード & rs!店名 & vbCrLf If nr = fn + 3 Then テキスト0.SetFocus テキスト0.Text = a Exit Sub End If End If Loop End Sub レコード処理は、初歩的にやっています(その都度先頭から繰り返し読みが発生する)が、数が多いとSQLでやる事になるのかも。 質問の10件は3件に変えています。MsgBox fnは参考の ために入れているので時期が来たらはずしてください。 コマンドボタンをクリックすると3件ずつ表示します。 第1レコードと最終レコードの処理を手を抜いていますが 修正してください。時間がなく済みません。
お礼
ご回答ありがとうございました!データを文字列として結合し、3行分作成する手法なんですね。今回は帳票形式での表示を行いたいと思っておりますので、ご教授頂いた手法はすぐに活用できませんが、大変参考になりました。どうもありがとうございます。
- oka123
- ベストアンサー率31% (69/219)
こんにちわ マクロ作成でおいて 「レコードの移動」機能にて レコード 次のレコード オフセット 10 とすればいいと思います (当マクロをボタンクリックイヘントで呼び出し)
お礼
ご回答ありがとうございました。今までマクロは使った事がなく、レコード移動も簡単に出来て驚きました!ただ10件先のレコードに移動した際、移動先のレコードが一番上に表示される場合とされない場合がありました。帳票形式で、フォームに表示できる数が指定できると良いのですが・・・。
お礼
ご回答ありがとうございます! 教えて頂いたコードでバッチリ要求通りの動きになりました!! 本当にありがとうございます。身の回りに知識を持つ者がいないので、こうした場でご教授頂ける事に感謝しております。また機会がありましたら、お手数ですが宜しくお願いします。