• ベストアンサー

サブフォームからメインフォームのフィールドにエンターキーで移動したい

ACCESS2000です。 フォームの中にサブフォームを作っています。 入力される都合で、フォームの中途にサブフォームがあります。このサブフォームのレコードの数は固定しています。(今は19です) サブフォームは帳票形式です。 サブフォームの最後のレコードでエンターキーやTABキーが押された時、メインフォームの指定するフィールドに移動するには、どうすれば良いでしょう。 使用者に特殊なキー操作を強要したくないので、VBAで記述したいのですが。

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

  • ベストアンサー
noname#22222
noname#22222
回答No.1

安直なのはショートカットキーを利用することです。 ショートカットキーは、多用しますので<共通記号定数>モジュールにまとめるといいです。 Private Sub s_name_KeyPress(KeyAscii As Integer)   If KeyAscii = 13 Then     SendKeys conGotoMain, False     KeyAscii = 0   End If End Sub ' ---------------------------------------------------------------------------------------- ' 共通記号定数 ' ---------------------------------------------------------------------------------------- Option Compare Database Option Explicit ' ' ショートカットキー ' Public Const conGotoMain = "^(+({HOME}))" Public Const conGotoSub = "^(+({HOME})){UP}{TAB}" Public Const conDefaultValue = "^(%({ }))" Public Const conPreviousValue = "^("")" Public Const conClearField = "+({UP}){DELETE}+({DOWN}){DELETE}" Public Const conRestoreField = "{ESC}" Public Const conNextField = "{TAB}" Public Const conPreviousField = "+({TAB})" Public Const conNextRecord = "^({PGDN})" Public Const conPreviousRecord = "^({PGUP})" Public Const conRequery = "+({F9})" Public Const conNewRecord = "^({+})" Public Const conDropDown = "{F4}"

himiko_1947
質問者

補足

私が使うのではなくて、他人に使用してもらうものなので、ショートカットキーは使用したくないんですが。 それと、確か、ショートカットキーってカスタマイズ出来ませんでしたっけ。

その他の回答 (4)

noname#182251
noname#182251
回答No.5

#2です >KeyDownイヴェントで↓はうまく機能しません If KeyCode = 13 Or KeyCode = 9 Or KeyCode = 40 Then で、だめですか?私の方はうまく行くのですが 以下は余談です。 >VBAは殆どご存じないし、サブフォームの作り方も分からないのに、アドバイスになりました。 なんで? ・プログラミングの経験は20年以上あります ・久しい以前、仕事でアクセスのフォームもずいぶん作りました。もちろんサブフォームも。でも全部忘れた(^^; ・現在MDBはデルファイをフロントエンドに、ADO接続で操作しています。この方が大幅に楽です。

himiko_1947
質問者

お礼

ありがとうございます。 アスキーコードが間違ってました。 古いコード表なので下矢印が35になってました。 vbKeyDownやvbKeyRightという書き方も、発見しました。 また余談の件、なにか私が勘違いしたようで、失礼な事を書きました。申しわけありません。 大変参考になりました。

noname#22222
noname#22222
回答No.4

s_husky です。 少し、誤解があるようですね。 まず、コードはテストしていますのでエラーなく動作します。 1、標準ライブラリで記号定数を定義していることが前提です。   SendKeys "^(+({HOME}))", False   と書いても、もちろんOKです。 2、<Me.CurrentRecord = 2>は条件文に関する説明です。   2は、ラストレコードに!・・・ということです。   Me.RecordsetClone.RecordCount であれば、可変的なレコード数にも対応します。   代入文ではなく論理式ですからエラーは発生しません。 3、TabIndexは、タブの移動順です。 なお、フォームキーイベントを使用しているのは、幾つかの特殊な条件でテキストボックスのキーイベントが取得できなくなるからです。どういうケースに取得不可かを知って利用すべきだからです。その点、フォームキーイベントは安心です。

himiko_1947
質問者

お礼

大変参考になりました。 いろいろ誤解をしてしまってごめんなさい。 fuuten_no_nekoさんの回答も参考にしながら、無事動くようになりました。 またご指摘のようにフォームキーイベントに移しました。

noname#22222
noname#22222
回答No.3

s_husky です。 面目ない。 KeyPress で反応しないようですので・・・再回答。 次ですとOKと思います。 フォームのキーボードイベントを取得=はい が前提です。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   If KeyCode = 13 or KeyCode = 9 Then     If Me.CurrentRecord = 2 And Me.ActiveControl.TabIndex = 2 Then       SendKeys conGotoMain, False     End If   End If End Sub Me.CurrentRecord = 2 Me.ActiveControl.TabIndex = 2 最終レコードの数、最終テキストボックスのTabIndex でショートカットキーを送るタイミングを判断しています。 質問者の状況に合わせて下さい。 なお、ショートカットキーについてはAccess97のマニュアルに書かれています。

himiko_1947
質問者

お礼

Indexの構文間違ってましたね。ActiveControl が抜けてました。 Me.CurrentRecoord = 2 を調べてみましたが、これってこの構文は使えないという事ですが?現実にこの構文で実行すると、エラーが出ます。プロパティの値を得るだけの関数ですね。 使い方としては、 TurgetCurrentRecord = Me.CurrentRecord MsgBox("カレントレコードは; " & TurgetCurrentRecord) てな、使い方になるんでしょうか。 どちらにしろ、ここの意図を教えて頂けませんか? テーブルの特定のレコードにジャンプするという意図なんでしょうか?

himiko_1947
質問者

補足

回答ありがとうございます。 これも、ショートカットのキー操作を送るルーチンですよね? このルーチンの中に、ショートカットの定義を読んでくるルーチンが必要だったのでは? Me.CurrentRecord = 2 とは、サブフォームのレコード番号ですか? また Me.TabIndex = 2 とは、テキストボックスのタブ移動順の番号を指すのでしょうか? 教えて頂けませんか?

noname#182251
noname#182251
回答No.2

VBAはほとんど知らないので、興味深く試してみました。s_huskyさんにケチをつけるつもりは毛頭ありません。で、私の環境:Microsoft(R) Access 2000 (9.0.6926 SP-3)ではKeyPressでエンターキーがとれませんでした。KeyDownならばつかまるようなので、若干直してみました。 Private Sub name_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Or KeyCode = 9 Then Me![xxx].SetFocus KeyCode = 0 End If End Sub TABキーも対象に加え、SetFocusで移動します。これならばどこにでも移動できると考えるのですが、サブフォームからメインフォームを試していません。長いことアクセスのフォームはいじっていないので、メイン/サブのフォームの作り方を忘れました(と云うかめんどくさい)(^^;

himiko_1947
質問者

お礼

サブフォームからメインフォームに移動するのには、テキストコントロールの名前を指定して移動する事ができないという固定観念があったのですが、TABキーとENNTERキーでは見事に移動しました。 ただ、標準では下矢印キーでも同じ機能をしますが、上記のようにKeyDownイヴェントで↓はうまく機能しません。 もう少し調べますが、何らかのヒントでもあれば教えて頂けませんか? 追記:KeyPressイヴェントはENTERキーを検出出来るらしいです。TABキーとかは駄目みたいですね。 VBAは殆どご存じないし、サブフォームの作り方も分からないのに、アドバイスになりました。 なんで?

himiko_1947
質問者

補足

ややっ!できますねぇ。 ありがとうございます。 サブフォームからメインフォームへの移動は、 Forms![MainForm]![Field名].SetFocus で出来ました。 ただ、矢印キー:KeyCode = 31,KeyCode = 28 には、反応しませんねぇ。

関連するQ&A