• ベストアンサー

access vba 『○○件づつ表示』を行いたい。

フォームにデータ一覧を決まった数ずつ表示させ、『次の10件』『前の10件』ボタンで、表示を切り替えたいのですが、構文をどう繋げてよいか理解できません。 今やっている事は、データにOutoNoを振り、まずフォームオープン時、SQL文ではじめの10件を抽出しています。その時、表示中データのOutoNoが一番小さいものにフラグを立てて変数にし、それを元に次の(又は『前の』)10件を抽出、と考えているのでが、、。 NEXT~FOR文を使うのかなと思うのですが、それをどう絡ませていけばよいのか分かりません。 データの最後が10で割った数にならないので、それもどうやって処理するか。 どうかご教授願います。

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

  • ベストアンサー
回答No.5

ソース見ました。 ・毎回[Q_有給]を作りなおす という構造ですね? ・Q_有給は固定 ・Q_有給からデータを10件ずつ抽出する という流れにした方が、良いと思います。 以下のSQL文で、クエリを作成してください。 ※注意!!≪全角スペースを利用しておりますので、半角に置換してください≫ クエリ[Q_有給] ------------------------------------------------------------ SELECT    M_社員.ナンバー    ,T_日数.コード    ,M_社員.氏名    ,M_社員.入社日    ,T_日数.有給付与日    ,T_日数.有給日数 FROM    M_社員    INNER JOIN    T_日数    ON M_社員.コード = T_日数.コード WHERE    IIF((M_社員.退社日) > Date(),Null,(M_社員.退社日)) IS NULL ------------------------------------------------------------ [M_社員].[ナンバー] がオートナンバーフィールドですよね。 オートナンバーのフィールドが ・1-10 ・11-20 ・21-30 と、連続しているとは限りません。 [M_社員].[退社日]の状態により、不連続なデータになります。 入力キャンセルを行った場合だけでも、不連続データが発生します。 回避するためには、表示エリアデータの起点を見つけ、その前方/後方の表示対象データのキーを取得する必要があります。 フォームの中に、以下のソースを埋め込んでください。 VBAソース ------------------------------------------------------------ Option Compare Database Option Explicit '定数 Private Const DEF_SQL_MAIN As String = "SELECT * FROM Q_有給" & vbCrLf   'メインのSQL文 Private Const DEF_AUTO_NO  As String = "[ナンバー]"            'クエリのメインキー Private Const DEF_SQL_ORDER As String = "ORDER BY " & DEF_AUTO_NO & vbCrLf 'SQLのOrderBy句 Private Const DEF_MOVE_VECT As Integer = 10                 '表示量 '列挙:移動種別 Private Enum ENM_MOVE   MV_開始   MV_戻る   MV_進む End Enum '構造体:表示領域 Private Type typ表示領域   lng開始 As Long   lng終了 As Long End Type '表示領域記憶変数 Private m表示状態 As typ表示領域    'イベント/ボタン/進む Private Sub cmd進む_Click()   Call Sub画面リフレッシュ(MV_進む) End Sub 'イベント/ボタン/戻る Private Sub cmd戻る_Click()   Call Sub画面リフレッシュ(MV_戻る) End Sub 'イベント/フォーム/開く時 Private Sub Form_Open(Cancel As Integer)   Call Sub画面リフレッシュ(MV_開始) End Sub '画面のレコードソースとボタン状態の切替を行う Private Sub Sub画面リフレッシュ( _          ByVal p_移動方向 As ENM_MOVE _         , Optional ByVal p_lng移動量 As Integer = DEF_MOVE_VECT _         )            'データ操作用   Dim strSQL As String   Dim daoDB  As DAO.Database   Dim daoRec As DAO.Recordset      'オートナンバー対策   Dim lng基準     As Long   Dim lng開始番号   As Long   Dim lng終了番号   As Long      'ボタン制御用フラグ   Dim bln戻る     As Boolean   Dim bln進む     As Boolean      '基本的にボタンは使用不可とする   bln戻る = False   bln進む = False      '基準点を得る   Select Case p_移動方向   Case MV_開始     lng基準 = 0   Case MV_戻る     lng基準 = m表示状態.lng開始   Case MV_進む     lng基準 = m表示状態.lng終了   End Select      '基準点をベースにSQLを発行   strSQL = ""   strSQL = strSQL & DEF_SQL_MAIN   strSQL = strSQL & "WHERE " & DEF_AUTO_NO & IIf((p_移動方向 = MV_戻る), "<=", ">=") & lng基準 & vbCrLf   strSQL = strSQL & DEF_SQL_ORDER   Set daoRec = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)   '取得できない   If daoRec.EOF Then     lng開始番号 = 0     lng終了番号 = 0          '終了処理へ     GoTo PGMEND   End If   '取得できた   Select Case p_移動方向   Case MV_開始, MV_進む     '先頭     daoRec.MoveFirst        If (p_移動方向 = MV_開始) Then       '開始ポイントの記憶       lng開始番号 = daoRec(DEF_AUTO_NO)     Else       '戻るボタン使用可能       bln戻る = True              '一個移動       daoRec.MoveNext       '移動し過ぎの回避       If daoRec.EOF Then         daoRec.MovePrevious       End If       '開始ポイントの記憶       lng開始番号 = daoRec(DEF_AUTO_NO)     End If     '移動:表示エリア + 1     daoRec.Move p_lng移動量     'データの存在チェックを行い、進むボタンの使用可能状態を決める     bln進む = Not daoRec.EOF     '移動:表示エリアの最後     daoRec.MovePrevious     '終了ポイントの記憶     lng終了番号 = daoRec(DEF_AUTO_NO)   Case MV_戻る     '最後     daoRec.MoveLast        '進むボタン使用可能     bln進む = True        '一個移動     daoRec.MovePrevious     '移動し過ぎの回避     If daoRec.BOF Then       daoRec.MoveNext     End If     '終了ポイントの記憶     lng終了番号 = daoRec(DEF_AUTO_NO)     '移動:表示エリア - 1     daoRec.Move -p_lng移動量     'データの存在チェックを行い、戻るボタンの使用可能状態を決める     bln戻る = Not daoRec.BOF     '移動:表示エリアの先頭     daoRec.MoveNext     '開始ポイントの記憶     lng開始番号 = daoRec(DEF_AUTO_NO)   End Select    '終了処理 PGMEND:   'データセット開放   daoRec.Close   Set daoRec = Nothing      '表示領域エリアを記憶   m表示状態.lng開始 = lng開始番号   m表示状態.lng終了 = lng終了番号   '画面の入力フィールドにフォーカスを当てる   Me.コード.SetFocus   'ボタン状態の制御   Me.cmd戻る.Enabled = bln戻る   Me.cmd進む.Enabled = bln進む   'SQLを作成   strSQL = ""   strSQL = strSQL & DEF_SQL_MAIN   strSQL = strSQL & "WHERE " & DEF_AUTO_NO & " BETWEEN " & lng開始番号 & " AND " & lng終了番号 & vbCrLf   strSQL = strSQL & DEF_SQL_ORDER   'SQLを設定   Me.RecordSource = strSQL End Sub

