ACCESSにおけるマウスホイールのキャンセル

accessにおいてフォームの中にサブフォームを単票フォームで作ると、どうしてもサブフォームの上でマウスをホイールすると新規レコードに移ってしまう。
この問題がずーと解決できずにいました。
しかし、先日それを解決出来る方法を見つけましたので、自分のブログに忘れないように記載しておこうと思います。

1.AccessのVBE画面を表示します。

2.メニューから挿入(I)→クラスモジュール(C)を実行します。
プロジェクトエクスプローラにClass1が挿入されます。
Class1モジュールの名前をCMouseWheelに変更します

3.クラスモジュールに貼り付けるコード

Private frm As Object
Private intCancel As Integer
Public Event MouseWheel(Cancel As Integer)

Public Property Set Form(frmIn As Object)
  Set frm = frmIn
End Property

Public Property Get MouseWheelCancel() As Integer
  MouseWheelCancel = intCancel
End Property

Public Sub SubClassHookForm()
  lpPrevWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf WindowProc)
  Set CMouse = Me
End Sub

Public Sub SubClassUnHookForm()
  Call SetWindowLong(frm.hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub

Public Sub FireMouseWheel()
  RaiseEvent MouseWheel(intCancel)
End Sub

4.メニューから挿入(I)→標準モジュール(M)を実行します。
プロジェクトエクスプローラにModule1(環境により変わる)が挿入されます。

5.(標準モジュールに貼り付けるコード)貼り付けます。その際

Public CMouse As CMouseWheel
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
  (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, _
   ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const GWL_WNDPROC = -4
Public Const WM_MouseWheel = &H20A
Public lpPrevWndProc As Long

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  
  Select Case uMsg
    Case WM_MouseWheel
      CMouse.FireMouseWheel
      If CMouse.MouseWheelCancel = False Then
        WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
      End If
    Case Else
      WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
  End Select
End Function

6.マウスのホイールを無効にしたいフォームに下記コードを記述する

Private WithEvents clsMouseWheel As CMouseWheel

Private Sub Form_Load()
  Set clsMouseWheel = New CMouseWheel
  Set clsMouseWheel.Form = Me
  clsMouseWheel.SubClassHookForm
End Sub

Private Sub Form_Close()
  clsMouseWheel.SubClassUnHookForm
  Set clsMouseWheel.Form = Nothing
  Set clsMouseWheel = Nothing
End Sub

Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)
  'MsgBoxがいらなければ以下の行を削除します。
  MsgBox "マウスホイール使用不可"
  Cancel = True
End Sub

8.VBE画面を閉じ、データベースウインドウからモジュールを選択します。

9.Accessを一旦閉じます。

これにより、mds-rapsのプログラムは完成することができそうです