[[20230610173616]] 『ユーザーフォームをExcelウィンドウの動きに合わax(ちくわ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームをExcelウィンドウの動きに合わせて移動させたい』(ちくわ)

VBAの質問ではないので恐縮です。

いくら調べても、方法がなさそうなので
無理なことなのかと思っていますが聞いてください。

ユーザーフォームを座標指定にて設定しました。
しかし、Excelウィンドウを最大化をしたり、自由に大きさを変えながら
作業をすることもある中で、
最初に例えばA1のセルに合わせるように表示されたユーザーフォームが
最大化や大きさを変えたら、ウィンドウに合わせ一緒に動いてくれないのです。、

最初に設定したA1の座標のままうごきません。
手動で移動すれば可能ですが、
自動で付いてきてくれないのです。

できないものなのでしょうか。
変な質問ですみません。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 例えばですけど、Excelウィンドウを最小化した時に
 ユーザーフォームも最小化したいって事ですか?
(あみな) 2023/06/10(土) 18:32:58

あみなさん、そうです。最小化のときには見えなくする、もできたらしたいです。
しかし、最小化したときは、出っぱなしでも最悪よいので
ウィンドウを移動させる際に同じ座標のまま移動させるのが1番やりたいことです。
(ちくわ) 2023/06/10(土) 18:53:15

 >最小化のときには見えなくする、もできたらしたいです

 ユーザーフォームを一時的に隠すには、Unloadではなく、
 Hideメソッドでユーザーフォームを非表示にします。
 ~~~~~~~~~~~~
 ようは、一時的に隠すってのは、多分多くの人がすると思うけど

 完全に見えなくしたくないって場合は、APIを使用して、左下に最小化は
 ちなみにできますね。

 でも今回の、最大の要望は、

  ↓これなので

 >ウィンドウを移動させる際に同じ座標のまま移動させるのが1番やりたいことです

 ちょっとお待ちください。
(あみな) 2023/06/10(土) 19:06:08

 現在のユーザーフォームには、下記のようなマクロが入ってますよね?

 Private Sub UserForm_Initialize()
    Dim 表示位置指定 As Long
    If 表示位置指定 = 0 Then
        StartUpPosition = 0
        Me.Left = 20
        Me.Top = 110
    Else
        StartUpPosition = 表示位置指定
    End If
 End Sub

 違うのかな?

 >ウィンドウを移動させる際に同じ座標のまま移動させるのが1番やりたいことです
                            ~~~~~~~~~~~~~~~~~~~~~~~~
 座標が同じのままってのが...う〜ん^^;
(あみな) 2023/06/10(土) 19:12:42

はい、おっしゃる通り、今の座標は、記載いただいたように入っています。

座標が同じままっていう表現がよくなかったです。
A1セルの角に設定したとしたら、
A1セルの角に置いたそのままウィンドウに合わせて、
A1のままで動くといったことです。

どうぞ宜しくお願いします
(ちくわ) 2023/06/11(日) 06:26:15


 書き込むスレッド間違えちゃいました
 ので削除しました
(´・ω・`) 2023/06/11(日) 08:02:19

 日曜日なのに...早起きなのですね^^

 >A1セルの角に置いたそのままウィンドウに合わせて、
 >A1のままで動くといったことです。

 ちょっとハッキリこれで良いと言い切れませんが
 う〜ん、動きが良く解らんけど...

 ダメ元案ですが、どんな動きがしたいのかにも
 よるかな〜と思いますので、まずは1案

 私はですけど、右半分にエクセルを表示して左半分を好きに
 使用するパターンが好みなのですけど(これ基本)
 ちくはさんもなのかは、よく解りませんがお試しを^^;

 結果は、下記のURLのようになります。
https://d.kuku.lu/jxxnnzszr

 先に、言っておきますけどユーザーフォームの大きさは
 変更させません。エクセルが右半分に表示されて。。。
 でもってユーザーフォームも移動するイメージです。

 お試しは、新規ブックにユーザーフォームを1コ配置して
 下記のコードを入れてください。

 まず、ご自身の利用する EXCELのウィンドウサイズを取得します。
 下記のマクロを実行して ※幅をメモってください。

 ■標準モジュール
 Sub EXCELのウィンドウサイズを取得()
    Dim 幅 As Double, 縦 As Double
    With Windows("●●●.xlsm") '●●●は、ファイル名
        幅 = Application.UsableWidth
        縦 = Application.UsableHeight
    End With
    Debug.Print "幅:" & 幅
    Debug.Print "高:" & 縦
 End Sub

 Sub Form_Open()
    UserForm1.Show vbModeless
 End Sub

 ■ユーザーフォームモジュール
 Private Sub UserForm_Initialize()
    StartUpPosition = 0
    Me.Left = 20
    Me.Top = 110
 End Sub

 Private Sub UserForm_Click()
    With Application
        .WindowState = xlNormal
        '.Left = 480
        '.Top = 0
        '.Width = 960 / 2
    End With
    Me.Move 505 ' ←この値をエクセルの幅÷2 +調整値とします。
 End Sub

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Application.WindowState = xlMaximized
 End Sub

 Me.Left = 20 や Me.Top = 110 の初期設定値は変更しません。
 Moveメソッドでユーザーフォームを移動させます。

 マクロの中の調整値は、ご利用のPC画面の大きさによって
 それぞれ違うので、ご自身で調整が必要になります。

 ユーザーフォームを、Show したら
 何処でも良いので、ユーザーフォームをクリックします。

 ×ボタンから、ユーザーフォームを閉じると、
 エクセルが最大画面に戻ります。( きっと^^; )

 されたい事が、違う場合は詳しい説明か
 画像がないと、他の回答者も解り難いと思います。
 それと、動きの説明が必要かと思います。

 [ではでは] λ…………トボトボ
(あみな) 2023/06/11(日) 08:07:04

 >自動で付いてきてくれないのです。

 これで理解するべきでしたね。
 こういう質問には付き合ってられないと。
 いつも全画面で使っている人には解らないかも。
 過去にも同じような質問を見たような気がするけど
 結果はどうなったか解らない。

 API使ってアプリの移動を情事キャッチしなければならない
 とかもろもろ。
 ようするにエクセル自体を動かすと、中のブックも(小さなウインドウ)
 一緒に動きますよね。それと同じ。
 質問は選んで何でも答えようとしない方が良いと思う。
 興味があればどうぞ。
(大事) 2023/06/11(日) 08:10:59

 監視用のフォームから本命のフォーム開いて、windowの位置に追随するような仕様とかどうかね?

 ★監視用のフォーム
    Option Explicit
    Private Type w
        left As Long
        top As Long
    End Type
    Sub FormIni()
        Dim r As Window
        Dim cnt As Long
        Dim wp As w
        Dim uf1 As UserForm1 '本命のフォーム
        Set r = ThisWorkbook.Windows(1)
        wp.left = r.left
        wp.top = r.top
        Me.Show vbModeless
        Me.Hide
        Set uf1 = UserForm1 '本命のフォーム
        uf1.Show vbModeless '本命のフォーム
        On Error GoTo errHandle
        Do
            If cnt > 100 Then
                DoEvents
                cnt = 0
            End If
            cnt = cnt + 1
            If wp.left <> r.left Or wp.top <> r.top Then
                wp.left = r.left
                wp.top = r.top
                uf1.left = wp.left
                uf1.top = wp.top
            End If
        Loop
    errHandle:
    End Sub

 ★標準モジュールからの呼び出し
    Sub a()
        Form監視と起動.FormIni
    End Sub

(稲葉) 2023/06/11(日) 11:08:24


 (大事)さんが言っている意味が私は理解できません。							
 私は↓下の条件で、お試し版として...しただけです。							

 >ウィンドウを移動させる際に同じ座標のまま移動させるのが1番やりたいことです							
             ~~~~~~~~~~~~~~~~~~~~~~~~							

 Me.Left = 20 や Me.Top = 110 の初期設定値は変更し無い条件です。							
 他の方法があるなら、APIでもなんでも使用して、あなたが回答を							
 するべきです。	
(あみな) 2023/06/11(日) 11:45:22

>(大事)さんが言っている意味が私は理解できません。
同感です。
(DAIJI) 2023/06/11(日) 11:56:25

 これ、稲葉さんのでいい感じしますね。
(あみな) 2023/06/11(日) 12:15:25

 昔、アクセスのフォームでAPIのSetParentを使って親子関係にして、
同様のことをしたことがあるので、エクセルでもできないか試してみました。

 UserForm1
 -----------------------------
Option Explicit
Private Declare PtrSafe Function FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetParent Lib "user32" _
(ByVal hWndChild As LongPtr, ByVal hWndNewParent As LongPtr) As LongPtr
Private Sub UserForm_Initialize()
    With Me
        .StartUpPosition = 0
        .left = 20
        .top = 110
    End With
    Dim hUF As LongPtr, hXLS As LongPtr
    hUF = FindWindow(vbNullString, Me.Caption) 'ユーザーフォームのハンドル
    hXLS = FindWindow("XLMAIN", Application.Caption) 'エクセルのハンドル
    SetParent hUF, hXLS 'ユーザーフォームをエクセルの子ウィンドウにする
End Sub
 -------------------------------------------------

 標準モジュール
 -------------------------------------------------
Sub Test()
    UserForm1.Show vbModeless
End Sub
 -------------------------------------------------

 うまく行っている感じです。

(hatena) 2023/06/11(日) 13:35:03


ただ、365だとユーザーフォームの見た目が以前のものに戻ってしまうような気がする。
(hatena) 2023/06/11(日) 13:40:54

おや 同じ座標のまま移動させる意味が解らないというので
助け舟出してやったつもりなのに牙むき出しにされるとは
関係のない稲葉さんと比較されるかな。
DAIJIさまは、いつもの茶々入れ男だと思うけど。
(大事) 2023/06/11(日) 13:45:49

>いつもの茶々入れ男だと思うけど。
違いますよ。
(DAIJI) 2023/06/11(日) 14:35:15

茶々入れ女
(大事)


(大事)さんよ〜ぐだぐた言ってないで提案しろよ

提案も出来ないなら、邪魔なだけ
過去の回答を見ても、質問者に対して良いと
思えるフォローはない

[[20230526155322]]『空白セルを削除』(パラダイス銀河)
[[20230526133006]]『リンク』(初心者)
[[20230526093932]]『別のシートにコピーしたURLのハイパーリンクを有効にする方法』(Taka)

(結論) 2023/06/11(日) 14:47:51


結論出してるじゃん

最近では
(レビュー)
(あん)
かな

(大事) 2023/06/11(日) 14:54:21


完全な間違いなら、こうではないかの?の指摘をして、組み込みが解るような
マクロ。又は関数などをご自身で提案すれば良い。

自分が最大限に、良いと思う事を(hatena)さんのように、提案するだけです。
で、何かのアクションからしたいのかどうかは、質問者が組み込みを決める。

(結論) 2023/06/11(日) 15:08:33


で、君は茶々入れだけですかぁ
これからも茶々入れがんばってね!
(大事) 2023/06/11(日) 15:22:16

 hatenaさんのいいなーと思ったけど、エクセルのウィンドウを小さくすると、フォームも途切れちゃう・・・
 オーバー表示できるようなAPIありそうだけど、ここはhatenaさんに甘えてみたい・・・!
 私のも問答無用で移動するから、エクセルがフォームより小さくなると、タイトルバーをクリックできなくなる。

(稲葉) 2023/06/11(日) 15:58:50


質問者のちくわです。
大事さん以外の方、ありがとうございます。

あみなさんをはじめ、hatenaさんのコードにて試してみたのですが、当方365環境のためうまく作動しませんでした(エラーはでなかったのですが

稲葉さんのコードにて試してみましたら、思っていたと通りの動きになって感動しています。
ありがとうございます。エクセルをフォームより小さくすることは使用上あまりないと思うのでこちらで大満足です。

本当に大事さん以外の方、お付き合いくださいましてありがとうございました。

(ちくわ) 2023/06/11(日) 16:51:55


(結論)
これ質問者本人だったのか
今までの茶屋入ればれますよ
ニックネーム変えての質問だろうけど。

(大事) 2023/06/11(日) 16:57:08


 私は(hatena)さんので、無事に動きましたよ。

 環境 2021 64bit
(あみな) 2023/06/11(日) 19:41:51

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.