yukajet
質問者

お礼

できました! 別の回答で教えて頂いたように、コードを見るって勉強になりますね。 とても丁寧な解説に感謝しています。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • ALGO-9
  • ベストアンサー率66% (12/18)
回答No.4

指定件数単位に抽出するクエリを作成し、それを基に一覧形式のフォームを作成 出来上がったフォームをメインフォームへサブフォームとして埋め込み画面 は完了 後は、『次の10件』『前の10件』のイベントでSQL文を編集しサブフォームの基となっているクエリを変更し、画面をリフレッシュすればOK ※データ表示を一覧形式のフォームを利用すると仮定した場合 Event:NextBotton Dim l_OutoNo = l_OutoNo + 10 SSQL = "SELECT * FROM データテーブル WHERE Between OutoNo & CStr(l_OutoNo) & " And " & CStr(l_OutoNo + 9) SubForm_Query.SQL = SSQL Me.MainForm.SubForm.Form.F_Sub.Refresh

yukajet
質問者

お礼

回答を有難うございます。 なるほど、next forにこだわりすぎていました。勉強になります。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

SQL文の発行は、DAO?ADO? DAOなら 「Set レコードセット=CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)」 として、EOF/BOFのチェック さらに 「レコードセット.Move 移動量」 で指定のレコード位置にカーソルを移動できます。 存在するレコード以下、あるいは以上の位置にカーソルを移動しようとすると、EOF/BOFになります。 >SQL文ではじめの10件を抽出しています 現在どのような処理が行われているのか、コードが見たいです。 それにより、極力改造を必要としない方法が見つかるかもしれません。

yukajet
質問者

お礼

大変失礼しました。 まずフォームオープン時、 Dim qdf As QueryDef Dim strsql As String strsql = "" strsql = strsql & "SELECT T_日数.コード, M_社員.氏名, M_社員.入社日, T_日数.有給付与日, T_日数.有給日数, " strsql = strsql & "FROM M_社員 INNER JOIN T_日数 ON M_社員.コード = T_日数.コード " strsql = strsql & "WHERE (((M_社員.退社日)>Date() Or (M_社員.退社日) Is Null and (M_社員.ナンバー)<=10 ));" Set qdf = CurrentDb.QueryDefs("Q_有給") qdf.SQL = strsql qdf.Close Me.RecordSource = "Q_有給" です。 そして各『前ページ』『次ページ』を各コードに書かず、モジュール側で10を変数にして扱うのはどうしたら、、、と困っていたのです。 DAOも他で使っている箇所があるんですが、色々参考書を読んでみてるんですけど、いまいち明確な使い方(データを見せるだけの処理であるとか、架空のものとか)がただの抽出とどう違うのかが難しくて。 私事ですが.netも覚える事になっていて、その辺りもまた詳しく質問をさせてもらおうと思っています。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • skink
  • ベストアンサー率38% (7/18)
回答No.2

#1ですが、ざっと書いてみました。 データは配列に格納できているものとします。 「フォームに表示」の形態がわからないので、仮にテキストボックスとしました。 Private DataNum as Long   '全部のデータ数 Private DataBuff()  as String 'データを格納した配列 Private cnt As Long '「進む」ボタンクリック Private Sub cmdnext_Click() Dim i As Integer txtData.Text = "" For i = 0 To 9 If 10 * cnt + i > DataNum Then Exit Sub txtData.Text = txtData.Text & vbCrLf & DataBuff(10 * cnt + i) Next cnt = cnt + 1 End Sub '「戻る」ボタンクリック Private Sub cmdpre_Click() Dim i As Integer txtData.Text = "" cnt = cnt - 1 If cnt < 0 Then cnt = 0 For i = 0 To 9 txtData.Text = txtData.Text & vbCrLf & DataBuff(10 * cnt + i) Next End Sub

yukajet
質問者

お礼

丁寧なご回答をありがとうございます。 色んな方法を知ることができて勉強になりました。 今後も役に立ちそうです。 感謝します!!

全文を見る
すると、全ての回答が全文表示されます。
  • skink
  • ベストアンサー率38% (7/18)
回答No.1

