プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (5件)

安直なのはショートカットキーを利用することです。


ショートカットキーは、多用しますので<共通記号定数>モジュールにまとめるといいです。

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}"

この回答への補足

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

補足日時:2006/09/14 17:02
    • good
    • 0

#2です


>KeyDownイヴェントで↓はうまく機能しません

If KeyCode = 13 Or KeyCode = 9 Or KeyCode = 40 Then

で、だめですか?私の方はうまく行くのですが

以下は余談です。
>VBAは殆どご存じないし、サブフォームの作り方も分からないのに、アドバイスになりました。
なんで?

・プログラミングの経験は20年以上あります
・久しい以前、仕事でアクセスのフォームもずいぶん作りました。もちろんサブフォームも。でも全部忘れた(^^;
・現在MDBはデルファイをフロントエンドに、ADO接続で操作しています。この方が大幅に楽です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
アスキーコードが間違ってました。
古いコード表なので下矢印が35になってました。
vbKeyDownやvbKeyRightという書き方も、発見しました。

また余談の件、なにか私が勘違いしたようで、失礼な事を書きました。申しわけありません。
大変参考になりました。

お礼日時:2006/09/15 12:39

s_husky です。



少し、誤解があるようですね。
まず、コードはテストしていますのでエラーなく動作します。

1、標準ライブラリで記号定数を定義していることが前提です。
  SendKeys "^(+({HOME}))", False
  と書いても、もちろんOKです。
2、<Me.CurrentRecord = 2>は条件文に関する説明です。
  2は、ラストレコードに!・・・ということです。
  Me.RecordsetClone.RecordCount であれば、可変的なレコード数にも対応します。
  代入文ではなく論理式ですからエラーは発生しません。
3、TabIndexは、タブの移動順です。

なお、フォームキーイベントを使用しているのは、幾つかの特殊な条件でテキストボックスのキーイベントが取得できなくなるからです。どういうケースに取得不可かを知って利用すべきだからです。その点、フォームキーイベントは安心です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/15 12:44

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のマニュアルに書かれています。

この回答への補足

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

補足日時:2006/09/14 17:15
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/14 23:56

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で移動します。これならばどこにでも移動できると考えるのですが、サブフォームからメインフォームを試していません。長いことアクセスのフォームはいじっていないので、メイン/サブのフォームの作り方を忘れました(と云うかめんどくさい)(^^;

この回答への補足

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

補足日時:2006/09/14 16:55
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/15 00:14

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

関連するカテゴリからQ&Aを探す