こんにちは。
いつも参考にさせて頂いてます。
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 の色を変化させています。
その配列が長すぎると 当然 画面からみえなくなります サブフォームのスクロール機能を使えば簡単そうなのですが、なにせ メインの元順が変化するごとに サブフォームをリセットするもんですから また スクロール位置も最初に戻ってしまいます。
わかりづらい投稿で申し訳ありませんが、ご教示いただけないでしょうか?
そちらのフォームの構成が不明ですし、やろうとしていることも複雑そうです。
文章を何度か読んでみましたが、状況が把握できません。
現状のファイルをファイル送信フォームより送信してもらえませんでしょうか。
それをみながら質問の読んだら理解できるかもしれません。
エスパーしてみる
※試していません
hirotonさま
ありがとうございます
やってみましたがダメでした
むずかしです・・・
hatenaさん指摘のようにもう少し詳細が必要に思います
サブフォームのレコードソースをクロス集計クエリにしていて横にスクロールさせている(そのスクロールの初期位置を変えたい)と想像しての回答なのでこの前提が間違っていると回答も明後日の方向になってしまいますね
横スクロールさせたいなら
setfocus
で縦スクロールさせたいならfindfirst
でとなると思いますhirotonさま
ありがとうございます
先週末にファイルは送りました
ややこしく構成しているので 解読に時間がかかるのかも…
rs(i).Nameで SUBまたはFUCTIONが定義されていませんとなります
RS 認識させるところからやってみます
おはようございます
hatena さま ファイルは届きましたでしょうか?
のりさん、すみません。ファイルが届いているのに気が付きませんでした。
夜にファイルの中身を見させていただきます。しばらくお待ちください。
中身を見ましたが、これだけの内容をすべて解読するのはさすがにできません。
今回の質問に関係のあるオブジェクト(テーブル、クエリ、フォーム)のみ残して、テーブルデータも現象を再現できる最低限のものにして、それを再度送ってもらえませんか。
どのフォームでどのように操作して、どのように想定通りにならないか、説明してもらえませんか。
hatenaさま
ありがとうございます。
できるだけ簡略化したファイルを送らせていただきました。
ご無理を言いますが よろしくお願いいたします。
遅くなりました。ようやく時間がとれたのでファイルを見てみました。
hirotonさんの最初の回答でほぼあっているのですが、
サブフォーム「畦取①」のすべてのテキストボックスの「使用可能」が「いいえ」になっているので、フォーカス移動できないためうまくいかないのだと思われます。
まずは「使用可能」を「はい」に変更してください。
そのうえで、サブフォームのソースが変更されるタイミングで、下記のコードを実行するようにしてみてください。
メインフォームの「元順」の位置のテキストボックスへ移動。
フィールドの最終列へ移動ならhirotonさんのコードで。
hatenaさま
Me.畦取①.SetFocus
Me.畦取①.Form.Controls("txt" & (Me.元順+2)).SetFocus
で出来ました。
テキストボックスの「使用可能」が「はい」でできるとは気が付きませんでした。
Me.元順+2 で 畦取①.Form.Controls ”TXT” とイコールになるのが 疑問が残りましたが、とにかく思うように動いてくれます。
hatenaさま、hirotonさま 本当にありがとうございました。
わかりやすいと思うのでExcelを例に出しますが、Excelで表を作ろうと思うと1行目は項目にしたりしますよね?
そうすると1番目のデータは2行目となります。
表にタイトルを入れようと思うとさらに1行目ずらして1番目のデータは3行目となったりもします。
質問のフォームは帳票を横に表示するという特殊なことをしているので、設計上たまたま「元順+2がフォームの("txt" & i)に対応している」ということでしょう
hirotonさま
なるほど!
人間の視覚で物事を判断していました。
わかりやすく説明していただき ありがとうございました。