こんにちは。 いちいち毎回10件ずつのSQLを発行するのではなく、最初に全部取得して配列に格納してしまい、 それを表示した方が楽だと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL上位n件ORDERBY 以降ORDERBY

    SQLのORDER BYについてご教授いただけますでしょうか。 例えば、10件のデータのうち、5件を指定のORDERBYで抽出し、 残り5件をORDERBYで抽出するということは可能でしょうか。 ID 名前 システムフラグ 1 AAA 1 2 BBB 1 3 CCC 1 4 DDD 1 5 EEE 1 6 FFF 2 7 GGG 2 8 HHH 1 9 III 1 10 JJJ 1 上記のようなデータがあった場合、 以下のように抽出されるようにしたいと思っています。 ID 名前 システムフラグ 1 AAA 1 2 BBB 1 3 CCC 1 6 FFF 2 7 GGG 2 4 DDD 1 5 EEE 1 8 HHH 1 9 III 1 10 JJJ 1 システムフラグが2が入っているものは、 5件からの4,5件目に表示されるようにして、 それ以降はIDの昇順で表示されるようにしたいと思っております。 5件というのは、決め打ち5件ではなく、条件によっては変わるのですが、 5件が7件となった場合は、6,7件目がシステムフラグ2のものがくるようにしたいです。 指定した件数から下2つ目がシステムフラグのものが取得したいということです。 わかりにくいと思いますが、どのようなSQLを書けば抽出できるか ご教授いただけますでしょうか。 どうぞ宜しくお願い致します。

  • アクセス2007 VBA 並べ替え

    テーブル1のフィールド1にデータを入れ それを元に帳票フォームを作成しました。 フォームヘッダー部分に 昇順ボタンと降順ボタンを作り、 ボタンを押すごとに並び替えを行いたいのですが どのようなVBAコードを書けばいいのかわかりません。 命令分としては、 「フォームに表示されるテーブル1のフィールド1データの 昇順に並べ替える」です。 SQLを使う方法ではなく、 DocmdかacCmdを使う方法が希望です。 アクセスのヘルプの ----------------------------------------- Access 開発者用リファレンス Form."OrderBy/並べ替え" プロパティ ----------------------------------------- を見ると、 ----------------------------------------- 構文 式.OrderBy 式 Form オブジェクトを表す変数です。 ----------------------------------------- と書いてありますがこの式がわからないのでご教授よろしくお願いします。

  • ACCESS2000で、サブフォームのデータを並べ替えする方法は?

    アクセス初心者+αの者です。 メインフォームを開いた時に、サブフォームにはメインとのリンク項目に該当するデータをクエリから抽出し、表示するようになっています(データによっては複数件あり)。 データ抽出は出来てますが、データの表示順がうまく出来ません。サブフォームのレコードソースSQL文にOrderBy句で指定してもダメでした。 メインフォームの並べ替えプロパティが怪しいと思ってるのですが、どのように記述すれば良いのでしょうか?(VBAでもOKです) 並び替えしたい項目は、サブフォーム内に持ってます。 情報の不足もあるかもしれませんが、よろしくお願いします。m(__)m

  • アクセスについて

    (アクセスでSQL文の抽出条件を選択するフォームを作成しました。) フォームには6個のチェックボックスがあり、必ずどれか選択しなければなりません。 フォームの右上の×ボタンを押した時、何もチェックされていなかったら、メッセージを表示して、フォームを閉じるのを中止したいのですが、うまくできません。 どなたか、ご教授お願いします。

  • Accessのコンボボックスの表示について

    今 Access2000で作っているのですが、 フォームにサブフォームを帳票フォームの中に 二つコンボボックスがあります。 そしてコンボボックス1を選ぶと 2のボックスに抽出されたリストが表示されて その中から選ぶ形になっているのですが、 サブフォームに2件目を入力すると1件目の ボックス2の中の表示が消えてしまいます。 そして1件目のボックス2にカーソルを置くと表示 されるのですが、次は2件目のボックス2が消えてしまいます。データ的には問題ないようなのですが、 なぜ、消えてしまうのでしょうか? 1、2とは別にコンボボックスが3つあります。 表示するものが多すぎるのでしょうか? よろしくお願いします。

  • Accessのサブフォームつきフォームを使い回しをしたい

    Accessでサブフォームを使っていくつかの表を表示させたいと思っています。 それで表示させたい表はテーブルは違いますがフィールドは似たようなものなので、 1つのフォーム(とサブフォーム)ですべての表を表示させたいと思っています。 つまり前の画面でどのボタンをクリックしたかによってフォームのRecordSource(SQL文)を変更したいのです。 それで色々やってみたのですがどうもうまくいきません。 1.まずどの部分でRecordSource(フォーム、サブフォーム両方とも)の設定をすればよいのかよくわからない。 2.色々試行錯誤して設定して表が表示されるようになったが、なぜかデータが1件もない時にサブフォームが表示されない(サブフォームに表のタイトルが書いてありますがそれが表示されない)。 3.それも試行錯誤してうまく表示させることができるようになったが、そこでも問題がありました、1つの表のデータだけそこで編集できるようにしたいのですがなぜか編集できません(SQL文でRecordSourceを設定していますがそのSQL文はクエリで書くと編集できます)。 もしかしたら根本的に間違っているかもしれませんので、プログラムやプロパティの設定をどのようにしたらよいか最初からご説明していただけますでしょうか?

  • アクセスについて

    アクセスのレコード数483件のテーブルをクエリーで抽出しフォームで表示しているのですが、480件しか表示出来ません、どこか作成、設定で間違えがあるのか教えてください。

  • EXCEL VBAでADOを使ってEXCELファイルよりデータを取得し

    EXCEL VBAでADOを使ってEXCELファイルよりデータを取得しています。 その際のSQL実行結果が上手くいきません。 'Excel のバージョン 2003 SP3 'データ項目名 'ID,名前,,,,,,,,,,,長文1,長文2,,,,削除フラグ,削除日時,更新日時 ←こんな感じで20項目 上記の「削除フラグ」の値を抽出条件にしています。 文字列の項目で、''、' '、'1'などの値があります。 '1'が入っているデータは削除された古いデータなので、抽出対象外にしたいです。 mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1')" Set adoRS = adoCON.Execute(mySql) Debug.Print mySql 上記を実行すると、対象データはあるのに取得できません。 実行時エラーになることはなく、処理は正常に終了します。 mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ = '1')" だと、「削除フラグ」に'1'が入っているデータが取得できます。 mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ != '1')" これを試しましたが、構文エラー:演算子がありません となります。 SQL文が悪いのか、「削除フラグ」のデータが悪いのかわかりません。 解決していただけなしでしょうか?

  • 抽出データの欠落

    プログラムもほとんど知らない素人ですが質問させていただきます。^^; oracle9iデータベースで、未抽出の情報があれば、「抽出済みフラグ」を立て、さらにその情報はテキストファイルに出力する処理を開発者に作ってもらいました。 しかし、データの10件に抽出済みフラグが付いたのに、テキストファイルへの出力は8件とか9件しか出力されない といった現象が頻発して困っています。 当初はSQL文のみのプログラム(?)で現象が出たのでVBプログラムで作り直してもらったのですが、同じ現象が出ます。 データ総件数は3万件ぐらいで、抽出される件数は20~100件ぐらいです。 こういったトラブルはoracleデータベースで一般的にあり得るのでしょうか? よろしくお願いします。

  • AccessのVBAにおいて,アクセスフォームに表示されている「値」を

    AccessのVBAにおいて,アクセスフォームに表示されている「値」を変数の中に格納したい。  例えば,オートフォームの単票形式でフォームを作成した場合,「番号」「製品」といったフィールドが2個あるテーブルを使うと,「番号」「製品」という名前のテキストボックスが2個ほどできます。 (フィールド名やテキストボックス名は問題ではありません。) このフォーム上に「ボタン」を配置し,このボタンをクリックした時に,「製品」というテキストボックスの内容を,メッセージボックスで表示させたい。 MsgBox (Me.製品.Text) と書いてもエラーとなります。 実際には,このフォームで欲しいデータを見つけた時,ボタンクリックで,テキストボックスに表示されている内容をグローバル変数に格納したいのですが,方法が分かりません。 Access 初心者です。どなたかよろしくお願いします。

PCの設定に関するお困りごと
このQ&Aのポイント
  • スマホのアプリから設定していたときに出てきたURLをPCで検索し、使用許諾に同意してダウンロードというボタンを押しても反応しない
  • お使いの環境はWindows11であり、接続方法や関連ソフト・アプリ、電話回線の種類について情報が不足しています
  • ブラザー製品に関する質問です。PCの設定に関してトラブルが発生し、反応しない問題を解決したい
回答を見る