質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2057閲覧

VBA ユーザーフォーム内でコマンドボタン等を移動させる方法

giftend

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/01/18 13:38

編集2018/01/19 05:01

PowerPointのVBAでユーザーフォームを作成しています。
そこで以下のようなプログラムを作成しています。
①フォーム内のコマンドボタンをクリックすると新たなコマンドボタンを作成
②その新たなコマンドボタンをマウスをドラッグさせることでフォーム内を移動、また拡大縮小可能にしたい
①はサイトを見ながら自力でできそうなのですが②をどのように実現させればよいか悩んでいるところです。
ぜひご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ExcelVBAer

2018/01/19 01:20

どういった目的なんでしょうか? 「コンパイルした」という事は、Accessでしょうか?
giftend

2018/01/19 05:04

質問ありがとうございます。自分の質問内容を編集しました。目的がかなりわかりづらい内容なのですが、コマンドボタンを移動させて背景の画像の一部を隠すため、コマンドボタンを移動させたいと考えています。
guest

回答2

0

ベストアンサー

コントロールを移動させる方法は、sousukeさんの回答でいいと思いますが、動的に生成されたコントロールにイベントを割り当てるには、クラスモジュールが必用になります。下記が参考になるかな。

VBA。フォームにコントロールを動的に追加する - Qiita

下記はAccessのフォームなので、PowerPointのユーザーフォームとは若干異なりますが、移動できるコントロールのクラスモジュールのコード例です。

ドラッグできるラベルのクラス化 - hatena chips

追記:
下記の方が今回のものに近いかも。Excel ですが、基本的には同じでしょう。

ユーザーフォームに動的にボタン等を追加する - Excelが大好きだ!

追記2:
作成してみました。
VBAウィンドウで、[挿入]-[クラスモジュール]で下記のコードを記述。
オブジェクト名を DragableButton とする。

VBA

1Option Explicit 2Private mx As Long, my As Long 3Private IsClick As Boolean 4Private WithEvents mBtn As MSForms.CommandButton 5 6Public Sub Bind(objBtn As CommandButton) 7 Set mBtn = objBtn 8End Sub 9 10Private Sub mbtn_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 11 If Button = 1 Then '左ボタンが押されたらドラッグ開始 12 mx = X 13 my = Y 14 IsClick = True 15 End If 16End Sub 17 18Private Sub mbtn_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 19 If IsClick = True Then 20 mBtn.Left = mBtn.Left - (mx - X) 21 mBtn.Top = mBtn.Top - (my - Y) 22 End If 23End Sub 24 25Private Sub mbtn_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 26 If Button = 1 Then '左ボタンが開放されたらドラッグ終了 27 IsClick = False 28 mx = 0 29 my = 0 30 End If 31End Sub

ユーザーフォームにコマンドボタンを配置して、オブジェクト名は cmdMakeBtn とする。
ユーザーフォームのモジュール

VBA

1Option Explicit 2Dim dBtnCol As Collection 3Dim dBtn As DragableButton 4 5Private Sub cmdMakeBtn_Click() 6 Dim mCmdBtn As MSForms.CommandButton 7 Set mCmdBtn = UserForm1.Controls.Add("Forms.CommandButton.1", _ 8 "CommandButton" & dBtnCol.Count + 1, True) 9 With mCmdBtn 10 .Left = 10 11 .Top = 10 12 .Width = 150 13 .Caption = .Name 14 End With 15 Set dBtn = New DragableButton 16 dBtn.Bind mCmdBtn '生成したボタンをDragableButtonクラスに接続 17 dBtnCol.Add dBtn 18End Sub 19 20Private Sub UserForm_Initialize() 21 Set dBtnCol = New Collection 22End Sub

投稿2018/01/19 08:43

編集2018/01/19 13:40
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

giftend

2018/01/20 10:12

回答ありがとうございます。クラスモジュールを使うのですね。存在こそ知っていたもののどこでどう用いるのか全くわからなかったのでこれからクラスモジュールについて勉強しようと思います。丁寧にプログラムコードまで作成していただきありがとうございます。 ベストアンサーにさせていただきます。
guest

0

移動は結構簡単ですよ。拡大縮小は応用してください。

vba

1Private mx As Single 2Private my As Single 3Private IsClick As Boolean 4 5Private Sub btn0_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 6 mx = X 7 my = Y 8 IsClick = True 9End Sub 10 11Private Sub btn0_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 12 If IsClick = True Then 13 Me.btn0.Left = btn0.Left - (mx - X) 14 btn0.Top = btn0.Top - (my - Y) 15 End If 16End Sub 17 18Private Sub btn0_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 19 IsClick = False 20 mx = 0 21 my = 0 22End Sub 23

投稿2018/01/18 13:55

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

giftend

2018/01/19 04:43

回答ありがとうございます。また、返信が遅れてしまい申し訳ありません。 VBAの初歩的なことしかわかっておらず、多少自分で調べてみて実行しようとしたのですができません。 btn0_MouseDown、btn0_MouseMove、btn0_MouseUpをCallで呼び出しユーザーフォームを.Showで表示するプロシージャを作成するという解釈であっていますでしょうか?
sousuke

2018/01/19 08:53

btn0という名前のコマンドボタンがユーザーフォームにあるという前提です。 VBAでは基本的にはコントロール毎にイベントを定義しなければならず、 (コントロール名)_(イベント名)(引数、、、、、)みたいな感じで定義されます。 callで呼び出すものとしては書いてないです。
giftend

2018/01/20 10:20

回答ありがとうございます。アンダーバー以下はsousuke様が独自で定めた名前と解釈していたのですがイベント名なのですね。_Clickしかないものと思っており勉強になりました。ベストアンサーはhatena19様とさせていただいたのですがsousuke様にも初心者の私に丁寧に教えていただき大変感謝しております。また機会がありましたらよろしくお願いいたします。
SangHuu

2019/02/14 03:07

sousuke 様。 回答ありがとうございます。一つの質問がありますが? 上のコードをコピーしましたが、フォームは移動できませんでしたが、何か編集が必要ですか? 私のコード以下になります: Private Sub Home_img_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Dim mx As Single 'Dim my As Single 'Dim IsClick As Boolean If Button = acLeftButton Then ' MsgBox "You pressed the left button." mx = X my = Y IsClick = True Debug.Print mx & ":" & my End If End Sub Private Sub Home_img_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If IsClick = True Then Form.Move 6705, 30 End If End Sub Private Sub Home_img_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) IsClick = False mx = 0 my = 0 End Sub 外国人なので、日本語の文法は間違いところがありますので、申し訳ございませんでした。 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問