こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

アクセスのフォームで10件づつ表示する。

初めて書き込みさせて頂きます。

アクセスのテーブルを帳票形式にて作成して10件づつ表示をさせようとすると一部のデータが表示されません。

方法としては、帳票形式で10件のみ表示出来る様にサイズを調整して「前へ」と「次へ」のボタンをつけて10件づつ表示させています。

ソースは下記の方法で

「次へ」

Private Sub コマンド13_Click()
Dim rs As DAO.Recordset, i As Integer
Const n As Integer = 10
Set rs = Me.RecordsetClone


For i = 1 To n * 2
If rs.EOF Then
rs.MoveLast
Me.Bookmark = rs.Bookmark
Exit Sub
End If
rs.MoveNext
Next
Me.Bookmark = rs.Bookmark

For i = 1 To n
rs.MovePrevious
Next
Me.Bookmark = rs.Bookmark
rs.Close


End Sub

「前へ」
Private Sub コマンド16_Click()
Dim rs As DAO.Recordset, i As Integer
Const n As Integer = 10
Set rs = Me.RecordsetClone


For i = 1 To n * 2
If rs.BOF Then
rs.MoveFirst
Me.Bookmark = rs.Bookmark
Exit Sub
End If
rs.MovePrevious
Next
Me.Bookmark = rs.Bookmark

For i = 1 To n
rs.MoveNext
Next
Me.Bookmark = rs.Bookmark
rs.Close
End Sub

以上、ご教授の程宜しくお願い致します。

投稿日時 - 2012-10-19 17:33:54

QNo.7756208

すぐに回答ほしいです

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

前回のコードはちょっと間違い。
下記でどうかな。

Const n = 10

'「次へ」
Private Sub コマンド13_Click()
Dim p As Long

On Error Resume Next

DoCmd.GoToRecord , , acNext, n * 2
If Err = 2105 Then
p = Me.CurrentRecord
DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acGoto, p + n
Else
DoCmd.GoToRecord , , acPrevious, n
End If

End Sub

'「前へ」
Private Sub コマンド16_Click()

DoCmd.GoToRecord , , acPrevious, n * 2
If Err = 2105 Then
p = Me.CurrentRecord
DoCmd.GoToRecord , , acFirst
DoCmd.GoToRecord , , acGoto, p - n
Else
DoCmd.GoToRecord , , acNext, n
End If

End Sub

投稿日時 - 2012-10-19 19:31:41

補足

ご回答有難うございます。

DoCmd.GoToRecord , , acPrevious, n * 2
If Err = 2105 Then
p = Me.CurrentRecord
DoCmd.GoToRecord , , acFirst
DoCmd.GoToRecord , , acGoto, p - n
Else
DoCmd.GoToRecord , , acNext, n
End If

End Sub

の方で実行時エラー2105が発生しました。何がいけないのでしょうか?

投稿日時 - 2012-10-20 08:26:04

お礼

早速のご回答ありがとうございます。実施してみて何かありましたら改めてご質問させて頂きます。

投稿日時 - 2012-10-19 20:22:49

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

質問者さん

私に騙されてみる気はありますか。

以下の方法は、私がいろいろやってみて、何か動きそう・・・
というレベルのもので、Microsoft の資料等裏付けが取れていないものになります。


確認用フォームは、添付図の様になります。
(フォームウィザードから表形式として作ったものになります)

「an」「日付」「Src」を連結した帳票で、
ボタン、前に「btnPrev」、次に「btnNext」がヘッダに配置されたものになります。

VBAで、以下を記述します。


Const CSCRLNUM As Long = 10

Private Sub Form_Load()
  Me.InsideHeight = Me.Section(acHeader).Height _
          + Me.Section(acDetail).Height * CSCRLNUM _
          + Me.Section(acFooter).Height
End Sub

Private Sub ScrollByMyself(iNum As Long)
  Dim i As Long, j As Long

  If (Me.Dirty Or Me.NewRecord) Then Exit Sub

  j = Abs(iNum)
  With Me.RecordsetClone
    .MoveLast
    .Bookmark = Me.Bookmark
    i = .AbsolutePosition + iNum
    If (i < 0) Then
      i = 0
    ElseIf (i >= .RecordCount) Then
      i = ((.RecordCount - 1) \ j) * j
    ElseIf ((i Mod j) <> 0) Then
      i = (i \ j) * j
    End If
    .AbsolutePosition = i
    Me.an.SetFocus  ' ★詳細にあるコントロール「an」にフォーカス移動
    Me.Bookmark = .Bookmark
    i = (Me.CurrentSectionTop - Me.Section(acHeader).Height) _
      + Me.Section(acDetail).Height
    i = i \ Me.Section(acDetail).Height
    If (i > 0) Then
      DoCmd.GoToPage 1, , Me.Section(acDetail).Height * i
    End If
  End With
End Sub


Private Sub btnPrev_Click() ' 前へ
  Call ScrollByMyself(-CSCRLNUM)
End Sub

Private Sub btnNext_Click() ' 次へ
  Call ScrollByMyself(CSCRLNUM)
End Sub


※ ★ の、詳細にあるコントロールにフォーカスを移動しないと、まともに動きません。
上記では「an」にしましたが、「日付」でも「Src」でも・・・・
フォーカスが詳細にあることが重要です。

上記の細かい説明は、ここではしません。

※ 本質問とは別の用途ですが、ブログに記事として載せてます。
アドレスは書けない、導くキーワードの提示も規約で禁止されているので書けません。
興味あったら探してみてください。



なお、上記を確認してみる・・・・使ってみようかな・・・・
すべて自己責任にてお願いします。

投稿日時 - 2012-10-19 21:19:10

ANo.3

たびたび、済みません。「前へ」のコードに不足がありましたので、訂正します。

Const n As long = 5

Private Sub コマンド13_Click()
Dim p As Long

On Error Resume Next

DoCmd.GoToRecord , , acNext, n * 2
If Err = 2105 Then
p = Me.CurrentRecord
DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acGoTo, p + n
Else
DoCmd.GoToRecord , , acPrevious, n
End If


End Sub

Private Sub コマンド16_Click()
Dim p As Long

On Error Resume Next

DoCmd.GoToRecord , , acPrevious, n * 2
If Err = 2105 Then
p = Me.CurrentRecord
DoCmd.GoToRecord , , acFirst
DoCmd.GoToRecord , , acGoTo, p - n
Else
DoCmd.GoToRecord , , acNext, n
End If

End Sub

投稿日時 - 2012-10-19 20:22:06

ANo.1

コードを見る限りは問題点は見当たらないですが、「一部のデータが表示されない」とは具体的にどのようになるのか詳細に説明してもらえますか。

蛇足ですが、かなり遠回りしているコードですね。
下記のようにシンプルに記述することもできます。

'「次へ」
Private Sub コマンド13_Click()

On Error Resume Next
DoCmd.GoToRecord , , acNext, 10
If Err = 2105 Then DoCmd.GoToRecord , , acLast

End Sub

'「前へ」
Private Sub コマンド16_Click()

On Error Resume Next
DoCmd.GoToRecord , , acPrevious, 10
If Err = 2105 Then DoCmd.GoToRecord , , acFirst

End Sub

投稿日時 - 2012-10-19 19:10:30

補足

「一部のデータが表示されない」について再度見てみると最後の部分が表示されません。

例えば38件データが有った場合10件の表示を3回行い、8件を最後に表示すれば良いのですが
最後は一番最後のレコードのみ表示されます。

以上、宜しくお願い致します。

また、教えて頂いたソースで試してみます。

ありがとうございました。

投稿日時 - 2012-10-19 20:21:25

あなたにオススメの質問