アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

以上、よろしくお願いします。

A 回答 (1件)

チラッとやってみただけなので、おかしかったら修正していってください。


切り替えを親フォームを経由して行う方法となります。

【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 に配置したサブフォームコントロールの名前です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

意図した動作をしている事を確認しました。
ソースの中身についても一通り理解できたと思います。

なお、私は下記のように改造しましたが、特に問題なく動いているようでした。
1. 新規レコードは作らない。
2. 移動先のフィールド名は、サブフォーム毎に異なる。
3. 最後のサブフォームの最後の行では親フォームに戻ってくる。
4. 3つ以上のサブフォームに対応。

それと、IDの値を見ていない件ですが、
IDの同期は別途とっており、同じ行=同じIDとなるので、
その点については大丈夫です。

おかげで無事解決しました。
どうもありがとうございました。

以上、よろしくお願いします。

お礼日時:2010/01/13 19:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!