【保存版】2013年度発売全パチスロアプリ一覧(iPhone,iPad)

【Access】コンボボックス対応版。超簡単な帳票フォームでの矢印上下キー行移動。

Accessの画面でデータの一覧表示時に帳票フォームを使用した場合、
EXCELのように上下矢印キー(↑↓)で行移動したいという要望がよくあります。

帳票フォームでは、矢印キーを押下した場合、
行移動ではなく次の項目に移動しますが、
一方、データシートビューでは矢印キーで行移動します。

帳票フォームでも同じ動作にしてもらいたいところですが、
たぶん、今後も対応されることはないと思います。

そこで、データシートビューと同様、上下矢印キー(↑↓)で
行移動するようにプログラム側で対応する方法をご紹介します。

対応方法は割と簡単。

ポイントは2つ。
・帳票フォームのキークリック時のイベントで、キー入力を取得する
・上下矢印キーが押下された場合のみ、レコードを移動。

これを実現するソースをご紹介します。汎用性を持たせるため、
メインロジックは、標準モジュールに記述します。
(数年前当サイトでご紹介したもののバージョンアップ版です。)
【Access】帳票フォームにおいて上下矢印キーでレコードを移動する。

また、コンボボックスですでにドロップダウンリストを表示している場合は、
レコード移動ではなく、リスト内を上下するようにしています。
ただし、Accessではドロップダウン時のイベントが存在しませんので、
この部分に関しては、以下の雅さんのロジックを使用させていただいております。(API呼出あり)
雅のプログラム研究所
コンボボックスがドロップダウンされているか判断する方法
感謝。

では、サンプルの説明に入ります。

標準モジュールに以下の矢印キー移動用ロジックを作成します。
(標準モジュールを新規作成し、以下の内容をコピー)

ソースここから---------------------------------------------------------

Option Compare Database
Option Explicit

Private Type Type_EnumWindowParameter
WindowHandle As Long
ComboBoxWindowHandle As Long
End Type

Private Type Type_RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Const GW_OWNER As Long = 4
Private Const GW_CHILD As Long = 5

Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
ByRef lpRect As Type_RECT) As Long
Private Declare Function IntersectRect Lib "user32" _
(lpDestRect As Type_RECT, _
lpSrc1Rect As Type_RECT, _
lpSrc2Rect As Type_RECT) As Long

Private Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByRef lParam As Type_EnumWindowParameter) As Long

Private Declare Function IsWindowVisible Lib "user32" _
(ByVal hwnd As Long) As Long

Private Function IsDropDown() As Boolean

Dim Parameter As Type_EnumWindowParameter

IsDropDown = False

' 親ウィンドウの判定方法を「指定したウィンドウハンドルと一致する場合」を使用する
' 場合でフォームがポップアップの場合はこちらのパラメータを指定します。
' 親ウィンドウの判定方法をコンボボックスウィンドウが指定したウィンドウと
' 重なっている場合を使用する場合はこちらのパラメータを指定します。

'2012/10/17 edit purapura *********************************************
'Parameter.WindowHandle = Me.hwnd
Parameter.WindowHandle = Screen.ActiveForm.hwnd
'**********************************************************************

' 親ウィンドウの判定方法を「指定したウィンドウハンドルと一致する場合」を使用する
' 場合でフォームがポップアップではない場合はこちらのパラメータを指定します。
' Parameter.WindowHandle = Application.hWndAccessApp

If EnumWindows(AddressOf EnumWindowProc, Parameter) <> 0 Then
Exit Function
End If

IsDropDown = IsWindowVisible(Parameter.ComboBoxWindowHandle)

End Function

Private Function EnumWindowProc(ByVal WindowHandle As Long, _
ByRef lParam As Type_EnumWindowParameter) As Long

Dim Buffer As String

Dim WindowRect As Type_RECT
Dim ComboBoxRect As Type_RECT
Dim WorkRect As Type_RECT

Buffer = Space(1024)

Call GetClassName(WindowHandle, Buffer, 1024)

EnumWindowProc = True

If Trim$(Buffer) <> "ODCombo" Then
Exit Function
End If

Call GetWindowRect(lParam.WindowHandle, WindowRect)
Call GetWindowRect(WindowHandle, ComboBoxRect)

If IntersectRect(WorkRect, WindowRect, ComboBoxRect) = 0 Then
Exit Function
End If

lParam.ComboBoxWindowHandle = GetWindow(WindowHandle, GW_CHILD)

EnumWindowProc = False

End Function

Public Sub gfnc_Yajirusi_Ido(KeyCode As Integer)
'矢印ボタンでのレコードの移動制御

On Error GoTo Err_Syori

If IsDropDown = True Then
'ドロップダウンされている場合、処理を抜ける
Exit Sub
End If

