【Access】サブフォーム間のカーソル移動がわからなくて困っています

このQ&Aのポイント
  • 2つのサブフォームがあり、サブフォーム間のカーソル移動を実現したいのですが、意図した動作にならず、困っております。
  • Form1_SUBのfield2でEnterキー押下時、同じ行のForm2_SUBのIDに移動したいです。下記のソースではForm2_SUBの最後のカーソル位置があった行のIDに遷移してしまいます。
  • Form2_SUBのfield2でEnterキー押下時、次の行のForm1_SUBのIDに移動したいです。下記のソースではForm1_SUBの最後のカーソル位置があった行のIDに遷移してしまいます。
回答を見る
  • ベストアンサー

【Access】サブフォーム間のカーソル移動がわからなくて困っています。

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 以上、よろしくお願いします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.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 に配置したサブフォームコントロールの名前です。

iroha_168
質問者

お礼

ご回答ありがとうございます。 意図した動作をしている事を確認しました。 ソースの中身についても一通り理解できたと思います。 なお、私は下記のように改造しましたが、特に問題なく動いているようでした。 1. 新規レコードは作らない。 2. 移動先のフィールド名は、サブフォーム毎に異なる。 3. 最後のサブフォームの最後の行では親フォームに戻ってくる。 4. 3つ以上のサブフォームに対応。 それと、IDの値を見ていない件ですが、 IDの同期は別途とっており、同じ行=同じIDとなるので、 その点については大丈夫です。 おかげで無事解決しました。 どうもありがとうございました。 以上、よろしくお願いします。

