2011年12月25日日曜日

[ExcelVBA] ウィンドウを3分割表示


■お題
マクロを実行したファイルのウィンドウを3分割して下さい。3分割の仕方ですが、下図を参考に上下で3:7に分け下段は左右に1:1に分割して下さい

■解答例
よくエラーチェックのマクロの際に上画面がエラー画面で下がエラーの該当シートみたいな使い方で複数ウィンドウは使いますねぇ。
1画面だと切り替えた時になんだっけ??
ってことになってしまうので複数ウィンドウの方がUI的に優しくてよいですよねぇ。


では、ウィンドウサイズやブックのサイズの取得等するのでそこらへんのまとめをしておきます。

□ウィンドウサイズの状態変更
オブジェクト.WindowState
定数内容
xlMaximized最大化
xlNormal通常表示
xlMinimized最小化
※ウィンドウサイズを変更禁止することのできるEnableResizeプロパティでFalseになっているとエラーになります


□ウィンドウサイズの取得
オレンジ色の領域は、下記で取得できます。
Application.Width
Application.Height


赤色の領域は、下記で取得できます。
Application.UsableWidth
Application.UsableHeight



□ブックのサイズ・位置の取得
ActiveWindow.Width
ActiveWindow.Height

ActiveWindow.Top
ActiveWindow.Left


□ブックのタイトル
ActiveWorkbook.Name
ActiveWindow.Caption

どちらも、新しいウィンドウで複数になっていなければ同一の値を返します。
例)SampleCode.xls の場合
・ActiveWorkbook.Name
⇒SampleCode.xls
・ActiveWindow.Caption
⇒SampleCode.xls


新しいウィンドウで複数ウィンドウを開いていると
例)SampleCode.xls:1 / SampleCode.xls:2
・ActiveWorkbook.Name
⇒SampleCode.xls
・ActiveWindow.Caption
⇒SampleCode.xls:1
⇒SampleCode.xls:2
Option Explicit

Sub SampleCode()
    Dim FileName As String
    FileName = ActiveWorkbook.Name
    Application.WindowState = xlMaximized
    
    'マクロ実行中のウィンドウがいくつあるかカウントする
    Dim Count As Integer, i As Integer
    For i = 1 To Windows.Count
        If FileName = Windows.Item(i).Caption _
                Or 0 < InStr(Windows.Item(i).Caption, FileName & ":") Then
            Count = Count + 1
        End If
    Next

    For i = 1 To 3 - Count
        ActiveWindow.NewWindow
    Next


    Dim AppWidth As Double, AppHeight As Double
    AppWidth = Application.UsableWidth
    AppHeight = Application.UsableHeight
    
    With Windows(FileName & ":1")
        .WindowState = xlNormal
        .Width = AppWidth
        .Height = AppHeight * 0.3
        .Left = 0
        .Top = 0
        .Activate
    End With
    Sheets("AAA").Select
    
    With Windows(FileName & ":2")
        .WindowState = xlNormal
        .Width = AppWidth / 2
        .Height = AppHeight * 0.7
        .Left = 0
        .Top = AppHeight * 0.3
        .Activate
    End With
    Sheets("BBB").Select
    
    With Windows(FileName & ":3")
        .WindowState = xlNormal
        .Width = AppWidth / 2
        .Height = AppHeight * 0.7
        .Left = AppWidth / 2
        .Top = AppHeight * 0.3
        .Activate
    End With
    Sheets("CCC").Select
End Sub
4行目:FileName変数 アクティブブックの名前格納用
5行目:アクティブブック名取得
6行目:ウィンドウを最大化する

9行目:Count変数 マクロ実行中のウィンドウの数を格納する用
            i変数 For文で使用
10行目:For文でブック名を走査する
11行目:IF文の条件について…
            FileName = Windows.Item(i).Caption
            ⇒ファイルが一つの時用の条件
            0 < InStr(Windows.Item(i).Caption, FileName & ":"
            ⇒新しいウィンドウを開いて複数になった時用の条件
13行目:マクロ実行中のファイルと同じブックがあった時にカウントする
15行目:繰返し

17行目:マクロ実行中のブックが3つになるようFor文で新しいウィンドウを開く

22行目:AppWidth変数 ウィンドウの内側の幅を格納する用、
            AppHeight変数 ウィンドウの内側の高さを格納する用
23行目:ウィンドウの内側の幅を取得
24行目:ウィンドウの内側の高さを取得
26~34行目:SampleCode.xls:1のブックを走査
            ブックの状態を普通 ブックの幅をウィンドウの内側の幅と同じにする
            ブックの高さをウィンドウの内側の高さの30%にする
            ブックの位置(左側)を0にする ブックの位置(上側)を0にする
            ブックをアクティブにする(シートを選択する為)
            シート名(AAA)を選択

36~44行目:SampleCode.xls:2のブックを走査
            ブックの状態を普通
            ブックの幅をウィンドウの内側の幅と同じにする
            ブックの高さをウィンドウの内側の高さの30%にする
            ブックの位置(左側)を0にする
            ブックの位置(上側)を内側の高さの30%にする
            ブックをアクティブにする(シートを選択する為)
            シート名(BBB)を選択

46~54行目:SampleCode.xls:3のブックを走査
            ブックの状態を普通
            ブックの幅をウィンドウの内側の幅と同じにする
            ブックの高さをウィンドウの内側の高さの30%にする
            ブックの位置(左側)を内側の幅の50%にする
            ブックの位置(上側)を内側の高さの30%にする
            ブックをアクティブにする(シートを選択する為)
            シート名(CCC)を選択

0 件のコメント: