Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No15069.マウスのスクロールボタンをいじるとレコードが移動してしまう

タイトルマウスのスクロールボタンをいじるとレコードが移動してしまう
記事No: 15069
投稿日: 2004/01/28(Wed) 04:17
投稿者: ジャスミン
OS:WinXP
Access Version:2000

こんにちは。ACCESS暦3ヶ月のジャスミンです。
初歩的な質問ですみません。
データ入力用の単票形式フォームAで、移動ボタン、スクロールバーともに
非表示にしているのですが、新規レコード入力中に(その時点で最後のレコード
になりますが)マウスのスクロールボタンをいじると、新規レコードに
移動してしまいます。
新規レコードは登録コマンドボタンをおすと、入力必須項目が空欄の場合は
入力を促すメッセージボックスが出て、入力が完了すると続けて登録するか
聞いて来るメッセージボックスが出て、「はい」にすると新規レコードに移動する、
という仕組みにしています。なので、登録ボタンを押さない限り次の登録作業に進めなく
したいのですが、誤ってマウスをいじってしまうと新規レコードに移ってしまうのです。
どうしたらこういったことを防げるのでしょうか。
宜しくご教授願います。

タイトルRe: マウスのスクロールボタンをいじるとレコードが移動してしまう
記事No: 15070
投稿日: 2004/01/28(Wed) 08:57
投稿者: クロ
まず、はじめにマウスのスクロールボタンの制御は難しいと思います。
※出来ないことはないらしいですが...APIからの制御など

で、代替案なのですが

フォームの「追加の許可」で制御します。但し、遡りには対処してません。

そのレコード最初に必須入力されるフィールドの更新後処理あたりに

Private Sub フィールドA名_AfterUpdate()
 '追加の許可をいいえにする
 Me.AllowAdditions = False
End Sub

これを入れます。

次に、そのレコード最後に必須入力されるフィールドの更新処理後に

Private Sub フィールドB名_AfterUpdate()
 '追加の許可をはいにする
 Me.AllowAdditions = True
 '次のレコードへ
 DoCmd.GoToRecord , , acNext
 '移った先のレコード先頭フィールドへ
Me.先頭フィールド名.SetFocus
End Sub

を入れることで対処します。
また、これを「次へ」「Next」等のコマンドボタンを作成して充ててもいいと思います。
こんな感じでどうでしょうか?

タイトルRe^2: マウスのスクロールボタンをいじるとレコードが移動してしまう
記事No: 15071
投稿日: 2004/01/28(Wed) 09:59
投稿者: hainz090
横レス失礼致します。hainz090です。

移動ボタン以外では移動できないプログラム作ってみました。
いかがですか?(プログラム内の[]の部分はmdbにあわせて変えて下さいね。)
以下はフォームに貼り付けるプログラムです。

'******マウスホイール無効化******
'利口な方法ではありませんが、専用の移動ボタンを使ったときのみ
'フラグを立て、フラグONのときは移動を許可しレコード移動後にフラグOFFにします。
'それ以外の方法で移動したときは強制的にもとのレコードへ戻ります。
'マウスホイールの情報(API使用による)はいじくらないので、mdbの安定性が損なわれる
'ということも無いかと思います。(簡単なコードなので)。
'但し、挙動は一度移動してから戻る形ですから、レコード等は保存されて
'しまうのでそれなりの処理を施す必要があるかもしれません。

'flg_nomouseは不可視のチェックボックス(非連結)としてフォームに用意します。

'---------以下、無効化するフォームに貼り付け--------
Option Compare Database
Option Explicit
'値保持のため、下の2つの変数は一番上のプログラム(Private Sub〜)より
'上に記述します(モジュールレベル変数)。
Dim Cnt As Long '何番目のレコードかを格納
Dim nomouse As Boolean'ボタンにて移動したときにONになります

'次のレコードへ移動ボタンのプログラム
Private Sub [btn_next]_Click()

On Error GoTo Err_next

