人生最悪の忘れ物

Excel VBA において UserForm がデフォルトではワークシートの前面に
必ず表示されるのですが、ユーザーからどうしても邪魔だという要望があり、
対応せざるを得ない状況となってしまいました。
そこで、Excel ワークシートの Window の背面に持っていけるように
するにはどのようにしたら良いでしょうか。
ワークシート上に UserForm で使っているボタンを設置するという代替案は
ここでは除外させて下さい。

どなたかよろしくお願い致します。

A 回答 (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演算を取りましょう
    • good
    • 0
この回答へのお礼

大変ありがとうございます。正にその通りです。
私のシステムでは Excel の各 Window の×ボタンを消去するルーチンを
見様見真似で作って組み込んでいまして、無効化していた WS_SYSMENU を
復活させ、WS_MINIMIZEBOX を追加して、見事 UserForm に Window の
最小化ボタンを実現することができましました。
考えてみれば大ボケしてた気がします。
しかし、その代わり×ボタンも復活してしまいました。
redfox63 様、脱線しますが×ボタンのみの消去 or 無効化方法をご存じでしたらご教授下さいませんでしょうか。

お礼日時:2008/10/13 21:05

フォームのクローズボタンは システムメニューの『閉じる』に連動しているのでこれを削除してやれば無効になります


残念ながら 非表示にするのは無理だったように思います

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やネットなどで調べましょう
    • good
    • 0
この回答へのお礼

この度は大変お世話になりました。
後ほど×ボタンの件、試してみたいと思います。
いろいろな意味で見通しがつき、助かりました。
また何かの機会がございましたらよろしくお願い致します。

お礼日時:2008/10/14 22:26

UserForm のプロパティで "ShowModal" という項目があるのですが


デフォルトで "True" になっているところを "False" にすると
モードレスダイアログとして表示してくれますが・・・
最初は前面に表示されるかな。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。モードレスできちんとワークシートに
入力できますが、問題は入力するときに UserForm が邪魔なのです。
入力する時いちいち UserForm を横にずらさないといけないし、
しかも常時前面にいるので目障りなのだそうです。
せめて Show したときに出現の場所の指定ができればいいのですが・・・

お礼日時:2008/10/13 16:55

背面ではなく最小化ではどうでしょう。



過去ログ:ExcelVBAでユーザーフォームの右上にある最小化ボタンを表示したい
http://okwave.jp/qa3581220.html
    • good
    • 1
この回答へのお礼

回答ありがとうございます。助かります。
これは正確には「最小化」ではなく擬似的に「たたむ」
というものですね。問題の解決にはなりそうです。

しかし、もし最小化での対応なら、やはり見栄えの統一の
ためにも、Window の右上に最小化のボタンを作りたいものです。
そうするとやはり API の知識が必要となるでしょう。
勉強しなければならないところですが、もし効率のよい勉強方法、
または具体的実装方法ありましたら、表題とは外れますが、
どうかよろしくお願いします。

お礼日時:2008/10/13 17:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A