2つのサブフォームがあり、サブフォーム間のカーソル移動を実現したいのですが、
意図した動作にならず、困っております。
その為、下記の条件を満たす動作をご教示いただける方がいらっしゃいましたら、
ご教示の程、よろしくお願いします。
【条件】
1. Form1_SUBのfield2でEnterキー押下時、同じ行のForm2_SUBのIDに移動したいです
(Form1_SUBの1行目のfield2でEnterキー押下時、
Form2_SUBの1行目のIDにカーソルを移動したいです。
下記のソースでは
Form2_SUBの最後のカーソル位置があった行のIDに遷移してしまいます)。
2. Form2_SUBのfield2でEnterキー押下時、次の行のForm1_SUBのIDに移動したいです
(Form2_SUBの1行目のfield2でEnterキー押下時、
Form1_SUBの2行目のIDにカーソルを移動したいです。
下記のソースでは
Form1_SUBの最後のカーソル位置があった行のIDに遷移してしまいます)。
【フォーム名】
親:OYAFORM
サブ:Form1_SUB(T1テーブルを連結した帳票フォームです。)
サブ:Form2_SUB(T2テーブルを連結した帳票フォームです。)
【テーブル名】
T1(ID, field1, field2)
T2(ID, field1, field2)
【F1_SUBのソース】
Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
Forms!OYAFORM!Form2_SUB.SetFocus
Forms!OYAFORM!Form2_SUB.Form!ID.SetFocus
End If
End Sub
【F2_SUBのソース】
Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
Forms!OYAFORM!Form1_SUB.SetFocus
Forms!OYAFORM!Form1_SUB.Form!ID.SetFocus
End If
End Sub
以上、よろしくお願いします。
チラッとやってみただけなので、おかしかったら修正していってください。
切り替えを親フォームを経由して行う方法となります。
【F1_SUBのソース】サブフォームコントロール名を「サブ1」とします
Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyReturn
KeyCode = 0
Call Me.Parent.Form1To2
End Select
End Sub
【F2_SUBのソース】サブフォームコントロール名を「サブ2」とします
Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyReturn
KeyCode = 0
Call Me.Parent.Form2To1
End Select
End Sub
【OYAFORMのソース】
Private Sub ChangeForm(ctlFrom As SubForm, ctlTo As SubForm, iAddPos As Integer)
Dim iFromPos As Long
With ctlFrom.Form
If (.NewRecord) Then
iFromPos = .Recordset.RecordCount
Else
iFromPos = .Recordset.AbsolutePosition
End If
End With
iFromPos = iFromPos + iAddPos
With ctlTo
.SetFocus
With .Form
If (iFromPos < .Recordset.RecordCount) Then
.Recordset.AbsolutePosition = iFromPos
Else
.Recordset.AddNew
End If
.ID.SetFocus
End With
End With
End Sub
Public Sub Form2To1()
Call ChangeForm(Me.サブ2, Me.サブ1, 1)
End Sub
Public Sub Form1To2()
Call ChangeForm(Me.サブ1, Me.サブ2, 0)
End Sub
※
Enterが押されたフォームは何行目を表示していたかを求め、
移行する時の+何行目を加算しておき、
以降先のレコード数により位置を指定するか、新規にいくか
で、最後にIDへフォーカス設定
※
IDの値が同じかどうかは見ていません。行だけ
※
サブ1, サブ2 は、OYAFORM に配置したサブフォームコントロールの名前です。
お礼
ご回答ありがとうございます。 意図した動作をしている事を確認しました。 ソースの中身についても一通り理解できたと思います。 なお、私は下記のように改造しましたが、特に問題なく動いているようでした。 1. 新規レコードは作らない。 2. 移動先のフィールド名は、サブフォーム毎に異なる。 3. 最後のサブフォームの最後の行では親フォームに戻ってくる。 4. 3つ以上のサブフォームに対応。 それと、IDの値を見ていない件ですが、 IDの同期は別途とっており、同じ行=同じIDとなるので、 その点については大丈夫です。 おかげで無事解決しました。 どうもありがとうございました。 以上、よろしくお願いします。