Me!flg_nomouse = True 'フラグON
nomouse = Me!flg_nomouse '変数として代入
DoCmd.GoToRecord acDataForm, "[フォーム名]", acNext
Cnt = Me.CurrentRecord '移動先のレコードカウントを取得

Exit_next:
Exit Sub

Err_next:
MsgBox Err.Number & vbNewLine & Err.Description
Resume Exit_next

End Sub

'1つ前のレコードに移動ボタンのプログラム
Private Sub [btn_prev]_Click()
On Error GoTo Err_prev

Me!flg_nomouse = True
nomouse = Me!flg_nomouse '変数として代入
DoCmd.GoToRecord acDataForm, "[フォーム名]", acPrevious
Cnt = Me.CurrentRecord '移動先のレコードカウントを取得

Exit_prev:
Exit Sub

Err_prev:
MsgBox Err.Number & vbNewLine & Err.Description
Resume Exit_prev

End Sub

'フォームのレコード移動時のプログラム
Private Sub Form_Current()

'レコード移動時に最初のレコードであれば
'戻るボタンを、最後のレコードであれば
'進むボタンを使用不可にする。

Dim lastid As Integer '最後のレコード
Const startid As Integer = 1 '最初のレコード
lastid = DMax("[ID名]", "[テーブル名]")

On Error GoTo Err_current

If Me![txt_ID] = startid Then
Me![btn_prev].Enabled = False
Else
Me![btn_prev].Enabled = True
End If

If Me![txt_ID] = lastid Then
Me![btn_next].Enabled = False
Else
Me![btn_next].Enabled = True
End If

If nomouse = False And Me.CurrentRecord <> Cnt Then
DoCmd.GoToRecord acDataForm, "[フォーム名]", acGoTo, Cnt
End If

Me!flg_nomouse = False
nomouse = Me!flg_nomouse

Exit_current:
Exit Sub

Err_current:
MsgBox Err.Number & vbNewLine & Err.Description
Resume Exit_current

End Sub

'フォームの開く時イベントのプログラム
Private Sub Form_Open(Cancel As Integer)
'初期化
Cnt = 1

End Sub

タイトルRe^3: マウスのスクロールボタンをいじるとレコードが移動してしまう
記事No: 15081
投稿日: 2004/01/28(Wed) 16:22
投稿者: ジャスミン
クロさん、いつもありがとうございます。
hainz090さん、はじめまして。ありがとうございます。
今日はACCESSで作業できる環境にないので、明日、ゆっくり試してみたいと思います。
それでは!

タイトルマウスのスクロールボタンをいじるとレコードが移動してしまう パート2
記事No: 15265
投稿日: 2004/02/04(Wed) 16:59
投稿者: ジャスミン
同じトピックで既に投稿させて頂いていてレスも頂いてましたが、
すっかりこちらからの回答が遅くなってしまい、且つ、新たな展開が
あったのでパート2として新トピで掲載させて頂きました。
クロさん、hainz090さん、お待たせしてごめんなさい。
他業務に追われてACCESSに迎えなかった日々からやっと脱出です。

さて、先日hainz090さん案でトライしてみたところ、エラーが出てしまいました。
で、実は今、「新規登録案件登録画面」の入力フォームの設計を
一部変更しようと思ってまして。
同フォームは、「全件クエリ」をレコードソースとし、「全件クエリは」
「全件テーブル」と「相手先マスタ」を、後者の「相手先コード」という
フィールドでリレーション組んでいるものです。
「相手先マスタ」の構成は、
*「相手先コード」(オートナンバー)、
*「検索用」(テキスト)、
*「相手先」(テキスト)の
という3つのフィールドからなっています。
「検索用」とは、別の検索用フォームで相手先を検索する際の
検索速度を上げるため、相手先をマスタ登録する際に
「あ、か、さ、た、な...ABC、DEF、GHI、...」に
分類して登録するように設けたものです。

現状は、「相手先コード」コンボボックス(3つのフィールドすべてを
リスト表示)から相手先を選択したら、相手先コードが入力され、
「相手先」テキストボックスに相手先名が代入されるという仕組みになっています。

