【VBA】ユーザーフォーム上のコントロールをマウスでドラッグして移動する方法

通常 UserForm 上の Control はマウスでドラッグして移動させることはできませんが、ちょっとしたテクニックでドラッグすることが可能です。
今回はその方法をご紹介します。




デモ

以下のサンプルは UserForm 上に配置した Label コントロールをドラッグしています。

※サンプルでは Label を使用していますが、どのコントロールでも適用可能です。

UserFormj上の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座標を退避させておくposXposYの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が必要なのでは」とか「複雑な処理が必要なのでは」とか難しく考えてしまいがちですが、今回の様によく使われるイベントを使用してこれだけ少ないコードでも通常できないことを実現できるといったことは少なくありません。
技術・知識が多いに越したことはないありませんが、柔軟な発想力が大事ってことですね。

ご質問などありましたらお気軽にお問い合わせください。