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

お世話になります。
仕訳伝票の入力画面を作成しています。
仕訳登録フォームに サブフォームを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!仕訳登録!貸'というフィールドはありません」
とエラーメッセージになります。

A 回答 (3件)

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.」は半角の角括弧([ ])で囲む必要があります。
    • good
    • 0
この回答へのお礼

再度のご回答感謝します。
詳細なご説明に長時間掛けていただいたと推察いたします。
色々勉強になりました。

追伸
内容説明のないままにしてすみません。
メインフォームに 借 貸 のテキストボックスがあり、
二つのサブフォームの合計をこのフィールドに送り、メインフォームで合計の比較をやっています。

お礼日時:2009/05/02 20:01

「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を使ってどのようになるのかお教えいただけないでしょうか

補足日時:2009/05/02 03:00
    • good
    • 0

「貸」という名のテキストボックスがメインフォームにあるとした場合ですが、



> DoCmd.GoToControl "Forms!仕訳登録!貸"



 Me.Parent.Form.貸.SetFocus

としてみるとどうなりますか?

※ GoToControl はあまりつかったことありません。
 (SetFocus でやってます)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
解決しました。
SetFoucus 試してみてこれもOKです。
今後これに切り替えます。

お礼日時:2009/05/02 02:43

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A