Microsoft Access 掲示板

サブフォームの表示の仕方について

14 コメント
views
4 フォロー

こんにちは。
いつも参考にさせて頂いてます。
7月に帳票を横に配置する方法でお世話になりました。
その横並びになった帳票をサブフォームとして利用しております。
メインの動作によってサブフォームのレコードソースか変化することもできました。
しかしその帳票のレコード数が多すぎて画面から見えなくなったときに、
メインの値で、サブフォームの値を探して サブフォームの画面に見えるようにするみたいなことを考えているのですがこ、うまくいきません。

サブフォームの読み込み時のコードです。

Public Sub SourceReset1()

Dim db As dao.Database
Dim rs As dao.Recordset
Dim Res
Dim i As Integer
Dim q As Long
Dim k As Long
Dim t As Long

Me.Painting = False 'ちらつき防止
Me.RecordSource = "" 'フィールド構成が変わる場合Requeryではリセットされない
Me.RecordSource = "畦取クロス"
q = Nz(DMax("並順", "縞取順計算") + 2)
k = Nz(DMax("取順", "畦取") + 1)
t = Nz(DMax("元順", "畦取計算") + 2)
Set rs = Me.Recordset

For i = 2 To rs.Fields.count - 1
Me("lbl" & i).Caption = rs(i).Name
Me("txt" & i).ControlSource = rs(i).Name
Me("txt" & i).Visible = True
If i > q Then
Me("txt" & i).ForeColor = RGB(255, 0, 0)
Me("lbl" & i).ForeColor = RGB(255, 0, 0)
Else
Me("txt" & i).ForeColor = RGB(0, 0, 0)
Me("lbl" & i).ForeColor = RGB(0, 0, 0)
End If
If i > k Then
Me("txt" & i).ForeColor = RGB(0, 0, 0)
Me("lbl" & i).ForeColor = RGB(0, 0, 0)
End If
If i = t Then
Me("txt" & i).ForeColor = RGB(0, 0, 255)
Me("lbl" & i).ForeColor = RGB(0, 0, 255)
End If

Next
For i = rs.Fields.count To 110
Me("lbl" & i).Caption = ""
Me("txt" & i).ControlSource = ""
Me("txt" & i).Visible = False
Next

Me.Painting = True

End Sub

メインフォームの 元順 はサブフォームの "lbl" と同じです

メインに 前回おしえてもらった SourceReset をすると サブフォームの内容がリセットされます。

Call Me.畦取①.Form.SourceReset

そのあとに

Dim strCriteria As String
 Dim h As Integer

 h = Me.畦取①.Form.ControlSource = rs(i).Name

strCriteria = " h = " & CLng([元順])

Me!畦取①.Form.Recordset.FindFirst strCriteria

 このように FindFirst を使えば 見えなくなったサブフォームの列が
移動してくれて 見えるようになるのかと思いましたが 

h = Me.畦取①.Form.ControlSource = rs(i).Name

を認識してくれません。

サブフォームはメインフォームの元順の値を見てサブフォームの配置された lbl であり txt の色を変化させています。
その配列が長すぎると 当然 画面からみえなくなります サブフォームのスクロール機能を使えば簡単そうなのですが、なにせ メインの元順が変化するごとに サブフォームをリセットするもんですから また スクロール位置も最初に戻ってしまいます。
わかりづらい投稿で申し訳ありませんが、ご教示いただけないでしょうか?

のり
作成: 2019/12/12 (木) 12:47:46
通報 ...
1

そちらのフォームの構成が不明ですし、やろうとしていることも複雑そうです。
文章を何度か読んでみましたが、状況が把握できません。
現状のファイルをファイル送信フォームより送信してもらえませんでしょうか。
それをみながら質問の読んだら理解できるかもしれません。

2
hiroton 2019/12/13 (金) 09:45:44 11b2d@f966d

エスパーしてみる

そのあとに

Me.畦取①.SetFocus
Me.畦取①.Form.Controls("txt" & Me.畦取①.Form.Recordset.Fields.count - 1).SetFocus

