- ベストアンサー
[VBA] UserForm を Excel の Window の前面に表示させない方法
Excel VBA において UserForm がデフォルトではワークシートの前面に 必ず表示されるのですが、ユーザーからどうしても邪魔だという要望があり、 対応せざるを得ない状況となってしまいました。 そこで、Excel ワークシートの Window の背面に持っていけるように するにはどのようにしたら良いでしょうか。 ワークシート上に UserForm で使っているボタンを設置するという代替案は ここでは除外させて下さい。 どなたかよろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ExcelのUserFormはPopupWindowですので Excelの背面にはどうやっても出来ないと思います SetParentで親ウィンドウのExcelと切り離して SetWindowLongでウィンドウスタイルをOVERLAPPEDWINDOWなどに変更しても背面への指示には従いません UserFormの作成に ShowOwneredPopupsあたりが使われ UserFormのOwnerWindowがExcelに設定されているためだろうと思います #1氏の最小化案が 現実解のような気がします 最大化を無効にするなら nStyle = nStyle Or WS_MINIMIZEBOX nStyle = nStyle And (Not WS_MAXIMIZEBOX) といった具合で 付け加えたい場合は Or演算子 削除したい場合は 削除する項目のNotと And演算を取りましょう
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
フォームのクローズボタンは システムメニューの『閉じる』に連動しているのでこれを削除してやれば無効になります 残念ながら 非表示にするのは無理だったように思います hMenu = GetSystemMenu( hWnd, FALSE ) DeleteMenu hMenu, SC_CLOSE, MF_BYCOMMAND で可能でしょう ただ、この状態ですと タイトルバーの再描画がされていないのでまだ閉じるボタンのみの表示になります UserForm1.Hide DoEvents USerForm1.Show vbModeless とか SendMessage hWnd, WM_NCPAINT, 1, 0 または UserForm1.Width = UserForm1.Width + 1 などを実行してフレームを再描画しましょう APIなどでハンドル(hEdit,hWnd,hMenu)を取得した場合は本当に有効なハンドルかどうかをチェックしてから使いましょう たいてい無効なハンドルの場合 0が返ってきます APIにより仕様が違う場合があるので MSDNやネットなどで調べましょう
お礼
この度は大変お世話になりました。 後ほど×ボタンの件、試してみたいと思います。 いろいろな意味で見通しがつき、助かりました。 また何かの機会がございましたらよろしくお願い致します。
- Y-JHT
- ベストアンサー率43% (7/16)
UserForm のプロパティで "ShowModal" という項目があるのですが デフォルトで "True" になっているところを "False" にすると モードレスダイアログとして表示してくれますが・・・ 最初は前面に表示されるかな。
お礼
回答ありがとうございます。モードレスできちんとワークシートに 入力できますが、問題は入力するときに UserForm が邪魔なのです。 入力する時いちいち UserForm を横にずらさないといけないし、 しかも常時前面にいるので目障りなのだそうです。 せめて Show したときに出現の場所の指定ができればいいのですが・・・
- n-jun
- ベストアンサー率33% (959/2873)
背面ではなく最小化ではどうでしょう。 過去ログ:ExcelVBAでユーザーフォームの右上にある最小化ボタンを表示したい http://okwave.jp/qa3581220.html
お礼
回答ありがとうございます。助かります。 これは正確には「最小化」ではなく擬似的に「たたむ」 というものですね。問題の解決にはなりそうです。 しかし、もし最小化での対応なら、やはり見栄えの統一の ためにも、Window の右上に最小化のボタンを作りたいものです。 そうするとやはり API の知識が必要となるでしょう。 勉強しなければならないところですが、もし効率のよい勉強方法、 または具体的実装方法ありましたら、表題とは外れますが、 どうかよろしくお願いします。
お礼
大変ありがとうございます。正にその通りです。 私のシステムでは Excel の各 Window の×ボタンを消去するルーチンを 見様見真似で作って組み込んでいまして、無効化していた WS_SYSMENU を 復活させ、WS_MINIMIZEBOX を追加して、見事 UserForm に Window の 最小化ボタンを実現することができましました。 考えてみれば大ボケしてた気がします。 しかし、その代わり×ボタンも復活してしまいました。 redfox63 様、脱線しますが×ボタンのみの消去 or 無効化方法をご存じでしたらご教授下さいませんでしょうか。