
いつもお世話になっています。
VBAでフォームに配置した20個程度のコントロール(ラベル)をユーザーが自由に変更するにはどのようなプログラムを書けばよいのかわかりません。
配置は、エディタで固定して使わせるのではなく、ユーザーがフォーム上で自由にコンロトロールの配置を行ってレイアウトできるようにしたのですが、適当なイベントドリブンが見つかりません。
マウスダウンやマウスムーブなどのイベントを組み合わせることでできそうな気もするのですが1週間ほど悩んでも名案がうかびません。
目指すのは、「レイアウト変更」ボタンを押すと、変更モードになって、コントロールをドラッグしながら好きな位置へもっていけるというものです。
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
どこかで見たような・・・。
hatena師匠のサイトでした。
http://hatenachips.blog34.fc2.com/blog-entry-159 …
実装したことはありませんが参考になるかと思います。
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
No.3
- 回答日時:
すみません。
チョット動かしてみたらオブジェクト上だとUserFormのイベントは発生しませんね。「CommandButton1」がイベント対象とした場合
------------------------------------------------------
「CommandButton1_MouseDown」でポインターの所にあるオブジェクトの「Top」と「Left」を得る。
「CommandButton1_MouseMove」でポインターの動きに合わせオブジェクトの「Top」と「Left」変更する。
------------------------------------------------------
という動きになるんですが、オブジェクトの位置を動かすと相対的に「X」「Y」が動いてしまうのでイベントを止めないといけませんが、イベントを止めているときに動いた分は考慮しないといけないので訳が分からなくなりますね。
No.2
- 回答日時:
流れとしては
------------------------------------------------------
「UserForm_MouseDown」でポインターの所にあるオブジェクトを選択する。
「UserForm_MouseMove」でポインターの動きに合わせオブジェクトを移動する。
「UserForm_MouseUp」でオブジェクトを固定する。
------------------------------------------------------
ポインターの所にあるオブジェクトを調べたり、はみ出た時の処理とか結構面倒だと思います。
No.1
- 回答日時:
基本的には、オブジェクトのそれぞれの「Top」「Left」「Height」「Width」プロパティを数値指定することになります。
標準ではGUI(グラフィカルユーザインターフェース)は用意されていません。自分で作るか、そういうアドインを購入するかになります(販売しているかはわかりませんが…)。ご教示ありがとうございました。コントロールのサイズは変更なしでフォーム上に位置のみ変更したいと思っています。「Top」「Left」を変更することはわかっているのですが、新しい場所へ
ドラッグさせたいので、その際のイベントを発見したいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA エンターキーでイベントに...
-
【エクセルのマクロ】クリップ...
-
アクセスVBAのMe!と[ ]
-
エクセルVBAでセル番地を指定し...
-
PictureBoxにPSetしてそれをIma...
-
Excel2007 でのチェックボック...
-
DLLの共有メモリと排他処理???
-
構造体の静的な初期化
-
Accessのフォーム上にエクセル...
-
ユーザーフォームのインポート...
-
エクセルのデータをwebフォーム...
-
【VBA】ワークシート上に画像フ...
-
PowerpointVBAで指定のShapeオ...
-
アクセス 名前のつけ方について。
-
VBからCrystalReportsへSQL文を...
-
文字列で小数点以下の0を削除し...
-
[C#] DataGridViewの項目名
-
日本語の文字化けを直す方法
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA エンターキーでイベントに...
-
アクセスVBAのMe!と[ ]
-
Accessのフォーム上にエクセル...
-
エクセルVBAでセル番地を指定し...
-
VBAで選択範囲外の図形(オブジ...
-
Excel VBAでマウスの左クリック...
-
Excel2007 でのチェックボック...
-
日本語の文字化けを直す方法
-
文字列で小数点以下の0を削除し...
-
VBでExcelの表形式の様なデザイ...
-
ExcelのシートをAccessで表示し...
-
PowerpointVBAで指定のShapeオ...
-
【エクセル】複数のTextBoxに共...
-
【エクセルのマクロ】クリップ...
-
GDIオブジェクトが増える……
-
現在アクティブになっているオ...
-
サブルーチンにオブジェクト名...
-
ビデオキャプチャについて
-
WebBrowser内のフォームをsubmi...
-
コードでオブジェクトを最前面に
おすすめ情報