Select Case KeyCode
Case vbKeyDown
'↓
'次レコードへ移動
DoCmd.GoToRecord Record:=acNext
Case vbKeyUp
'↑
'前レコードへ移動
DoCmd.GoToRecord Record:=acPrevious

End Select

Exit Sub

Err_Syori:
'移動先レコードがない場合、キー入力をキャンセル
KeyCode = 0
End Sub

ソースここまで---------------------------------------------------------

後は、フォームのキークリック時イベントから、gfnc_Yajirusi_Idoを呼び出します。
これで上下キーで行(レコード)移動が実現できます。

以下、フォーム側での実装サンプル。

フォームは、メインフォーム、サブフォームの形式になっており、
サブフォームのレコードソースにテーブルを直結しています。

(フォームデザイン画面)
Access上下キー移動サンプル_デザイン


矢印キーで上下移動したいフォーム(本サンプルの場合サブフォーム側)上の
フォーム→プロパティー→イベント:キーイベントの取得を「はい」に設定。
これを忘れると動作しないので注意

(フォームプロパティー)
Access上下キー移動サンプル_イベントプロパティー_1


次に、フォーム→プロパティー→イベント:キークリック時のイベントにイベントプロシージャーを指定し、プロシージャーに以下の記述を追加します。

Call gfnc_Yajirusi_Ido(KeyCode) '矢印移動制御

(フォームプロパティー)
Access上下キー移動サンプル_イベントプロパティー_2

(イベントプロシージャー記述内容)
Access上下キー移動サンプル_イベントプロシージャー


フォーム側の設定はこれで完了です。



(サンプル画面)
Access上下キー移動サンプル_画面

上記サンプル画面では、上下矢印キーで一覧表示されている項目を行移動し、
コンボボックスがリスト表示されている場合は、そのリスト内を移動します。

動作確認環境
・WindowsXP SP3(32bit)+Access2003 SP3(32bit)
・Windows7 SP1(64bit)+Access2010 SP3(32bit)
ただし、ドロップダウンリスト移動に関してはサンプル以上の確認をおこなっていません。
不具合等あればお知らせいただければ助かります。

Access2010の人気書籍。(Amazonランキングより)
>>Accessのデータベースのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!Access2007/2003対応


>>Accessマクロ&VBAのプログラミングのツボとコツがゼッタイにわかる本


>>よくわかるMicrosoft Access2010基礎
>>よくわかるMicrosoft Access2010応用

Access2010単体。
>>Microsoft Office Access 2010 通常版 [ダウンロード]
>>Microsoft Office Access 2010 通常版 [パッケージ]
>>Microsoft Office Access 2010 アップグレード優待 [ダウンロード]
>>Microsoft Office Access 2010 アカデミック [パッケージ]
>>Microsoft Office Access 2010 アップグレード優待 [パッケージ]
[Google PR]

Twitterはじめました。プラプラ | Twitter

<< 【デジモノ】かっこいい卓上スピーカー Jawbone JAMBOX他。
【セキュリティー】ラック社の驚くべき「iesys.exe(アイシス)」ウイルス解析結果。 >>

[関連エントリ 最新5]

[Google PR]


[最新エントリ 5]

>>トップページ
人気カテゴリ:AccessTips SQLServer CakePHP iPad
過去ログ(全記事一覧)

コメント
コメントする(お気軽にどうぞ)









この記事のトラックバックURL
トラックバック
カテゴリー
プロフィール
お問い合わせ
Powered by NINJA TOOLS
links
recent comment
  • 【Access】vbaでhmacが正しく計算できた!!
    まさ (06/01)
  • 【Access】AccessReportMailメール送信時のポートを25から587へ
    わら (05/31)
  • 【SQLServer】超シンプル!再帰CTE(共通テーブル式)で連続データを作成する。
    sazi (09/08)
  • 【あまっちゃお】Amazon商品検索「あまっちゃお」プロジェクト始動。Ver00-06-00 β
    カメちゃん (07/31)
  • 【Access】あれ?DoCmd.RunCommand acCmdSaveRecordの内部仕様が変わった?
    花姉 (03/17)
  • 【Access】実行中のmdb(自分自身)をバックアップコピーする方法。
    亀 (02/06)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    管理人 (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    あ (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    K (11/13)
  • 【VAIOP】VaioXと両持ちできるものすっっごくマニアックなケース。当たり前ですが在庫限り。(笑)
    管理人 (08/04)
recent trackback
  • 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
    awgs Foundry (10/29)
  • 【VAIOtypeP】液晶保護シートは、新車のカバーではない。レイアウト社液晶/天板保護フィルムセットRT-VP1FS1
    XMLがキライ。 (04/09)
  • Vistaから、LinkStation(NAS)にアクセスできません。
    そのほかいろいろ (09/06)