この「相手先コード」コンボボックスをリストボックスに変えて、
且つ、リストに表示される内容をオプショングループのトグルボタンで抽出するという
方法に変えたいのです。

で、リストボックス表示されるのは、「相手先」(名)だけでいいのですが、
コントロースソースは相手先コードとし、「選択」という
コマンドボタンを押したら相手先コードが入力されて、やはり
「相手先」テキストボックスに相手先名が代入されると。

前置きが長くなりましたが、とりあえずリストボックス
とオプショングループとトグルボタンを配置してみたところ、
マウスのスクロールボタンにはフォームではなくリストが反応する
ようになったんです。これはたまたまですか?

もしリストボックスを置くことでレコード移動が防げるのであれば
一石二鳥なのですが。。。

いずれにしてもまずはこのリストボックスとオプショングループを
作成したく、途中まで取り掛かってみました。
リストボックスは、
*名前:相手先コード
*値の集合ソース:SELECT [相手先マスタ クエリ].[相手先コード], [相手先マスタ クエリ].[検索用], [相手先マスタ クエリ].[相手先] FROM [相手先マスタ クエリ];
*連結列:1
*列数:3
*列幅:0cm;0cm;5cm

オプショングループ名はフレーム2で、クリック時イベントに、

Private Sub フレーム2_Click()

Select Case フレーム2
Case 1
Me.Filter = "検索用='あ行'"
Case 2
Me.Filter = "検索用='か行'"
Case 3
Me.Filter = "検索用='さ行'"
Case 4
Me.Filter = "検索用='た行'"
Case 5
Me.Filter = "検索用='な行'"
Case 6
Me.Filter = "検索用='は行'"
Case 7
Me.Filter = "検索用='ま行'"
Case 8
Me.Filter = "検索用='や行'"
Case 9
Me.Filter = "検索用='ら行'"
Case 10
Me.Filter = "検索用='わ行'"
Case 19
Me.Filter = "検索用='数字記号'"
Case 11
Me.Filter = "検索用='ABC'"
Case 12
Me.Filter = "検索用='DEF'"
Case 13
Me.Filter = "検索用='GHI'"
Case 14
Me.Filter = "検索用='JKL'"
Case 15
Me.Filter = "検索用='MNO'"
Case 16
Me.Filter = "検索用='PQRS'"
Case 17
Me.Filter = "検索用='TUVW'"
Case 18
Me.Filter = "検索用='XYZ'"
Case 20
Me.Filter = "検索用='不特定'"


End Select

Me.FilterOn = True
End Sub

と入れると、トグルボタンを押すごとに全件クエリのレコードが
フォーム上で抽出されてしまいます。Me.Filterの部分をリストボックスの
Column(1)の検索用に置き換えればうまくいくのでしょうか。
書き方を教えてください。

また、前述の選択ボタンを押したら選択した相手先がコードで
「相手先一覧」リストボックスに入力され、「相手先」に相手先名が
代入されるようにするにはどうしたらいいのでしょうか。
何から何まで聞いてしまって申し訳ないのでうが、早急に改良を
迫られていまいして。

宜しくお願い致します。他にも改良したい点がありますので
新トピで投稿します。

タイトルRe: マウスのスクロールボタンをいじるとレコードが移動してしまう パート2
記事No: 15266
投稿日: 2004/02/04(Wed) 17:02
投稿者: ジャスミン
あ、新規投稿しないと、タイトルを変えただけでは新トピには
ならないのですね(恥)。失礼しました。
新着記事にあがったのでクロさん、hainz090さん、ご覧頂けてるでしょうか。。。

タイトルRe: パート2
記事No: 15283
投稿日: 2004/02/04(Wed) 22:35
投稿者: クロ
そんなに一度に投稿されないほうがいいと思います。
もう少し流れを簡潔に書いてください。
フレームのオプションを選択→リストボックスの値集合ソースが絞り込まれる→リストボックスで
選択→フォームの新規レコードの相手先コードに相手先コードが代入される
でいいのですか?

