• ベストアンサー

[VBA] UserForm を Excel の Window の前面に表示させない方法

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

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

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演算を取りましょう

appleZZZ
質問者

お礼

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

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

フォームのクローズボタンは システムメニューの『閉じる』に連動しているのでこれを削除してやれば無効になります 残念ながら 非表示にするのは無理だったように思います 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やネットなどで調べましょう

appleZZZ
質問者

お礼

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

  • Y-JHT
  • ベストアンサー率43% (7/16)
回答No.2

UserForm のプロパティで "ShowModal" という項目があるのですが デフォルトで "True" になっているところを "False" にすると モードレスダイアログとして表示してくれますが・・・ 最初は前面に表示されるかな。

appleZZZ
質問者

お礼

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

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

背面ではなく最小化ではどうでしょう。 過去ログ:ExcelVBAでユーザーフォームの右上にある最小化ボタンを表示したい http://okwave.jp/qa3581220.html

appleZZZ
質問者

お礼

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

関連するQ&A

  • エクセルVBAのフォームを最前面にする方法を教えてください。

    エクセルVBAなのですが、UserForm1を最前面に表示して、 他のどのウインドウをアクティブにしても消えない状態にしたいのですが、 どのようなコードを書けばできるでしょうか。 VB.NETで表すとMe.TopMost = Trueとなると思うのですが、 エクセルVBAだとそのような書き方はないようです。 もうしわけございませんがご教示頂きたく、お願いいたします。m(__)m

  • VBAでのUSERFORMの表示に関して

    現在VBAでUSERFORMを使うプログラムを作成中です。 ボタンやボックスなどを設置してコードを書いてという作業は良いのですが、 このプログラムを実践で使用する時に毎回以下の手順を踏んでいます。 1.該当のエクセルファイルを開く 2,AltとF11を押す 3.左側のVBAプロジェクトからフォームの中の使用したいフォームをクリック 4.F5をクリック ここまでしてやっと作成したプログラムを走らせる事ができますが、 毎回毎回上記の1から4の作業が必要な訳ではないですよね? エクセルファイルを開いた瞬間に希望するフォームが出て、 すぐに作業を実行するにはどうしたらよいのでしょうか?

  • Excel VBA 特定のWindowを前面に

    VBAのShellコマンドでコンソールアプリケーションを起動し,その処理が終了してから(終了を待つのはWD.Tasks.Existsを使いました)そのアプリケーションで作成したcsvファイルを開いて処理するプログラムを作りました。 そのアプリケーションは,動いている間,Excelの背面にあるようで画面に表示されません。このアプリケーションが動いている間,それを最前面に表示させたいのですが,方法がありましたらお教えください。

  • フォームウィンドウを最前面に表示したい(ACCESS)

    ACCESS VBAを使っています。 あるタイミングで、あるフォームを表示させたいのです。 OpenFormを使ってみると、確かにフォームを開くことはできたのですが、実際は既に表示されているWindowの背面に開かれているので、目で確認することはできないのです。 新しいフォームを最前面に表示するにはどのようにしたらよいのでしょうか?

  • excel VBA 作成したUserFormにoptionButton

    excel VBA 作成したUserFormにoptionButtonを多数配置しています。このUserFormをワークシート上に再表示すとる、チェック項目に入力したチェックが消えてしまいます。消えない方法が解りません。 private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=False '図形1表示 End sub private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=True  '図形1非表示 End sub  同様な書式で数項目あります。 又、保存したワークシートを読み込んだ場合も同様に出来ないでしょうか。optionButtonのチェック項目が多数あります。チェック項目は図形を表示と非表示です。何方か良い方法がありましたら教えて頂けないでしょうか。宜しくお願いします。

  • VBAでエクセルを常に最前面に

    エクセルVBAを利用して、エクセルの画面を常に最前面にすることは可能でしょうか? 状況としては、VBAからWindows Script Hostを利用してコマンドを発行後、 結果を取得していますが、DOSの黒い画面が一瞬でてきますのでこれを見えなくすることが目的です。 常に最前面にする以外での良い案があれば教えて頂きたいです。 ※ワケがありまして↓のやり方は使えないです。。。  1)cmd.exeのショートカットを作成  2)実行時の大きさを最小化状態に変更  3)作成したショートカットで起動

  • エクセルVBA UserFormで選択リスト

    VBAは多少はかじりましたが、UserFormを使うのは初めてです。これまではDialogSheetでやってました。 しかし今回は、DialogSheetでは大分類小分類に分けたリストはできそうもないのでUserFormならマルチページ機能があるのでなんとかなるのではと思いました。 やりたいことは約千種類あるデータを、まず大分類のカテゴリーに10区分し、マルチページとします。 大分類の各ページをさらにマルチページで小区分し、各5区分とします。都合10*5で50ページとなります。 小区分の各ページにそれぞれリストボックスを配置し、エクセルシートのデータリストからデータを表示し、エクセル使用者が選択できるようにします。 こんなことはマルチページで可能でしょうか?それともタブストリップですか? 参考となるコードなどもご教示いただけると幸いです。 よろしくお願いします。

  • Excel2013で複数のブックの表示を切換たい

    Excel2013で複数のブックを開いている時、フォームのボタンで表示するブックを切り替えたいのですが・・・。 Excel2013で複数のブック1~5を開いているときにVBA(ブック5.Activate)を使って、ブック5を前面に持ってきたいのですがうまく行きません。 詳細は、ブック1~5が既に開いている状態で、「ブック1の作業を終了しますか?」というフォームの「終了」ボタンを押すと新しいフォーム(ブック5で行う作業内容や手順の書かれたもの)を最前面に表示し、その背面にブック5を表示したいのですが、現状は、新しいフォームは最前面に表示されるのですが、ブック5は、ちゃんと新しいフォームの背面に表示されるときもあれば、ブック1~4のさらに背面に表示されたり、ブック1の背面に表示されたりとランダムな位置に表示されてしまいます。何か良い方法がございましたら教えて頂きますようお願い致します。

  • VBAで別のExcelブックのボタンのマクロ登録

    Excelブック1とExcelブック2があります。 Excelブック1はVBAで 1)Excelブック2を開いて 2)Excelブック1のワークシート(Sheet1)と  モジュールシート(Module1)を  Excelブック2にコピーします。 3)ワークシート(Sheet1)にはコントロール(ボタン)が貼り付けてあって  このボタンをクリックするとモジュールシート(Module1)の中の  Excute_Button()というプロシージャ(マクロ)を呼び出すため  Excelブック1のVBAで  wb.Worksheets("Sheet1").Shapes.Range(Array("Button 1")).Select  Selection.OnAction = "Excute_Button"  と記述してボタンのマクロの登録をします。   (wbはExcelブック2を指しています) 4)Excelブック2を保存して閉じる。 という処理をしています。 この後、Excelブック1を閉じて、 Excelブック2を開いてワークシート(Sheet1)のボタンをクリックすると Excelブック1が開いてしまいます。 Excelブック2のボタンのマクロの登録のマクロ名を見てみると Excelブック1のファイル名!Excute_Button となっています。 Excelブック1のVBAで、ここを単にExcute_Buttonだけにするには どのようにすればよいでしょうか。

  • EXCEL2003 VBAを表示ロック

    Sheets("DATA")にあるデータを、Sheets("Branch").Range("B2:B20")にあるコード(数字)で順に抽出します。 それをSheets("Form")を複製したシートに貼ります。 複製シートに名前をつけ、保存します。 ここまでは問題なく、以下のVBAでできました。(だいぶ省略しましたが) Sub Make_BrCopy() Dim myCl As Range With Sheets("DATA") For Each myCl In Sheets("Branch").Range("B2:B10") Sheets("Form").Copy Before:=Sheets(1) Sheets(1).Name = myCl.Value .Range("A1:G1").AutoFilter Field:=2, Criteria1:=myCl.Value .UsedRange.SpecialCells(xlCellTypeVisible).Copy Sheets(CStr(myCl.Value)).Range("A1") Sheets(CStr(myCl.Value)).Copy ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & CStr(myCl.Value) & ".xls" ActiveWindow.Close Application.DisplayAlerts = False Sheets(CStr(myCl.Value)).Delete Application.DisplayAlerts = True .ShowAllData Next myCl End With End Sub ところが、少し困ったことがあります。 Sheets("Form")には、ワークシートモジュール、Private Sub Worksheet_Change(ByVal Target As Range) があるのです。 これを複製したワークシートにそのまま必要なのでそうしてあるのですが、できることなるら、VBAを表示ロックさせたいのです。 元のファイルではVBAProjectのロックでそうしているのですが、ワークシートをコピーして作成したあらたなBOOKはVBAを表示にロックにはなっていません。 丸見えです。 どうすればよいでしょうか? Excel2003です。 また、上記のVBAコードになにかご指摘のことなどありましたらそれもあわせて教えてください。