関連するQ&A

  • 新規レコードへ移動しない

    Access2010を使用しています。 サブフォームからメインフォームの「登録」ボタンプロシージャをCallした時、メイン・サブフォーム共に新規レコードへ移動しなくて困っています。 具体的には、サブフォームにフォーカスがある時に「F12」を押すと画面の入力項目の内容刃そのままでメインフォームの「注文番号」テキストボックスにフォーカスが移動します。 メインフォームにフォーカスがあるか、マウスで「F12」をクリックすると画面の入力項目がクリアされて新規レコードへ移動します。 コードは以下の内容が記述してあります。 ーーーーーサブフォーム----- Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 123 Call Me.Parent.Form_KeyDown(KeyCode, Shift) KeyCode = 0 End Select End Sub -----メインフォーム----- Public Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 123 Call 登録_Click KeyCode = 0 End Select End Sub Private Sub 登録_Click() DoCmd.GoToRecord , , acNewRec Me.注文番号.SetFocus End Sub

  • TextBoxに連続で入力する方法

    Form1に、TextBox1とTextBox2を配置しています。 TextBox1にKey入力を受け、Enter Keyで取り込む動作を、連続して行うためのプログラムを作ってみましたが、何故かEnter Keyの後、カーソルがTextBox2に移動してしまいます。Enter Keyの後、TextBox1.SetFocusで、カーソルをTextBox1にしているのですが何故が解らず困っています。Enter Kyeの後、カーソルがTextBox1に戻るようにするには、どのようにすれば良いのか教えて下さい。 PC環境は、OS=Win10 Excel=2010 です。作ったプログラムは以下の通りです。よろしくお願いします。 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyReturn Then Sheets("Sheet1").Range("A1") = TextBox1.Value TextBox1 = "" TextBox1.SetFocus End If End Sub

  • ファンクションキーで命令を実行させたい

    よろしくお願いします。 ACCESS2000を使用しています。 ファンクションキーで命令を実行したく、下記のコマンドを書いて実行しましたが動作しません。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Me.メインsub.Form.SetFocus Select Case KeyCode Case vbKeyF5 Me.btn帰社.SetFocus Call btn帰社_Click Case Else KeyCode = 0 End Select End Sub Private Sub Form_Load() Me.KeyPreview = True End Sub フォームプロパティのキーボードイベント取得は「はい」で設定してあります。 2週間位、いろいろやってみましたがうまくいきません。はまっています。回答・ヒントをよろしくお願いします。

  • エラー時カーソルを戻したいのですが?

    エクセルVBAに入出荷(在庫管理)を作成しているのですが テキスト1に品番を入力して品番が無かった場合 テキスト1などを空白にしてテキスト1にカーソルを 戻したいのですが下記のように書き込むとテキスト2に カーソルが行ってしまいます。どこを直せばいいでしょうか? Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim i As Integer If KeyCode = 13 Then For i = 4 To 400 If Sheets("倉庫在庫(記入用)").Cells(i, 1) = TextBox1 Then Label6 = Sheets("倉庫在庫(記入用)").Cells(i, 4) Label7 = Sheets("倉庫在庫(記入用)").Cells(i, 5) TextBox2.SetFocus Exit Sub End If Next i MsgBox "品番がありません!" TextBox1 = "" Label6 = "" Label7 = "" End If TextBox1.SetFocus End Sub

  • サブフォームにフィルタをかけたい

    サブフォームにフィルタをかけたいのですが エラーになってしまいます。 下記がエラー内容です。 ---------------------------------------------------------- 実行時エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ---------------------------------------------------------- 細かい概要は テーブル1にフィールドがあり、 レコードには「あああ」と入力されています。 テーブル1がレコードソースとされている「フォーム(2)」をサブフォームとして 親フォーム(フォーム名:フォーム(1))に乗せました。 フォーム(1)を開いた時にフォーム(2)にフィルタをかけたいのですが うまくいきません。 オブジェクト名にカッコを付けているため、 Form_フォーム・・・・ というコードは書けないので ---------------------------------------------------------- Private Sub Form_Open(Cancel As Integer) Forms("フォーム(1)").Controls("フォーム(2)").Form.Filter = "フィールド = '" & "*あ*" & "'" Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True End Sub ---------------------------------------------------------- としています。 Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True でエラーになりますが、 この行をなくしたら、フィルタがかかりません。 どうすればサブフォームにフィルタをかける事が出来るのでしょうか? ご教示よろしくお願い致します。

  • Access スペースキーでフォームを開きたい

    いつも、お世話になっております。 window7, Access2013 データシートビューのあるフィールドをスペースキーで押したら、関連したフォームが開けるようにしたいと思っています。 以前に質問させていただいたケースは、[会社ID] と言う解りやすいフィールドをスペースキーで押したら、会社のフォームが現れるものでそれは Private Sub 会社ID_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Or KeyCode = 32 Then DoCmd.OpenForm "営業会社", , , "会社ID=" & Me.会社ID KeyCode = 0 End If End Sub と、お教えいただき、快適に動作しています。 今回は、[会社ID]の隣にある[会社名]というフィールドをクリックしたら、[営業記録」のフォームが開けるようになることを切望しています。そのフィールドにはマクロを設定していまして、クリックしたらその[営業記録]のフォームがフォームビューで開けるのですが、スペースキーで開けるようになるとずっと快適にストレス無く作業ができるようになると思っています。 色々、やってみましたが、どれも上手く出来ません。お手数ですが、ご回答くださると助かります。よろしくお願いいたします。

  • ACCESSのサブフォームからメインフォームへの移動

    お世話になります。 仕訳伝票の入力画面を作成しています。 仕訳登録フォームに サブフォームを2つあります。 うまく説明できないのでコーディングを記入しておきます。 これで仕訳登録フォームから仕訳登録サブ借方フォーム 仕訳登録サブ借方フォームから仕訳登録サブ貸方フォームへはカーソルが移動しますが 仕訳登録サブ貸方フォームから仕訳登録フォームへは移動してくれません マウスを使わずイベントで移動する方法はありますか メインフォーム 仕訳登録 Private Sub 目的_LostFocus() DoCmd.GoToControl "仕訳登録サブ借方" End Sub サブフォーム1 仕訳登録サブ借方 Private Sub 借方合計_Click() Forms!仕訳登録!借 = 合計 DoCmd.GoToControl "仕訳登録サブ貸方" End Sub サブフォーム2 仕訳登録サブ貸方 Private Sub 貸方合計_Click() Forms!仕訳登録!貸 = 合計 DoCmd.GoToControl "仕訳登録" End Sub 「カレントレコードに'仕訳登録'というフィールドはありません」とメッセージにになりますので Private Sub 貸方合計_Click() Forms!仕訳登録!貸 = 合計 DoCmd.GoToControl "Forms!仕訳登録!貸" End Sub 「カレントレコードに'Forms!仕訳登録!貸'というフィールドはありません」 とエラーメッセージになります。

  • ユーザーフォームのカーソル移動

    Excelのマクロでカーソル移動の事で教えて下さい。 フォームを表示するとTextBox1にカーソルが表示されます。 TextBox1で入力の判断しNG場合 カーソルを移動せずTextBox1に表示したいのですが CommandButton1に移動してしまいます。 (SetFocusでTextBox1を指定してNG) 【フォームの内容です】 TextBox1が1個 CommandButtonが2個存在します。 TextBox1のTabIndexは 0 CommandButton1のTabIndexは 1 CommandButton2のTabIndexは 2 【プログラムです】 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If TextBox1 = "" Then MsgBox "NG"     TextBox1.SetFocus End If End Sub 宜しくお願い致します。

  • ACCESS サブフォームのフィールドにカーソルをあてる

    ACCESS2003で、VBAで簡単なプログラムを作っています。 <やっていること> ・フォームAからフォームBを開きます。 ・そのときにフォームAの番号と一致するデータをフォームBに表示します。 ・フォームBにはサブフォームCが埋め込んでいます。 このサブフォームCの中のフィールドDにカーソルが入っているようにしたいのですが、 Forms!サブフォームC!フィールドD.setfocus としたら、「カレントレコードには、フィールドDという名前のフィールドはありません」というエラーがでます。 フィールドDというフィールドは存在しています。 このような場合、どのように記述するのがよろしいのでしょうか。 よろしくお願いします。

  • Accessサブフォームのレコード移動

    Accessにおいて、サブフォームのレコードの移動方法をどなたか教えてもらえませんか。「Forms![メインフォーム名]![サブフォーム名].Form.SetFocus DoCmd.GoToRecord acDataForm, "サブフォーム名", acNext」とコーディングしたのですがダメでした。よろしくお願い致します。

専門家に質問してみよう