Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12860 / 13646 ツリー ←次へ | 前へ→

【8234】画面の大きさを変更させない ドラゴン 03/10/5(日) 11:45 質問
【8235】Re:画面の大きさを変更させない INA 03/10/5(日) 13:11 回答
【8241】Re:画面の大きさを変更させない ドラゴン 03/10/5(日) 23:28 回答
【8239】Re:画面の大きさを変更させない Kein 03/10/5(日) 23:10 回答
【8240】Re:画面の大きさを変更させない ドラゴン 03/10/5(日) 23:27 回答
【8243】Re:画面の大きさを変更させない Kein 03/10/6(月) 2:59 回答
【8244】Re:画面の大きさを変更させない Kein 03/10/6(月) 3:02 発言
【8251】Re:画面の大きさを変更させない INA 03/10/6(月) 10:05 回答
【8274】Re:画面の大きさを変更させない bykin 03/10/6(月) 18:54 回答
【8280】Re:画面の大きさを変更させない akrin 03/10/7(火) 7:26 回答
【8289】Re:画面の大きさを変更させない akrin 03/10/7(火) 13:42 回答
【8282】Re:画面の大きさを変更させない ドラゴン 03/10/7(火) 9:43 お礼

【8234】画面の大きさを変更させない
質問  ドラゴン  - 03/10/5(日) 11:45 -

引用なし
パスワード
   こんにちわ。

画面を最大化させないで、表示させたあと、ユーザーに画面のサイズを
変更させたくないのですが、画面サイズ変更を無効にすることはできま
すか?画面の端にカーソルをあてると、矢印がでてサイズを変更するこ
とができますが、大きさを変えたくありません。
わかる方がいらっしゃいましたら、教えて下さい。よろしくお願いしま
す。

【8235】Re:画面の大きさを変更させない
回答  INA  - 03/10/5(日) 13:11 -

引用なし
パスワード
   画面というのは、Excelのアプリのウィンドウですか?
それともブックのウィンドウですか?

【8239】Re:画面の大きさを変更させない
回答  Kein  - 03/10/5(日) 23:10 -

引用なし
パスワード
   未テストですが、こんな感じでしょーか ?

Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA"(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const HWND_TOPMOST = (-1)
Private Const SWP_NOSIZE = &H1&
Private Const SWP_NOMOVE = &H2&

