• ベストアンサー

Access:帳票形式を10件づつ表示する方法

いつもお世話になっております。Accessの帳票形式について教えて下さい。 行いたい事は、フォームは帳票形式とし、レコードを10件づつ表示させる事です。画面上に「次」ボタンを配置し、クリックすることで次の10件を表示したいのですが、良い方法が思い付きません。 DoCmdコマンドのGoToRecordメソッドを使い、10件区切りで移動する事はできたのですが、区切りの先頭となる11、21、31などのレコードを一番上に表示できず断念しました。 PageUp、PageDownキーのように移動できると良いのですが。 もし良い方法がありましたらご教授下さい。宜しくお願いします。

  • Elvin
  • お礼率91% (33/36)

質問者が選んだベストアンサー

  • ベストアンサー
  • yoisho
  • ベストアンサー率64% (331/516)
回答No.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 ですが、)こんな方法で経験がありますので、ベストな方法かはわかりませんが、一応「自信あり」とさせていただきます。

Elvin
質問者

お礼

ご回答ありがとうございます! 教えて頂いたコードでバッチリ要求通りの動きになりました!! 本当にありがとうございます。身の回りに知識を持つ者がいないので、こうした場でご教授頂ける事に感謝しております。また機会がありましたら、お手数ですが宜しくお願いします。

その他の回答 (3)

  • oka123
  • ベストアンサー率31% (69/219)
回答No.3

ご回答ありがとうございました。今までマクロは使った事がなく、レコード移動も簡単に出来て驚きました!ただ10件先のレコードに移動した際、移動先のレコードが一番上に表示される場合とされない場合がありました。帳票形式で、フォームに表示できる数が指定できると良いのですが・・・。 ----------------------------------------------- ----------------------------------------------- こんにちわ 追加です 先頭に出す方法ですが。 フォームの縦方向の大きさ(詳細エリア)を少なめにして (ヘッダー、フッターも使って全体大きさを  調整できる手もありますが) ちょうど10件表示させるおおきさにしておけば レコード選択カーソル(黒→)が11件目へ飛んだときに 下部に隠れている11件目をひっぱりあげて表示するので 先頭に11件目がくるとおもいます 選択カーソルやマウスポインターが現在見えている 場合には画面が動かずにカーソルだけが動くのですが 別区域へ移った場合は画面ごと位置移動していくという 理屈と同じことを応用します とりあえず、こ参考まで。

Elvin
質問者

お礼

ご回答ありがとうございました! 詳細エリアの縦幅を調節し、10件分だけ表示する手法を試してみました。それによりますと、カレントレコードが1の時、レコード11へ移動すると、一番下にレコード11が現れてしまいます。なおレコード30とか、ある程度距離のあるレコードに移動する場合は、そのレコードが一番上に表示されました。 ちなみにこのフォームをサブフォーム化もしてみたんですが同じ結果でした。今回の手法でイケるかな?と思ってたんですが、「なんでじゃ~!」状態です・・・。 「○件単位でレコードを表示する」という操作自体それほどレアなケースではないと思うんですが~・・・。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

テストデータとして、ファイル「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レコードと最終レコードの処理を手を抜いていますが 修正してください。時間がなく済みません。

Elvin
質問者

お礼

ご回答ありがとうございました!データを文字列として結合し、3行分作成する手法なんですね。今回は帳票形式での表示を行いたいと思っておりますので、ご教授頂いた手法はすぐに活用できませんが、大変参考になりました。どうもありがとうございます。

  • oka123
  • ベストアンサー率31% (69/219)
回答No.1

こんにちわ マクロ作成でおいて 「レコードの移動」機能にて レコード  次のレコード オフセット 10 とすればいいと思います (当マクロをボタンクリックイヘントで呼び出し)

Elvin
質問者

お礼

ご回答ありがとうございました。今までマクロは使った事がなく、レコード移動も簡単に出来て驚きました!ただ10件先のレコードに移動した際、移動先のレコードが一番上に表示される場合とされない場合がありました。帳票形式で、フォームに表示できる数が指定できると良いのですが・・・。

