- 締切済み
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!仕訳登録!貸'というフィールドはありません」 とエラーメッセージになります。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- DexMachina
- ベストアンサー率73% (1287/1744)
No.2です。 まず、前回の回答の訂正から(汗) (補足欄の内容にも関わりがあります) 1個目のGotoControlで、「貸」コントロールがあるサブフォームへの移動を 指定してしまうと、メインフォームではなくサブフォーム側の「貸」への 移動になります(汗) 「貸」コントロールがあるサブフォームから、メインフォーム側の「貸」に 移動する場合は、一旦、メインフォーム側にしかないコントロールに移動 させてから、「貸」に移動します。 DoCmd.GotoControl "閉じる" DoCmd.GotoControl "貸" '→メイン側の「貸」に移動 ※メインフォームにのみ、「閉じる」コマンドボタンがあるという想定です。 逆に、メインフォーム側から、サブフォーム側の「貸」に移動する場合は、 前回間違えて示したように(汗)、一旦サブフォームに移動させたのちに、 「貸」に移動します。 DoCmd.GotoControl "仕訳登録サブ貸方" DoCmd.GotoControl "貸" '→「仕訳登録サブ貸方」側の「貸」に移動 > DoCmd.GoToControl "Forms!仕訳登録!伝票No." GotoControlでは、あくまでコントロール名しか指定できません。 (「Forms!仕訳登録!伝票No.」というような形で、位置を指定することができない) 仮に、メインフォームにしか「伝票No.」テキストボックスがない場合は、 DoCmd.GotoControl "伝票No." だけで移動できます。 一方、上で訂正させて戴いた件のように、メインとサブの双方に同名のテキスト ボックスがある状況で、サブフォームからメイン側に移動させたい場合は、 DoCmd.GotoControl "閉じる" DoCmd.GotoControl "伝票No." とします。 ご質問のように、「Forms!仕訳登録!伝票No.」として一発で対応したいという ことでしたら、やはり「SetFocus」の方が目的に沿うと思います。 Forms!仕訳登録![伝票No.].SetFocus (別のフォームのコントロールも指定可能) または Me.Parent![伝票No.].SetFocus (VBAの記述場所がサブフォーム内で、移動先がメインフォームの場合のみ) ※「伝票No.」の「.」と、「.SetFocus」の「.」を区別して認識させるために、 「伝票No.」は半角の角括弧([ ])で囲む必要があります。
- DexMachina
- ベストアンサー率73% (1287/1744)
「DoCmd.GotoControl」は、その名の通り「コントロールの移動」を行うもの なので、移動先にはコントロール名を指定してやる必要があります。 従って、「貸」コントロールに移動したい場合は、「貸」を指定してやります。 Private Sub 貸方合計_Click() Forms!仕訳登録!貸 = 合計 DoCmd.GotoControl "貸" End Sub ご質問の例では、「仕訳登録」という「フォーム名」を指定しているために、 「該当コントロールがない」というエラーが返されています。 なお、「サブフォームの方はフォーム名を指定しているのに」と思われるかも しれませんが、サブフォームは 「メインフォーム上のコントロールとしての名前」と、 「表示するのに使用するフォーム名」 という二つの名前を持っています。 ただ、この2つの名前は同じにすることもできますので、この2つが同名だった 場合は、上記のような疑問が発生してしまうこともあります。 (試しに、メインフォームをデザインビューで開いて、サブフォームの外枠を ダブルクリックするなどしてサブフォームのプロパティシートを開き、 『その他』タブの『名前』を、現在の「仕訳登録サブ借方」から 「サブフォーム1」にすると、データ表示は今まで通りにできますが、 「DoCmd.GotoControl "仕訳登録サブ借方"」のコードは、ご質問のメイン フォームに移動させようとした場合と同様のエラーになるようになります) (なお、「表示するのに使用するフォーム名」というのは、『データ』タブの 『ソースオブジェクト』のことです) ※「仕訳登録サブ貸方」サブフォームにも「貸」という名前のコントロールが ある場合は、以下のようにするとメインフォーム側の「貸」に移動できます。 (一旦、「貸方合計」ボタンがあるサブフォームへのGotoControlを行う、と) Private Sub 貸方合計_Click() Forms!仕訳登録!貸 = 合計 DoCmd.GotoControl "仕訳登録サブ貸方" DoCmd.GotoControl "貸" End Sub ・・・「マクロをVisual Basicに変換」を使うと『コントロールの移動』は 「DoCmd.GotoControl」に変換されるので、そこでこの方法を覚えられたのかと 推測しますが、VBAで組まれる場合は、No.1の方が回答されている、「SetFocus」 を覚えてしまわれた方が簡単かもしれません(汗) (実際の構文としては、「Me.Parent!貸.SetFocus」でもOkのはずです: 「Parent」と「SetFocus」の前は「.」、「貸」の前は「!」なので注意)
補足
詳しいご回答有難うございます。 SetFocusで解決しましたが 仕訳登録フォーム に 伝票No. というテキストボックスがあります。 DoCmd.GoToControl "仕訳登録" を DoCmd.GoToControl "Forms!仕訳登録!伝票No." としましたがエラーになります 参考までにDoCmd.GoToControlを使ってどのようになるのかお教えいただけないでしょうか
- 30246kiku
- ベストアンサー率73% (370/504)
「貸」という名のテキストボックスがメインフォームにあるとした場合ですが、 > DoCmd.GoToControl "Forms!仕訳登録!貸" ↓ Me.Parent.Form.貸.SetFocus としてみるとどうなりますか? ※ GoToControl はあまりつかったことありません。 (SetFocus でやってます)
お礼
ご回答ありがとうございます。 解決しました。 SetFoucus 試してみてこれもOKです。 今後これに切り替えます。
お礼
再度のご回答感謝します。 詳細なご説明に長時間掛けていただいたと推察いたします。 色々勉強になりました。 追伸 内容説明のないままにしてすみません。 メインフォームに 借 貸 のテキストボックスがあり、 二つのサブフォームの合計をこのフィールドに送り、メインフォームで合計の比較をやっています。