※試していません

3
のり 2019/12/16 (月) 08:47:06 cb0cb@151a6

hirotonさま 
ありがとうございます
やってみましたがダメでした
むずかしです・・・

4
hiroton 2019/12/16 (月) 10:11:27 96c4a@f966d

hatenaさん指摘のようにもう少し詳細が必要に思います

サブフォームのレコードソースをクロス集計クエリにしていて横にスクロールさせている(そのスクロールの初期位置を変えたい)と想像しての回答なのでこの前提が間違っていると回答も明後日の方向になってしまいますね

横スクロールさせたいならsetfocusで縦スクロールさせたいならfindfirstでとなると思います

6
のり 2019/12/17 (火) 12:05:19 cb0cb@151a6

hirotonさま
ありがとうございます
先週末にファイルは送りました
ややこしく構成しているので 解読に時間がかかるのかも…
rs(i).Nameで SUBまたはFUCTIONが定義されていませんとなります
RS 認識させるところからやってみます

7
のり 2019/12/26 (木) 08:53:36 292b8@151a6

おはようございます
hatena さま ファイルは届きましたでしょうか?

8

のりさん、すみません。ファイルが届いているのに気が付きませんでした。
夜にファイルの中身を見させていただきます。しばらくお待ちください。

9

中身を見ましたが、これだけの内容をすべて解読するのはさすがにできません。
今回の質問に関係のあるオブジェクト(テーブル、クエリ、フォーム)のみ残して、テーブルデータも現象を再現できる最低限のものにして、それを再度送ってもらえませんか。

どのフォームでどのように操作して、どのように想定通りにならないか、説明してもらえませんか。

10
のり 2019/12/29 (日) 11:39:28 439fb@5d7bf

hatenaさま

ありがとうございます。
できるだけ簡略化したファイルを送らせていただきました。
ご無理を言いますが よろしくお願いいたします。

11
hatena 2020/01/04 (土) 19:11:03 修正

遅くなりました。ようやく時間がとれたのでファイルを見てみました。

hirotonさんの最初の回答でほぼあっているのですが、
サブフォーム「畦取①」のすべてのテキストボックスの「使用可能」が「いいえ」になっているので、フォーカス移動できないためうまくいかないのだと思われます。
まずは「使用可能」を「はい」に変更してください。
そのうえで、サブフォームのソースが変更されるタイミングで、下記のコードを実行するようにしてみてください。

メインフォームの「元順」の位置のテキストボックスへ移動。

    Me.畦取①.SetFocus
    Me.畦取①.Form.Controls("txt" & Me.元順).SetFocus

フィールドの最終列へ移動ならhirotonさんのコードで。

12
のり 2020/01/06 (月) 09:46:17 292b8@151a6

hatenaさま 
    Me.畦取①.SetFocus
    Me.畦取①.Form.Controls("txt" & (Me.元順+2)).SetFocus
で出来ました。
テキストボックスの「使用可能」が「はい」でできるとは気が付きませんでした。

 Me.元順+2 で 畦取①.Form.Controls ”TXT” とイコールになるのが 疑問が残りましたが、とにかく思うように動いてくれます。

hatenaさま、hirotonさま 本当にありがとうございました。

13
hiroton 2020/01/07 (火) 07:12:46 5456d@f966d

わかりやすいと思うのでExcelを例に出しますが、Excelで表を作ろうと思うと1行目は項目にしたりしますよね?
そうすると1番目のデータは2行目となります。
表にタイトルを入れようと思うとさらに1行目ずらして1番目のデータは3行目となったりもします。

質問のフォームは帳票を横に表示するという特殊なことをしているので、設計上たまたま「元順+2がフォームの("txt" & i)に対応している」ということでしょう

14
のり 2020/01/08 (水) 17:45:22 292b8@151a6

hirotonさま
なるほど! 
人間の視覚で物事を判断していました。
わかりやすく説明していただき ありがとうございました。