- ベストアンサー
Excel VBA での画面最大化のロックについて
Excel2000 VBA で既存ツールの改造を行っています。 VBA内で画面を最大化、及びExcelのサイズ変更(最大化⇔標準化、最小化、消去)ボタンやメニューは消去しているのですが、最大化したExcel画面の上の枠(青色のタイトル欄)をダブルクリックすると、Excelの画面が標準化サイズに縮小してしまいます。 Excel画面の上の枠のダブルクリックでのサイズ変更をロックする方法をご存知の方、教えて頂けないでしょうか? 宜しくお願い致します。
- nori79
- お礼率79% (63/79)
- Visual Basic
- 回答数5
- ありがとう数5
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
GetWindowLong、SetWindowLong は WindowsAPIで、Windows上の全ての ウィンドウに共通するアーキテクチャを 変更します。 例えば、どのウィンドウにもクラス名、 スタイル、拡張スタイル、プロシージャが あります。これらの情報を取得/変更 するのが上記APIです。Excelに限る話では ありません。 DispalyFullScreen=Trueはこのスタイルの CAPTION(BORDERとDLGFRAME)をOFFにする だけです。これですとSYSMENUが残るので、 ダブルクリックや「元に戻す」が有効なままです。 実際にフルスクリーンになった画面の上部で ダブルクリックすると元に戻ります。 なので、フルスクリーンにした直後に、スタイルの SYSMENUをOFFにすればよいでしょう。 スタイルには他に可視、許可、最大化ボタン、 最小化ボタン、枠など様々なフラグがあります。 例えば可視はWS_VISIBLE=&H10000000です。 これをOFFにすると見えなくなります。 スタイルは32ビット中の上位16ビットですが、 下位16ビットは拡張スタイルです。これも上記の APIで設定できます。索引は-20です。 どんなフラグがあるかはWS_xxx、WS_EX_xxを ネットで調べれば分かると思います。 最初に示したC言語サンプルでもプロシージャの 変更にSetWindowLongを使っています。 VBAでAPIを使えると、マルチスレッド以外の 大抵のことがVBAでできるようになります。 FTPでファイルを転送したり、マルチプロセスで 100業務を5個ずつ同時処理するなど自在です。
その他の回答 (4)
- nda23
- ベストアンサー率54% (777/1415)
昔使った手を思い出したので掲載します。 やはりAPIを使います。 Type RECT 左 As Long 上 As Long 右 As Long 下 As Long End Type Type WINDOWPLACEMENT バイト数 As Long フラグ As Long 表示形式 As Long 最小位置(1) As Long 最大位置(1) As Long RECT As 四辺 End Type Declare Function GetWindowPlacement Lib "USER32" _ (ByVal ウィンドウ As Long, 情報 As WINDOWPLACEMENT) As Long Declare Function SetWindowPlacement Lib "USER32" _ (ByVal ウィンドウ As Long, 情報 As WINDOWPLACEMENT) As Long Declare Function GetWindowRect Lib "USER32" _ (ByVal ウィンドウ As Long, 情報 As RECT) As Long Const WS_WS_THICKFRAME As Long = &H40000 '★画面を最大化した後に実行する Sub サンプル() Dim X As WINDOWPLACEMENT Dim S As Long 'ウィンドウの枠を変更不能にする S = GetWindowLong(Application.Hwnd, GWL_STYLE) S = S And (Not WS_WS_THICKFRAME) SetWindowLong Application.Hwnd, GWL_STYLE, S '最大化した時の位置、サイズ情報を記録する X.バイト数 = Len(X) GetWindowPlacement Application.Hwnd, X '最大化した時の四辺の位置を記録する GetWindowRect Application.Hwnd, X.サイズ '通常時の四辺の位置を設定する SetWindowPlacement Application.Hwnd, X End Sub 元のサイズに戻しても最大化の時のサイズに 近い大きさを保ちます。但し、画面は移動でき ます。
お礼
サンプルプログラムのご教示ありがとうございます。 到底、私には思いつかない技ですね。 プログラムを見て(実際はコメントを見ながらですが)、「なるほど」と思います。 VBAやAPIの知識を身に付け、少しでも「nda23さん」に近づけたらと思います。 本当にありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
Excelのウィンドウに対するイベントは 殆ど解放されていませんので、VBAで イベントを拾うことはできません。 究極的にはサブクラス化しかないの ですが、タイトルバーを消し、「元に 戻す」をできなくするには以下のように します。 Public Const GWL_STYLE As Long = -16 Public Const WS_CAPTION As Long = &HC00000 Public Const WS_SYSMENU As Long = &H80000 Public Declare Function GetWindowLong _ Lib "user32" Alias "GetWindowLongA" _ (ByVal ウィンドウ As Long, _ ByVal 索引 As Long) As Long Public Declare Function SetWindowLong _ Lib "user32" Alias "SetWindowLongA" _ (ByVal ウィンドウ As Long, _ ByVal 索引 As Long, _ ByVal 設定値 As Long) As Long Sub サンプル() Dim スタイル As Long スタイル = GetWindowLong(Application.hwnd, GWL_STYLE) スタイル = スタイル And (Not (WS_CAPTION Or WS_SYSMENU)) SetWindowLong Application.hwnd, GWL_STYLE, スタイル End Sub でも、画面がキレイじゃない気がするなぁ。
お礼
今回も親切なソース付きの回答、ありがとうございます。 タイトルバーを消すことは、「nak777rさん」に教えていただいた 「Application.DisplayFullScreen = True」で実現できたのですが、 「nda23さん」が回答下さっているSetWindowLong関数は、 「Application.DisplayFullScreen = True」とは結果が異なるのでしょうか? ちなみに現在は、VBA起動時(Workbook_Open関数)に「Application.DisplayFullScreen = True」を行い、 VBA終了時(Workbook_BeforeClose関数)に「Application.DisplayFullScreen = False」を行っています。 何度も質問ばかりして申し訳ありません。ご存知でしたら教えて下さい。 宜しくお願い致します。
- nak777r
- ベストアンサー率36% (49/136)
Application.DisplayFullScreen = True では駄目でしょうか?
お礼
回答、ありがとうございます。 「Excel画面の上の枠(青色のタイトル欄)をVBAで非表示にする。」 は「Application.DisplayFullScreen = True」で実現できました。
- nda23
- ベストアンサー率54% (777/1415)
C言語でDLLを作り、Excelのウィンドウ プロシージャをフックしてある種の メッセージを無効化します。 【Cプログラム】 static WNDPROC 旧プロシージャ = NULL; static LRESULT WINAPI フック( HWND ウィンドウ,UINT メッセージ, WPARAM Wパラメータ,LPARAM Lパラメータ) { //タイトルバーのダブルクリックを無効化 if ( メッセージ == WM_NCLBUTTONDBLCLK) return 0; //「元に戻す」を無効化 if ( メッセージ == WM_SYSCOMMAND ) { WPARAM x = (Wパラメータ & 0x0000FFFF); if ( x == SC_RESTORE ) return 0; } //上記以外は以前のプロシージャに制御を渡す return CallWindowProc(旧プロシージャ,ウィンドウ, メッセージ,Wパラメータ,Lパラメータ); } void WINAPI WindowSetup(HWND ウィンドウ) { if ( 旧プロシージャ ) { //設定済みなら解除する SetWindowLong(ウィンドウ,GWL_WNDPROC, (LONG)旧プロシージャ); 旧プロシージャ = NULL; } else { //未設定ならフックする 旧プロシージャ = (WNDPROC)GetWIndowLong( ウィンドウ,GWL_WNDPROC); SetWindowLong(ウィンドウ,GWL_WNDPROC,フック); } } 【VBA】 'DLLの定義 Declare Sub WindowSetup Lib "~" (ByVal ウィンドウ As Long) Sub サンプル() WindowSetup Application.hwnd 'フックする End Sub ★ このプロシージャはトグルになっており、 呼び出しの度に設定と解除を交互に繰り返す。 フックしたら終了前に必ず解除する。 フックした後でVBAがリセットされるかExcelが 終了すると異常が発生する。 ※VBAでフックプロシージャを作ると正しく動作 しない。 Cでビルドする時は定義ファイルでエントリ名を 指定しないと、VBAから呼び出せません。 Cコンパイラが無い場合は機械語をバイト配列に 組み込んで、そのエントリを呼び出すという、 ちょっと危ない方法もあります。 その時のコードは長いので、必要ならご相談 ください。
お礼
親切な回答、ありがとうございます。 DLLを作成し、メッセージの無効化を行うという高度な技ですね。 ということは、ダブルクリックでのサイズ変更(元に戻す)をVBA内でロックすることは不可能ということでしょうか。 今回は、可能な限りVBA内の改造で対応したいと考えています。 邪道かもしれませんが、以下のどれかの方法で最大化表示を実現したいと思っています。 1.ダブルクリックでのサイズ変更後、VBA内で「元に戻す」イベントを検出できれば、最大化処理を行う。 (ダブルクリック実行時、一瞬画面は小さくなるが、すぐに最大化表示に戻る。) 2.元に戻すサイズを最大化(最大化に近いサイズ)にVBA内で変更する。 3.Excel画面の上の枠(青色のタイトル欄)をVBAで非表示にする。 VBA初心者で、実現方法がわかっておりません。 ご存知でしたら教えて頂けないでしょうか。お手数掛けますが、宜しくお願い致します。 又、上記1~3以外にもVBA内の実現で、名案がありましたらご教示下さい。
関連するQ&A
- 画面の最大化
InternetExplorerを立ち上げたときに、画面って、縮小(標準?)サイズで表示されますよね。 それって、はじめから、最大化して表示することは不可能なのでしょうか? そのような設定法があるのなら、教えて頂ければ幸いです。
- ベストアンサー
- Windows XP
- 画面の最大化
よろしくお願いします 教えてgooの回答に参考のサイトアドレスを 紹介されてますが それをクリックすると 開いた画面が縮小サイズになっていて 上半分にしか表示されません 以前は常に最大化画面で表示されていました 元に戻す方法を教えて下さい PCはXPproです。
- ベストアンサー
- Windows XP
- Excel2010で画面が最大で開かない
Excel2010で、あるファイルに読み取りパスワードを設定すると、次回エクスプローラ等からファイルをダブルクリックして開いた場合、最大化した状態で開きません。 一方[Excelを開く]-[ファイル]-[開く]でファイルを指定した場合は最大化した状態で開きます。 Word2010ではどちらの方法でも最大化した状態で開きます。 エクスプローラから開いても、画面が最大化した状態で開くにはどうしたらいいのでしょうか?
- 締切済み
- Excel(エクセル)
- 画面を最大化してから元に戻しても最大化のまま
画面(何でもいいです IEでも)を最大化します(最大化ボタンクリック) そうすると画面は最大化します こんどは元に戻します(元に戻す(縮小)ボタンクリック) そうすると 元に戻るときと戻らないときがあります なぜでょう? ただ、元に戻らない場合は、拡大後いろんなことをやっていますので(ファイルの大量コピーとか...)、何かの処理待ちでしょうか?(拡大後縮小のみは元に戻る) ★EXCELがつらいです★
- 締切済み
- Windows XP
- excelでVBA実行後に画面に残るゴミを無くしたい。
こんにちわ。 excelで画面を色々と動かすVBAを作っています。 マクロ処理終了後に、セル選択のカーソル枠が、 ゴミのように画面上に残ってしまいます。 一度ウィンドウの最小化をしてから、 元のサイズへ戻すと無くなりますので、 画面上の問題だけと思われます。 画面再表示のようなコマンドを最後に出せば 良いかと思いますが、それがわかりません。 ご存知の方宜しくお願い致します。 (環境 windows98 excel:office2000)
- ベストアンサー
- オフィス系ソフト
- 必ず最大化されて開きます。
エクセルファイルで、ファイルをダブルクリックして開くと、 必ず最大化されて開きます。 ファイル形式は「.xlsx」なので、VBAではないと思ってるのですが やはりどこかにVBAが隠されているのでしょうか? Vbaでいうと、 ActiveWindow.WindowState?=?xlMaximized と同じ動きをします。 該当のファイルのVBE画面を見ようとすると 「プロジェクトを表示できません」となり、 VBAの記述があるのかどうかすら確認できません。 そもそも「.xlsx」なのに、 ファイルを開くと勝手にシートが全体か表示されることはありえますか?
- ベストアンサー
- その他MS Office製品
- VBA 起動時にエクセルの画面が表示されてしまう
VBA 起動時にエクセルの画面が表示されてしまう こんにちは、VBA初めて1週間ぐらいの初心者です よろしくお願いします 動作環境として、OS:XP excel:excel2007 を使用しています まずはじめに、エクセルを開いて内容変更セーブして終了するというマクロを組んだのですが 別のプログラムから、 そのエクセルファイルに起動をかけて マクロを実行し終了するよう作りました。 /*** コード ***/ ThisWorkbook 0 Private Sub Workbook_Open() 1 Application.Visible = False //エクセル画面を消す 2 3 call 内容変更し保存する関数() // 標準モジュール内 SUB 関数 4 5 ThisWorkbook.Saved = True // セーブしたことにする 6 If Workbooks.Count <= 1 Then Application.Quit // 他のエクセルが開いてない場合のみ終了する 7 ThisWorkbook.Close False // エクセル終了 8 End Sub /*** コード ***/ 質問1 ・1行目にエクセルの画面を消す関数を、プログラムの先頭に来ると思われる部分に入れて実行してみたのですが、 どうしても、起動してから画面を消す処理が始まるまでに、一瞬だけexcelのファイルが表示されてしまうのですが これを回避する方法はありますでしょうか? VBAを使ってマクロの処理をするのですが、 使う方にエクセルを使っているという事を悟られたくないのです 質問2 ・6行目、開いてるエクセルが自分だけの場合のみエクセルを終了すると組んだつもりなのですが、 処理を流すとエクセルで開いているファイルがすべて閉じてしまいます。 記述を間違えていたりしますか? 以上 ご教授お願いいたします <<検索ワード>> VBA VBA 起動画面表示 起動画面非表示 起動画面を出さない 起動画面を消す
- ベストアンサー
- Visual Basic
- Excelで最大化しないとファイルが見えない
あるExcelファイルを開こうとすると、Excelだけが開いて、ファイルが見えません。 でも確かに開いているようなので、他のExcelファイルを複数開いたうえで、タスクバーが1つにまとまったら(「Microsoft Excel 5」とかにする)そこで右クリック⇒ファイルの最大化をすると、最大化されて表示されます。 今はこの方法でしか見ることができません。 普通のファイルに戻すにはどうすればよいのでしょうか。教えてください。宜しくお願い致します。
- ベストアンサー
- オフィス系ソフト
- エクセルの画面表示についてマクロ?VBA?
エクセルを開いていてワードを開き、ワードを閉じると、エクセルがタスクバーに小さくしく縮小されたままクリックをしないと大きく表示されない! ワードを閉じるとエクセルが同時に大きく表示される方法は無いでしょう??? マクロ、又はVBAを使った方法でもいいです。但しVBAの場合は記述してくれたら有り難いですが。 勝手を言ってすみません!
- 締切済み
- Windows 95・98
- IE5.0で最大化すると画面が右によってしまうんです
タイトルの通りIE5.0で最大化ボタンを押すと画面が右によって最小化ボタンも閉じるボタンも画面外で見えなくなります。しかたないのでバーの部分をダブルクリックして画面をもどしてサイズを直し使っていますが、最大化したくてもできずに困っています。どなたか対処法がわかるかたいらしゃいませんか?お願いします。
- ベストアンサー
- その他(インターネット・Webサービス)
お礼
何度も親切な回答ありがとうございます。 SetWindowLong関数を用いて試してみます。 画面の最大化以外にも「WS_xxx、WS_EX_xx」の種類を調べて、実際に動作させてみようと思います。