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

==環境==
OS:Windows XP Professional Ver.2002 Service Pack 3
Access 2007

マクロを使って下記の操作をしようとしています。
以前Access2000を使っていて使用できたマクロが、Access2007では動かなくなってしまいました。
このマクロをどう修正したらいいのかわかりません。

[1]フォームAに作られた一覧表(テキストボックスを使って表示している)
-----------------------------------
品名------金額a-----金額b-----合計
製品1----5000-------6000@------11000
製品2----4000-------3000-------7000
-----------------------------------

[2]そのうち明細が見たい箇所のテキストボックスをクリック
 ※この場合、製品1の金額bの明細を表示させたいので
  `@マークが付いているテキストボックスをクリックしています。

[3]サブフォームを持つフォームBが開く

[4]フォームBの検索条件
テキストボックスの『品名検索欄』に「製品1」を入力
オプショングループの『金額区分』の「b」がON

[5]フォームBを再クエリ
 ※フォーム上には再クエリボタンが設置されています。
  サブフォームは「sub_form」という名前で配置されています。

==2000でのマクロ==
[3]から[5]について、以下のように作成しています。

(1)フォームを開く
・フォーム名:フォームB
(2)値の代入
・アイテム:[Forms]![フォームB]![品名検索欄]
・式:[Forms]![フォームA]![品名]
(3)値の代入
・アイテム:[Forms]![フォームB]![金額区分]
・式:2
(4)キー送信
・キー操作:+{F9}
・待機:いいえ

==2007での状況==

2000で作成したマクロをそのまま使うと(4)が動かないようです。
フォームB上では品名と金額区分が入力されており、
サブフォームに表示されるはずのデータは空です。
フォームB上の「再クエリ」ボタンを押すとデータが表示されました。

試しに(4)キー送信を再クエリ(コントロール名:sub_form)に変えたところ
「カレントレコードには'sub_form'という名前のフィールドはありません。」
と表示されてしまいました。

このマクロをどう直したらいいでしょうか。
皆さん、よろしくお願いいたします。

A 回答 (2件)

No.1です。



> マクロだけで、この動作をさせるのは難しいのでしょうか。

すみません、前回の回答では動作確認をしていませんでした(汗)

改めてAccess2007/WindowsXP(Home)の環境で動作確認をした結果、
多分(汗)、そちらと同じ状況を再現できました。
(Access2000については不明)

フォームBを直接開いた場合、最初にカーソルがある(=フォーカスがある)のは
サブフォーム、という状態になっているのではないでしょうか。
この場合、再クエリで『コントロール名』引数を指定すると、サブフォームの中で
その名前のコントロールを探すことになるため、ご質問のエラーとなります。
(なお、前回回答で追加してもらった「オブジェクトの選択」は、上記の推測が
 正しければ不要のようです(汗))

ですので、対応としては、
 a)『再クエリ』アクションの『コントロール名』を空白にする
  (→フォームB全体に対して再クエリが行われます)
 b)フォームBで、最初にフォーカスがあたるコントロールを、サブフォーム以外
  になるようにする
 c)(上記の方法で支障がある場合:サブフォームが2つあって、一方は更新
  したくない、など)
  『再クエリ』の前に『コントロールの移動』アクションを追加し、その引数に
  フォームBだけに存在するコントロールの名前を指定する
の3通りの方法が考えられます。

なお、コントロールの移動順については、以下の方法で変更できます。
(数値を直接編集すると並び順がおかしくなるため注意:
 但しAccess97での経験に基づいての話で、Access2007では未確認(汗))

1)当該フォーム(フォームB)をデザインビューで開く
2)サブフォームをダブルクリックするなどしてプロパティシートを開き、『その他』タブ
 の『タブ移動順』にカーソルを移動
3)右端に「...」(ビルダ)ボタンが表示されるので、そこをクリック
4)『タブ オーダー』ダイアログが開くので『タブ オーダーの設定』欄内で、ドラッグ
 &ドロップで並び順を入れ替え
5)『OK』ボタンをクリックして上記ダイアログを閉じる


・・・以上です。

なお、

> 他に再クエリの名前を、配置した名前「sub_form」ではなく、
> サブフォームの名前(保管名)に変えてみた

については、サブフォームのプロパティシートで、『その他』タブの『名前』に
表示されるものを使用すればOkです。
(『その他』タブに『名前』がない場合は、コントロールとしてのサブフォーム
 ではなく、その『ソース オブジェクト』に指定しているフォームのプロパティ
 が表示されているので、サブフォームの外枠が強調表示(オレンジ)に
 なるように、選択し直してください:
 サブフォームの外側でマウスクリック後、内側に向かってドラッグしてから
 マウスボタンを離せば、サブフォームが選択されます)
    • good
    • 0
この回答へのお礼

DexMachina様

できました。

ご指摘の通り、フォームBを開くとサブフォームに最初にタブ移動するようになっていました。
入力フォームのときは注意するんですが、閲覧フォームでも「タブ移動順」は大切なんですね。
詳しく書いていただけたので、迷わず変更できました。

わざわざ同じようなものを作って動作確認までしていただき、本当にありがとうございました。
どうぞ良い年を!

お礼日時:2012/12/20 08:47

> このマクロをどう直したらいいでしょうか。



Access2000では動いていた、という点が若干引っ掛かってはいるのですが・・・(汗)
(原因の推測を誤っている可能性がある、と)

とりあえず、『キー送信』アクション(VBAではSendKeysに相当)は動作が不安定に
なりますので、『再クエリ』アクションの使用をお勧めします。

なお、再クエリを試された際に出たエラーは、恐らく「実行時にフォーカスを持っている
フォームに、該当するコントロールがない」ために発生しています。
(まだフォームA上にフォーカスがあるため、フォームAで「sub_form」を探した、と)

ですので、「(4)」以降のアクションを以下のようにすれば、ご希望の動作になるのでは
ないかと思います:

(4)オブジェクトの選択
 ・オブジェクトの種類: フォーム
 ・オブジェクト名: フォームB
 ・データベース ウィンドウ内: いいえ

(5)再クエリ
 ・コントロール名: sub_form


・・・以上です。
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。
お礼が遅くなってすみません。

今試してみたのですが、やはり「カレントレコードには~」というメッセージが表示されてしまいます。
他に再クエリの名前を、配置した名前「sub_form」ではなく、
サブフォームの名前(保管名)に変えてみたのですが、同様のメッセージがでてしまいます。

マクロだけで、この動作をさせるのは難しいのでしょうか。

お礼日時:2012/12/19 11:31

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