Sub Test_Window()
  Dim AppCap As String
  Dim hwnd As Long, ret As Long
  
  AppCap = Application.Caption
  hwnd = FindWindow("XLMAIN", AppCap)
  ret = SetWindowPos(hwnd, HWND_TOPMOST, _
  0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

【8240】Re:画面の大きさを変更させない
回答  ドラゴン  - 03/10/5(日) 23:27 -

引用なし
パスワード
   ▼Kein さん:こんばんわ

標準モジュールに貼り付けて、実行してみましたが、
変わりありませんでした。エラーは出ませんでした。
こちらの環境はEXCEL97。OS:winXpHomeEditionです。
原因がわかりましたら教えて下さい。
よろしくお願いします。

>未テストですが、こんな感じでしょーか ?
>
>Private Declare Function FindWindow Lib "user32" _
>Alias "FindWindowA"(ByVal lpClassName As String, _
>ByVal lpWindowName As String) As Long
>
>Private Declare Function SetWindowPos Lib "user32" _
>(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
>ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
>ByVal cy As Long, ByVal wFlags As Long) As Long
>
>Private Const HWND_TOPMOST = (-1)
>Private Const SWP_NOSIZE = &H1&
>Private Const SWP_NOMOVE = &H2&
>
>Sub Test_Window()
>  Dim AppCap As String
>  Dim hwnd As Long, ret As Long
>  
>  AppCap = Application.Caption
>  hwnd = FindWindow("XLMAIN", AppCap)
>  ret = SetWindowPos(hwnd, HWND_TOPMOST, _
>  0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
>End Sub

【8241】Re:画面の大きさを変更させない
回答  ドラゴン  - 03/10/5(日) 23:28 -

引用なし
パスワード
   ▼INA さん:こんばんわ
Excelのアプリのウィンドウのことです。
よろしくお願いします。

>画面というのは、Excelのアプリのウィンドウですか?
>それともブックのウィンドウですか?

【8243】Re:画面の大きさを変更させない
回答  Kein  - 03/10/6(月) 2:59 -

引用なし
パスワード
   >変わりありませんでした
タイトルバーをドラッグしようとしても、動かなくなっているはずですが・・。
こちらは Excel2000 ですが、テスト結果は成功しています。
APIを使うというだけですから、バージョンは関係ないはずですけど・・。

【8244】Re:画面の大きさを変更させない
発言  Kein  - 03/10/6(月) 3:02 -

引用なし
パスワード
   もしかしてOSがWinXPだと、ダメなのかな・・? こちらはWin98ですが、XPを持って
ないので確認できません。すいません。

【8251】Re:画面の大きさを変更させない
回答  INA  - 03/10/6(月) 10:05 -

引用なし
パスワード
   Win98se,Excel2000ですが、
あるとき1度だけ正常に動作しましたが、その後、上手く行きません。
何故かな・・(@_@)?

【8274】Re:画面の大きさを変更させない
回答  bykin  - 03/10/6(月) 18:54 -

引用なし
パスワード
   こんばんわ。

SetWindowPos ってのはウィンドウの位置を設定する API で、
同時にサイズの変更もできるんやけど、SWP_NOSIZE を指定した場合は
そのときのウィンドウサイズは元のままってことやったと思うんやけどな。
サイズ変更を不可にするんとは違うんとちゃいまっか?

で、↓これでどうでっか?

Private Const GWL_STYLE = (-16)
Private Const WS_THICKFRAME = &H40000
Private Const WS_MAXIMIZEBOX = &H10000

Private Declare Function GetWindowLong Lib "user32" _
             Alias "GetWindowLongA" _
            (ByVal hWnd As Long, _
             ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib "user32" _
             Alias "SetWindowLongA" _
            (ByVal hWnd As Long, _
             ByVal nIndex As Long, _
             ByVal dwNewLong As Long) As Long

Private Declare Function FindWindow Lib "user32" _
             Alias "FindWindowA" _
            (ByVal lpClassName As String, _
             ByVal lpWindowName As String) As Long

Private Declare Function DrawMenuBar Lib "user32" _
            (ByVal hWnd As Long) As Long

Private Sub EnableWindowResize(ByVal flg As Boolean)
  Dim hWnd As Long
  Dim WndStyle As Long
  Dim Ret As Long
  
  hWnd = FindWindow("XLMAIN", Application.Caption)
  WndStyle = GetWindowLong(hWnd, GWL_STYLE)
  If flg Then
    WndStyle = WndStyle Or WS_THICKFRAME Or WS_MAXIMIZEBOX
  Else
    WndStyle = WndStyle And (Not WS_THICKFRAME) _
              And (Not WS_MAXIMIZEBOX)
  End If
  Ret = SetWindowLong(hWnd, GWL_STYLE, WndStyle)
  Ret = DrawMenuBar(hWnd)
End Sub

Sub test()
  MsgBox "リサイズ不可にします。"
  EnableWindowResize False
End Sub

Sub test2()
  MsgBox "リサイズ可能にします。"
  EnableWindowResize True
End Sub

うまいこといかんかったらかんにんな。
ほな。

【8280】Re:画面の大きさを変更させない
回答  akrin  - 03/10/7(火) 7:26 -

引用なし
パスワード
   メニューを削除する方法はどうでしょうか。

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetSystemMenu Lib "user32" _
 (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Declare Function RemoveMenu Lib "user32" _
 (ByVal hMenu As Long, ByVal nPosition As Long, _
 ByVal wFlags As Long) As Long
Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long

Const SC_MOVE = &HF010&
Const SC_SIZE = &HF000&
Const SC_MINIMIZE = &HF020&
Const SC_MAXIMIZE = &HF030&
Const SC_CLOSE = &HF060&
Const MF_BYPOSITION = &H400&
Const MF_BYCOMMAND = &H0&

Sub Test()
  Dim hWnd As Long
  Dim hMenu As Long
  Dim Ret As Long
  hWnd = FindWindow("XLMAIN", Application.Caption)
  hMenu = GetSystemMenu(hWnd, 0)
  Ret = RemoveMenu(hMenu, SC_MOVE, MF_BYCOMMAND)
  Ret = RemoveMenu(hMenu, SC_SIZE, MF_BYCOMMAND)
  Ret = RemoveMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND)
  Ret = RemoveMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND)
  Ret = DrawMenuBar(hWnd)
End Sub

Sub Test2()
  Dim hWnd As Long
  Dim hMenu As Long
  hWnd = FindWindow("XLMAIN", Application.Caption)
  hMenu = GetSystemMenu(hWnd, 1)
  Ret = DrawMenuBar(hWnd)
End Sub

【8282】Re:画面の大きさを変更させない
お礼  ドラゴン  - 03/10/7(火) 9:43 -

引用なし
パスワード
   みなさんのおかげで、希望の処理ができました。
本当にありがとうございました。

【8289】Re:画面の大きさを変更させない
回答  akrin  - 03/10/7(火) 13:42 -

引用なし
パスワード
   少し補足です。
Windows98SE & Excel2000の環境で試したのですが、
SetWindowLongでウィンドウスタイルのWS_THICKFRAMEをオフにすると
ステータスバーの右下隅のサイズ変更ボックス(サイズグリップ)
だけが独立して移動します。
それから、サイズ変更ボックスにフォーカスがある状態で
Excelウィンドウを閉じようとすると強制終了が発生しました。
システムメニューを削除する方法も何か問題はあるかもしれません。
WinAPIで外からウィンドウを操作するのはリスクも伴うことを
一応承知しておいてください。

VBAだけでやるなら、サイズ変更のイベントもないので、
SelectionChange等の適当なイベントを使って
サイズをチェック、再設定するとか・・・

12860 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free