Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Microsoft 365)
ウィンドウを整列し、大きさを変更したい
投稿日時: 23/09/21 15:08:03
投稿者: tacco1956

エクセルファイルを開いたとき、上下2つのウィンドウを表示させることはできたが、
このとき、ウィンドウサイズを変更し、ウィンドウサイズを 3対1 に設定したい。
 
使用環境によって、ディスプレイのサイズが異なっても、ウィンドウサイズが 3対1 になるようにしたい。
 
あらかじめ 3対1 になるように設定して、保存しても、開いたとき、2つのウィンドウは維持されない。
VBAで ウィンドウサイズを設定したい。
 

回答
投稿日時: 23/09/21 18:16:54
投稿者: WinArrow

その操作を「マクロの記録」で、コードを作成することはできますか?

投稿日時: 23/09/21 19:39:51
投稿者: tacco1956

WinArrow さんの引用:
その操作を「マクロの記録」で、コードを作成することはできますか?

 
自動化メニューで記録すると、次のメッセージです。
 
    // This action currently can't be recorded.
 
 
マクロの記録では、次のようになってます。
 
Sub Macro2()
'
' Macro2 Macro
'
'
    ActiveWindow.NewWindow
    ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlHorizontal
    Application.Left = 0.25
    Application.Top = 491.5
    Application.Width = 1261.5
    Application.Height = 261.75
    Windows("test - 2").Activate
    Application.Left = 0.25
    Application.Top = 1
    Application.Width = 1261.5
    Application.Height = 493.5
    Windows("test - 3").Activate
 
End Sub
 
 
このような数字が記録されます。
操作環境は 1680x1050 の環境です。
上記の数字が、どのような単位なのかわかりませんが、ウィンドウを上下に並べて整列したときの記録です。
 
この記録をもとに、VBAで再現すればできないことはないと思うのですが、操作環境が 1680x1050 以外では動作が異なってしまうのではないかと思っています。
 

回答
投稿日時: 23/09/21 23:03:53
投稿者: WinArrow

>上記の数字が、どのような単位なのかわかりません
単位は、ポイントです。
 
スクリーンサイズは、ピクセルですから、
ピクセルをポイントに変換してみてください。
 
スクリーンサイズが異なる環境で運用するということなれば、
絶対値ではなくて、上下の割合で考えみては?

回答
投稿日時: 23/09/21 23:43:05
投稿者: simple

横合いからすみません。たたき台を示します。
カスタマイズはそちらで実行してください。
 

Option Explicit
'「画面解像度を取得する」
'即効テクニック   https://www.moug.net/tech/acvba/0020033.html
Private Declare Function GetSystemMetrics _
    Lib "user32" _
    (ByVal nIndex As Long) As Long
Private Const SM_CXSCREEN As Long = 0
Private Const SM_CYSCREEN As Long = 1

Sub test()
    Dim myX As Long, myY As Long
    Dim my_width#, my_height#

    '画面の幅を取得     'pixel
    myX = GetSystemMetrics(SM_CXSCREEN)
    '画面の高さを取得   'pixel
    myY = GetSystemMetrics(SM_CYSCREEN)

    my_width = myX / 96 * 72        '単位 point
    my_height = myY / 96 * 72       '単位 point

    Dim cnt As Long, k As Long
    Dim w As Window
    
    'visivle windowをカウント
    For Each w In Windows
        If w.Visible Then cnt = cnt + 1
    Next
    
    ReDim wd(1 To cnt) As Window
    For Each w In Windows
        If w.Visible Then
            k = k + 1
            Set wd(k) = w
        End If
    Next
    
    'ひとつしかなければ、新規ウインドウを追加
    If cnt = 1 Then
        ReDim Preserve wd(1 To 2) As Window
        Set wd(2) = wd(1).NewWindow
    End If
    
    '上下に並べる
    ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlHorizontal

    'Windowの大きさを調整
    With wd(1)
        .Left = 0
        .Top = 0
        .Width = my_width
        .Height = my_height * 3 / 4
    End With
    With wd(2)
        .Left = 0
        .Top = my_height * 3 / 4
        .Width = my_width
        .Height = my_height * 1 / 4
    End With
End Sub

回答
投稿日時: 23/09/22 09:05:44
投稿者: gombohori

 ThisWorkbook.Windows.Arrange xlArrangeStyleHorizontal してからHeightとTopを調整すると

 Sub sample()
    Dim win1 As Window, win2 As Window
    Set win1 = ThisWorkbook.Windows(1)
    If ThisWorkbook.Windows.Count < 2 Then ThisWorkbook.NewWindow
    Set win1 = ThisWorkbook.Windows(1)
    Set win2 = ThisWorkbook.Windows(2)
    For i = 3 To ThisWorkbook.Windows.Count
        ThisWorkbook.Windows(i).Close
    Next
    ThisWorkbook.Windows.Arrange xlArrangeStyleHorizontal
    Debug.Print win1.Top
    If win1.Top < win2.Top Then w = win1.Top: win1.Top = win2.Top: win2.Top = w
    win2.Height = win2.Height * 4 / 3
    win1.Top = win2.Height
    win1.Height = win1.Height * 2 / 3
 End Sub

投稿日時: 23/09/22 15:11:35
投稿者: tacco1956

WinArrow さん
simple さん
gombohoriさん
 
アドバイスありがとうございました。
 
具体的にコードまで添えていただき、感謝です。