【VBA】ユーザーフォーム上のコントロールをマウスでドラッグして移動する方法
通常 UserForm 上の Control はマウスでドラッグして移動させることはできませんが、ちょっとしたテクニックでドラッグすることが可能です。
今回はその方法をご紹介します。
デモ
以下のサンプルは UserForm 上に配置した Label コントロールをドラッグしています。
※サンプルでは Label を使用していますが、どのコントロールでも適用可能です。
サンプルコード
Option Explicit
Private posX As Single 'X座標
Private posY As Single 'Y座標
Private Sub Target_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
'左クリックの検出
If Button = 1 Then
'クリック位置の保存
posX = X
posY = Y
End If
End Sub
Private Sub Target_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
'左クリックの検出
If Button = 1 Then
'マウスが移動した分コントロールを移動
With Target
.Top = .Top + Y - posY
.Left = .Left + X - posX
End With
End If
End Sub
使用する変数
Private posX As Single 'X座標
Private posY As Single 'Y座標
使用する変数はX座標、Y座標を退避させておくposX
とposY
の2つだけです。
MouseDown イベント
'左クリックの検出
If Button = 1 Then
'クリック位置の保存
posX = X
posY = Y
End If
何かしらのマウスのボタン押下をトリガーにMouseDown
イベントが発生します。
引数として渡されるButton
を使用して左クリックを検出し、同時に渡されるX座標とY座標を退避させます。
MouseMove イベント
'左クリックの検出
If Button = 1 Then
'マウスが移動した分コントロールを移動
With Target
.Top = .Top + Y - posY
.Left = .Left + X - posX
End With
End If
コントロール上でマウスを動かした時に発生するMouseMove
イベントの中で、マウスが移動した分コントロールを移動します。
例えばマウスが右に1pt動いたらコントロールも右に1pt、下に1pt動いたらコントロールも下に1pt動かす、といった感じです。もちろん、マイナス方向も然りです。
まとめ
通常できないことをやろうとすると、「APIが必要なのでは」とか「複雑な処理が必要なのでは」とか難しく考えてしまいがちですが、今回の様によく使われるイベントを使用してこれだけ少ないコードでも通常できないことを実現できるといったことは少なくありません。
技術・知識が多いに越したことはないありませんが、柔軟な発想力が大事ってことですね。
ご質問などありましたらお気軽にお問い合わせください。
VBAのフォーム上にイメージを張り付ける画像ビューアを作っていて、画像を拡大した際に、マウスで画像ファイルを動かせる機能をつけることができました。2番目のプロシージャは、moveにするとファイル選択画面のマウスにも反応してしまい、最初から画像が動いてしまったので、moveの部分だけ変えました(up)。マウスの操作性は、moveの方がよかったのですが、とりあえず、機能はつけられたので、助かりました。ありがとうございます。ちなみに、windows10 access2010 で、エクセルのVBAフォームをアクセスにインポートしたものです。