| 
    
     |  | 遅くなりました 申し訳ありません m(_ _)m 皆様 ありがとうございます
 
 
 横道にそれますが
 周知の事項かも知れませんが・・・下記に気がつきました、
 
 シートにコマンドボタンをはって
 新しいウインドウを開いて、並べて表示の状態で
 :1、:2どちらでもいいので、コマンドボタンを押すと
 アクティブでないシートのコマンドボタンに斜線がかかって
 そのボタンは反応しなくなります
 
 斜線がない方のボタンは操作可能です
 
 操作したウィンドウ側をいったん閉じない限りそのウインドウの操作権は
 そのまま保持しているようです
 
 >ブックの×ボタンで閉じられないようにしたいと思っていますが
 >上記に相当するイベントは無いようです
 と、関連があるような気がしますが・・・・
 
 この
 >操作したウィンドウ側をいったん閉じない限りそのウインドウ操作権は
 >そのまま保持しているようです
 は、コード上で初期化?することは出来ますか
 あわせて、この状況をググって見たのですが引っ掛けることは出来ませんでした
 参考URL等あれば、ご紹介よろしくお願いいたします
 
 
 本題のほうですが
 
 もやもやと、霧の彼方で、ウインドウのくくりで操作できないものかと思っていたのですが
 nさん、yoshiさんから、さくっとその回答が・・・
 ありがとうございました 勉強になります
 
 どちらも動作はわかるのですが、自分ではかけないコードです
 あわせて、具体的にどこが難しいのかわからないのですが
 理解が難しいです
 
 
 >↑の仕様で、ブックの保護(ウィンドウをチェック)を用いると以下のように簡単でしょう。
 ブックの保護(ウィンドウをチェック)だけの違いでないような気もしますが
 今回は、yoshiさん のコードを参考にさせて頂きたいと思います
 nさん、申し訳ありません
 
 また
 neptuneさんのAPIについては、別途、機会を設けてもう少し勉強したいと思います
 申し訳ありませんがよろしくお願いいたします
 
 
 yoshiさん
 >↑の仕様で、
 は、
 ActiveWindow.Width = ActiveWindow.Width + 2
 でなく
 .Width = max_w - 142
 のように、変数の値でセットしたいのですが
 
 
 [VBA] Public 宣言された変数の有効期間
 ht tp://support.microsoft.com/default.aspx?scid=kb;ja;408871
 のためか
 Public 変数の値が破棄されてしまうようなので
 Workbook_Activate
 ToggleButton1_Click
 で、各々取得しています
 
 
 他の変更として
 
 ・Workbook_Open時でなく、トグルボタンを設けて、新しいウインドウを開くことにしました
 ・他に、後2画面表示時、マウスが乗ったウインドウをアクティブにしました
 これは別途、以前webでメモしたものを使用しました(記載先見つかりませんでした)
 
 
 極力、nさん の コードに 近づけたいと思っていましたが
 動かすために
 Workbook_Open時、Application.EnableEvents = False とか
 ToggleButton1_Click時に、Application.EnableEvents = True とか
 Workbook_Activate時等、変な記述となっています
 
 
 現状、解決できない問題は
 ・別ブックを開いて操作すると、2画面表示がうまく機能できなくなってしまいます
 ・この状態で、ブックを切り替えると、新しいウインドウが作られてしまいます
 他にもありそうですが・・・・
 
 これは
 >あわせて、具体的にどこが難しいのかわからないのですが
 ~~~~~~~~~~~~~~~~~~~~~~
 >理解が難しいです
 によるものと思います
 
 解決のためのヒント、アドバイス等あればよろしくお願いいたします
 
 
 新規ブックの Sheet1 の b2あたりにトグルボタンを作成して
 下記コード貼れば再現できると思います
 よろしくお願いいたします
 
 ----------------------------------------------------------------------
 'Sheet1モジュール
 
 Option Explicit
 
 
 Public max_h As Double
 Public max_w As Double
 
 
 Private Sub ToggleButton1_Click()
 
 'Stop
 Application.EnableEvents = True
 
 Dim i As Integer
 Dim ck As Integer
 
 ck = 0
 
 If Sheet1.ToggleButton1.Value = False Then
 
 ToggleButton1.Caption = "DTセット(2画面表示)"
 
 del_w
 StopSample
 
 Else
 
 For i = 1 To Windows.Count
 
 If ActiveWindow.Caption = ActiveWorkbook.Name & ":1" Then
 ck = 1
 End If
 
 Next
 
 If ck > 0 Then
 Exit Sub
 End If
 
 ToggleButton1.Caption = "戻 る"
 
 Unprotect
 
 On Error Resume Next
 
 ActiveWindow.NewWindow
 
 ActiveWindow.WindowState = xlMaximized
 max_h = ActiveWindow.Height - 20.25 'なぜか-20.25 必要
 max_w = ActiveWindow.Width
 
 Windows(ActiveWorkbook.Name & ":1").Activate
 With ActiveWindow
 .WindowState = xlNormal '←元に戻す と 同等
 .Top = 0
 .Left = 0
 .Height = max_h
 .Width = 240
 End With
 
 'Windows(Name & ":2").Activate
 Windows(ActiveWorkbook.Name & ":2").Activate
 
 With ActiveWindow
 .WindowState = xlNormal
 .Top = 0
 .Left = 240
 .Height = max_h
 .Width = max_w - 240
 End With
 
 ActiveWorkbook.Protect Structure:=False, Windows:=True
 
 Worksheets(2).Select
 
 On Error GoTo 0
 
 StartSample
 
 End If
 
 
 End Sub
 
 
 Public Sub del_w()
 
 Windows(ActiveWorkbook.Name & ":2").Activate
 
 ActiveWorkbook.Unprotect
 ActiveWindow.Close
 
 Windows(ActiveWorkbook.Name).WindowState = xlMaximized
 
 End Sub
 
 
 ----------------------------------------------------------------------
 'ThisWorkbookモジュール
 
 
 Option Explicit
 
 
 'Public max_h As Double '標準モジュールでないと保存されない???
 'Public max_w As Double
 
 Public max_h As Double
 Public max_w As Double
 
 
 Private Sub Workbook_Activate()
 
 
 Dim i As Integer
 Dim ck As Integer
 
 ck = 0
 
 For i = 1 To Windows.Count
 
 If ActiveWindow.Caption = ActiveWorkbook.Name & ":1" Then
 ck = 1
 End If
 
 Next
 
 
 If ck > 0 Then
 
 Exit Sub
 
 End If
 
 Sheets(1).ToggleButton1.Caption = "戻 る"
 
 ActiveWindow.NewWindow
 
 Unprotect
 
 On Error Resume Next
 
 Windows(ActiveWorkbook.Name & ":1").Activate
 With ActiveWindow
 .WindowState = xlNormal '←元に戻す と 同等
 .Top = 0
 .Left = 0
 .Height = max_h
 .Width = 240
 End With
 
 Windows(ActiveWorkbook.Name & ":2").Activate
 
 With ActiveWindow
 .WindowState = xlNormal
 .Top = 0
 .Left = 240
 .Height = max_h
 End With
 
 ActiveWorkbook.Protect Structure:=False, Windows:=True
 
 Worksheets(2).Select
 
 On Error GoTo 0
 
 
 End Sub
 
 Private Sub Workbook_Deactivate()
 Unprotect
 ActiveWindow.WindowState = xlMaximized
 End Sub
 
 Private Sub Workbook_Open()
 
 Application.EnableEvents = False
 
 End Sub
 
 
 ----------------------------------------------------------------------
 
 'Module1モジュール
 
 
 Option Explicit
 
 Private Type POINTAPI
 x As Long
 y As Long
 End Type
 Private Declare Function SetTimer Lib "user32" ( _
 ByVal Hwnd As Long, ByVal nIDEvent As Long _
 , ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
 Private Declare Sub KillTimer Lib "user32" ( _
 ByVal Hwnd As Long, ByVal nIDEvent As Long)
 Private Declare Sub GetCursorPos Lib "user32" ( _
 lpPoint As POINTAPI)
 Private Declare Function WindowFromPoint Lib "user32" ( _
 ByVal xPoint As Long, ByVal yPoint As Long) As Long
 Private Declare Function GetParent Lib "user32" ( _
 ByVal Hwnd As Long) As Long
 
 Private Const ERROR_SUCCESS As Long = 0
 
 Private myTimerId As Long
 
 
 Sub TimerProc(ByVal Hwnd As Long, ByVal uMsg As Long _
 , ByVal idEvent As Long, ByVal dwTime As Long)
 Static myX As Long, myY As Long
 Dim myPoint As POINTAPI
 Dim myHwnd As Long
 GetCursorPos myPoint
 With myPoint
 If .x = myX And .y = myY Then Exit Sub
 myX = .x: myY = .y
 End With
 myHwnd = WindowFromPoint(myX, myY)
 myHwnd = GetParent(myHwnd)
 If myHwnd = ERROR_SUCCESS Then Exit Sub
 myHwnd = GetParent(myHwnd)
 If myHwnd <> Application.Hwnd Then Exit Sub
 Debug.Print myX, myY
 
 
 If ActiveWindow.WindowState <> xlMaximized Then
 
 If myX < 350 Then
 On Error Resume Next
 Windows(ActiveWorkbook.Name & ":1").Activate
 On Error GoTo 0
 Else
 On Error Resume Next
 Windows(ActiveWorkbook.Name & ":2").Activate
 On Error GoTo 0
 End If
 
 End If
 
 
 End Sub
 
 Sub StartSample()
 myTimerId = SetTimer(0&, 0&, 0&, AddressOf TimerProc)
 End Sub
 
 Sub StopSample()
 KillTimer 0&, myTimerId
 End Sub
 
 |  |