この人頭いいなと思ったエピソード

いつもお世話になっています。
VBAでフォームに配置した20個程度のコントロール(ラベル)をユーザーが自由に変更するにはどのようなプログラムを書けばよいのかわかりません。
配置は、エディタで固定して使わせるのではなく、ユーザーがフォーム上で自由にコンロトロールの配置を行ってレイアウトできるようにしたのですが、適当なイベントドリブンが見つかりません。
マウスダウンやマウスムーブなどのイベントを組み合わせることでできそうな気もするのですが1週間ほど悩んでも名案がうかびません。
目指すのは、「レイアウト変更」ボタンを押すと、変更モードになって、コントロールをドラッグしながら好きな位置へもっていけるというものです。
よろしくお願いします。

A 回答 (4件)

どこかで見たような・・・。


hatena師匠のサイトでした。
http://hatenachips.blog34.fc2.com/blog-entry-159 …
実装したことはありませんが参考になるかと思います。
    • good
    • 1
この回答へのお礼

nicotinismさん。ありがとうございました。そのものズバリです。
エクセルで使用したかったので多少修正しました。載せておきます。
Option Explicit
Dim CX As Long
Dim CY As Long
Dim EFFECT As Boolean
'フォームを開くとき
Private Sub UserForm_Initialize()
EFFECT = False 'マウスボタン移動時イベント無効
End Sub
'マウスボタン移動時
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
On Error Resume Next
If EFFECT = True Then
Me.Label1.Left = Me.Label1.Left + X - CX
Me.Label1.Top = Me.Label1.Top + Y - CY
End If
End Sub
'マウスボタン解放時
Private Sub Label1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button > 0 Then 'ドラッグ終了
EFFECT = False 'マウスボタン移動時イベントを無効にする
End If
End Sub
'マウスボタンクリック時
Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button > 0 Then 'ドラッグ開始
EFFECT = True 'マウスボタン移動時イベントを有効にする
CX = X
CY = Y
End If
End Sub

お礼日時:2016/05/19 19:44

すみません。

チョット動かしてみたらオブジェクト上だとUserFormのイベントは発生しませんね。

「CommandButton1」がイベント対象とした場合
------------------------------------------------------
「CommandButton1_MouseDown」でポインターの所にあるオブジェクトの「Top」と「Left」を得る。
「CommandButton1_MouseMove」でポインターの動きに合わせオブジェクトの「Top」と「Left」変更する。
------------------------------------------------------
という動きになるんですが、オブジェクトの位置を動かすと相対的に「X」「Y」が動いてしまうのでイベントを止めないといけませんが、イベントを止めているときに動いた分は考慮しないといけないので訳が分からなくなりますね。
    • good
    • 1

流れとしては


------------------------------------------------------
「UserForm_MouseDown」でポインターの所にあるオブジェクトを選択する。
「UserForm_MouseMove」でポインターの動きに合わせオブジェクトを移動する。
「UserForm_MouseUp」でオブジェクトを固定する。
------------------------------------------------------
ポインターの所にあるオブジェクトを調べたり、はみ出た時の処理とか結構面倒だと思います。
    • good
    • 1

基本的には、オブジェクトのそれぞれの「Top」「Left」「Height」「Width」プロパティを数値指定することになります。

標準ではGUI(グラフィカルユーザインターフェース)は用意されていません。自分で作るか、そういうアドインを購入するかになります(販売しているかはわかりませんが…)。
    • good
    • 1
この回答へのお礼

ご教示ありがとうございました。コントロールのサイズは変更なしでフォーム上に位置のみ変更したいと思っています。「Top」「Left」を変更することはわかっているのですが、新しい場所へ
ドラッグさせたいので、その際のイベントを発見したいと思っています。

お礼日時:2016/05/18 21:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報