[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームをExcelウィンドウの動きに合わせて移動させたい』(ちくわ)
VBAの質問ではないので恐縮です。
いくら調べても、方法がなさそうなので
無理なことなのかと思っていますが聞いてください。
ユーザーフォームを座標指定にて設定しました。
しかし、Excelウィンドウを最大化をしたり、自由に大きさを変えながら
作業をすることもある中で、
最初に例えばA1のセルに合わせるように表示されたユーザーフォームが
最大化や大きさを変えたら、ウィンドウに合わせ一緒に動いてくれないのです。、
最初に設定したA1の座標のままうごきません。
手動で移動すれば可能ですが、
自動で付いてきてくれないのです。
できないものなのでしょうか。
変な質問ですみません。
< 使用 Excel:Microsoft365、使用 OS:Windows10 >
例えばですけど、Excelウィンドウを最小化した時に ユーザーフォームも最小化したいって事ですか? (あみな) 2023/06/10(土) 18:32:58
>最小化のときには見えなくする、もできたらしたいです
ユーザーフォームを一時的に隠すには、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
これ、稲葉さんのでいい感じしますね。 (あみな) 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
提案も出来ないなら、邪魔なだけ
過去の回答を見ても、質問者に対して良いと
思えるフォローはない
[[20230526155322]]『空白セルを削除』(パラダイス銀河)
[[20230526133006]]『リンク』(初心者)
[[20230526093932]]『別のシートにコピーしたURLのハイパーリンクを有効にする方法』(Taka)
(結論) 2023/06/11(日) 14:47:51
最近では
(レビュー)
(あん)
かな
(大事) 2023/06/11(日) 14:54:21
自分が最大限に、良いと思う事を(hatena)さんのように、提案するだけです。
で、何かのアクションからしたいのかどうかは、質問者が組み込みを決める。
(結論) 2023/06/11(日) 15:08:33
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.