ジャスミンさんが書かれたフレームのコードはフォーム自身にフィルタするものです。
※書き込みも洩れだと思いますが「Select Case フレーム2」ではダメです。
 「Select Case Me.フレーム」です
私が書いた流れでいいのなら
フレームのオプションを選択することでリストボックスの値集合ソースを絞り込むなら
以下のようにしてください。

Private Sub フレーム2_Click()

Dim strSQL As String

strSQL = "SELECT 相手先コード, 検索用, 相手先" & _
" FROM [相手先マスタ クエリ]" & _
" WHERE "

Select Case Me.フレーム2
Case 1
Me.相手先コード.RowSource = strSQL & "検索用='あ行'"
Case 2
Me.相手先コード.RowSource = strSQL & "検索用='か行'"
  
   ****省略**** 

End Select
Me.相手先コード.Requery
End Sub

これで絞り込まれると思います。

>フォームは、「全件クエリ」をレコードソースとし、「全件クエリは」
>「全件テーブル」と「相手先マスタ」を、後者の「相手先コード」という
>フィールドでリレーション組んでいるものです。

質問なんですが全件テーブルの相手先コードのデータ型は何?

数値型として話を進めます。

リストボックスで選択後の選択コマンドボタン(cmd選択とします)に

Private Sub cmd選択_Click()
Me.FilterOn = True
Me.Filter = "[相手先コード] =" & Me.list相手先コード.Column(0)
DoCmd.GoToRecord , , acNewRec
Me.相手先コード.SetFocus
Me.相手先コード = Me.list相手先コード.Column(0)
End Sub

と書いてください。


それとフィルタを使用する場合は通常レコードは全件表示されます。
また、スクロールボタンの件はパスしてますのであしからず...

タイトルRe^2: パート2(一部訂正)
記事No: 15293
投稿日: 2004/02/05(Thu) 09:13
投稿者: クロ
> ※書き込みも洩れだと思いますが「Select Case フレーム2」ではダメです。
>  「Select Case Me.フレーム」です

間違えてる...逆です。

※書き込みも洩れだと思いますが「Select Case フレーム」ではダメです。
 「Select Case Me.フレーム2」です

タイトルRe^2: パート2(一部訂正2)..泣
記事No: 15294
投稿日: 2004/02/05(Thu) 09:20
投稿者: クロ
同フォーム上に同じコントロール名があるとダメなので
リストボックスの「相手先コード」の名前を「list相手先コード」にしてください。
Private Sub フレーム2_Click()のイベントの「Me.相手先コード」は「Me.list相手先コード」と
変えてください。

※ゴメン何度も訂正して

タイトルRe^2: パート2:補足
記事No: 15296
投稿日: 2004/02/05(Thu) 10:01
投稿者: hainz090
おはようございます。hainz090です。

私もクロさんと同意見です。わけがわからなくなってしまいました。

ちなみに、リストボックスではレコード移動はしませんが、
他のコントロールにフォーカスのある状態だとレコード移動してしまいます。
とりあえず、どこでエラーが発生したのでしょうか??

また、抽出ですが検索はコード(数値型)で持った方がいいように思います。
あ行 = 1
か行 = 2
以下同様に……。
オプショングループは数値型で値を持っていますからそのほうが走るプログラムは
分岐せず簡単で済みますよ。後の拡張(検索条件が増えたとき)も簡単に出来ますし。

Private Sub フレーム2_Click()'リスト抽出

Dim strSQL As String

strSQL = "SELECT 相手先コード, 検索用, 相手先" & _
     " FROM [相手先マスタ クエリ]" & _
     " WHERE 検索用 =" & Me!フレーム3

 Me!list相手先コード.RowSource = strSQL
 Me!list相手先コード.Requery

End Sub

またコード、相手先をデータとして両方持つ必要はあるのでしょうか?
DBの正規化についても検索してご覧になってみて下さいね。

ではでは。

[次頁]

 

ページの先頭へ 前ページへ戻る