関連するQ&A

  • カーソルが次のレコードに移動する

    ACCESS2010を使用しています。 単票形式のメインフォームに、帳票形式のサブフォームが2つあるフォームを作成しています。 メインフォームには項目が20個程、サブフォームは共に4つ程の入力項目があります。 サブフォームとメインフォームのカーソルの移動にマウスを使用するのが面倒なので、PageUp/Donwキーを使用するようにしているのですが、PageDownキーを使用した時に何故なのか分からない現象が起きます。 入力済みのレコードを画面上に呼び出しPageUpキーを押すと、2つ目のサブフォームの入力済みレコード1件目の1個目の項目にカーソルが移動し、更にPageUpキーを押すと1つ目のサブフォームの入力済みレコード1件目の1個目の項目にカーソルが移動します。 ですが、PageDownキーをした時、1つ目のサブフォームへの移動はPageUpキーと同じ結果ですが、更にPageDownキーを押し2つ目のサブフォームに移動した時、入力済みのレコードではなく新しいレコードの1個目の項目にカーソルが移動してしまいます。 フォーム自身にもVBAにもそのような制御やコードは書いていないのですが、何故動きが異なるのかが分かりません。 ヒントになるような事でも結構です。

  • 新しいレコードの表示

    業務日報をアクセスで作成しています。 タブに個人別のサブフォームを作成してそれぞれ表示しているのですが、件数が多くなると新規でレコードを作成したい時に新しいレコードにカーソルを移動するのが大変になるので、ボタンをクリックして移動できたらと考えています。 Docmd.GotoRecord , , acNewRecord だとサブフォームの新しいレコードには移動出来ません。 もし、この方法が出来ないのであれば、新しいレコードが常に一番先頭に表示されていて、追加するたびに先頭にどんどん表示するという方法でもいいのですが、こんな事は可能なのでしょうか?

  • GoToRecord で次のレコードを表示したい

    <環境>access2007 フォームに連結のコントロールと「次へ」ボタンを配置しています。 「次へ」ボタンは次のレコードを表示する為のボタンです。 ボタンウィザードを使用したところ、以下のような動作をしました。 レコード件数は3件あると過程します。 (1)次へボタンを押下するごとに、1/3、2/3、3/3まで移動。 (2)3/3を表示している状態で、次へボタンを押下すると  新規のレコードへ移動 4/4が表示される。 (3)(2)の状態で次へボタンを押下すると、「次のレコードが存在しません」 私がやりたいことは、3/3の状態で次へボタンを押下しても、新規のレコードへ移動せず、 「次のレコードが存在しません」とメッセージを出すことです。 そこで以下のようにコーディングしました。 しかし、いまいちって感じなのでいい案がありましたらご教授お願いします。 Private Sub BTN_次へ_Click() On Error GoTo Err_Click DoCmd.Echo False DoCmd.GoToRecord , , acNext, 2 DoCmd.GoToRecord , , acPrevious DoCmd.Echo True Exit Sub Err_Click: MsgBox Err.Description DoCmd.Echo True End Sub

  • Access2003はチューニングは可能ですか?

    以下のように、レコード1件ずつ処理させるVBAをAccess2003で書いているのですが、処理が遅いです。(1件ずつなので当たり前ですが・・・) AccessやWindows2000をチューニングして、早くすることは可能でしょうか? 基本的にCPUやメモリの増設は金欠のため考えておりません。 あと、開始から終了までミリ単位で計測するVBAの書き方も知りたいです。   '開始 '先頭のレコードに移動する DoCmd.GoToRecord , , acFirst Do '処理 ' ... '次のレコード DoCmd.GoToRecord , , acNext Loop While Me.NewRecord = False   '終了

  • Access2013 帳票フォーム、1行で改行

    こんにちは Access2013を利用して 帳票フォームを作成しました。 1行入力すると、改行されて(表示がみえなくなり)次の新レコード入力となります。 PageUPボタンやスクロールバーを利用して1行目を表示する事はできるのですが 詳細セクションには充分なスペースがあるにもかかわらずこのような動作となります。 レコードソースにフィルターはかけずに全て表示させております。 どなたかご教授ください。どうぞよろしくお願いいたします。

  • ACCESSでオフセットを求める方法

    いつもありがとうございます。 ACCESS VBAで gototrecordを使用して特定のレコードに移動するというフォームを作成しています。 DoCmd.GoToRecord , , acGoTo, オフセット 教えて下さい。 別のフォームで移動したいレコードを選択・指定し、その時にオフセットを取得しておいて、別のフォームで上記のGoToRecordでそのレコードに移動するという事を実現させたいのですがオフセット値の取得方法がわかりません。 どなたか詳しい方お助け下さい。

  • ACCESS帳票フォームのレコード移動と条件分岐

    フォームのデータからWhere条件式で、合致するレコードを抽出するクエリーを作りました。 このレコードを新しく作成した帳票フォームに表示しています。 日付、商品名、項目名、変数1、変数2 この帳票からラベルを出力したいのです。 1個のレコードにフォーカスを当てた時ラベルを作成するVBAは作れたのですが、先頭から順番にすべてのレコードを検査し、変数1と変数2に値が入力されている場合のみ、そのレコードのデータからラベルを出力するということができません。 どのように構文を組んだらよいでしょうか? ACCESS2007、windows7環境です。

  • Accessの帳票データ操作

    帳票データで、Requeryをかけるとデータが一番最初に戻ってしまいます。 そこで、以下のURLを参考にプログラムの変更をしました。 http://www.accessclub.jp/bbs/0145/beginers47579.html 問題なく、レコードの表示ができるようになったのですが、欲が出てきました。 現在帳票フォームで出ているレコードは、全部で10件あります。 レコード番号  データ内容    1        ***    2        ***    ・         ・    ・         ・    10       *** そのデータをスクロールさせると、当然の事ながら10件表示のまま、次のデータが表示されます。 レコード番号  データ内容    11       ***    12       ***    ・         ・    ・         ・    20       *** カレントレコードが 12 の場合、更新ボタンを押すと レコード番号  データ内容    12       ***    13       ***    ・         ・    ・         ・    21       *** という形にずれてしまいます。(カレントレコードが1番上に来る) それを、そのままの形にするには、どのようにする方法がありますか? 今現在、表示されている1番上のデータを取得することができれば良いと思っているのですが、取得する方法はありますか? ご教示お願い致します。

  • 実行時エラー 3020の対策

    アクセス2003で次のエラーが発生します。 実行時エラー 3020 Update または CancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です。 以下のソースは、「テスト」フォームにtestフィールドがある簡単なデータベースですが、全レコードを最初から最後までtestフィールドの先頭に"abc "を付加するというものです。 Public Sub Test() Dim form_name as String Dim frmObj As Form Dim rstObj As Recordset Dim fld_dat As String form_name = "テスト" DoCmd.OpenForm form_name Set frmObj = Application.Forms(form_name) Set rstObj = frmObj.Recordset '先頭のレコードに移動する DoCmd.GoToRecord acDataForm, form_name, acFirst Do fld_dat = rstObj.Fields("test").Value fld_dat = "abc " & fld_dat rstObj.Fields("test").Value = fld_dat '<--- *** ここでエラー *** '次のレコード DoCmd.GoToRecord acDataForm, form_name, acNext DoEvents Loop While frmObj.NewRecord = False End Sub

  • レコードごとの帳票を印刷する時の問題

    レコードごとの入力画面と印刷帳票を作りました。 印刷しようと入力画面から印刷帳票のプレビューに切り替えたところ 入力画面に表示されている2件目以降のレコードではなく、1件目のレコードの プレビューが出てきてしまいます。 表示されている入力画面だけのプレビューを印刷したいのですが、 どのようにすればよろしいでしょうか? ワンボタンではできないのでしょうか?

専門家に質問してみよう