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
  1. Option Explicit  
  2.   
  3. Sub SampleCode()  
  4.     Dim FileName As String  
  5.     FileName = ActiveWorkbook.Name  
  6.     Application.WindowState = xlMaximized  
  7.       
  8.     'マクロ実行中のウィンドウがいくつあるかカウントする  
  9.     Dim Count As Integer, i As Integer  
  10.     For i = 1 To Windows.Count  
  11.         If FileName = Windows.Item(i).Caption _  
  12.                 Or 0 < InStr(Windows.Item(i).Caption, FileName & ":"Then  
  13.             Count = Count + 1  
  14.         End If  
  15.     Next  
  16.   
  17.     For i = 1 To 3 - Count  
  18.         ActiveWindow.NewWindow  
  19.     Next  
  20.   
  21.   
  22.     Dim AppWidth As Double, AppHeight As Double  
  23.     AppWidth = Application.UsableWidth  
  24.     AppHeight = Application.UsableHeight  
  25.       
  26.     With Windows(FileName & ":1")  
  27.         .WindowState = xlNormal  
  28.         .Width = AppWidth  
  29.         .Height = AppHeight * 0.3  
  30.         .Left = 0  
  31.         .Top = 0  
  32.         .Activate  
  33.     End With  
  34.     Sheets("AAA").Select  
  35.       
  36.     With Windows(FileName & ":2")  
  37.         .WindowState = xlNormal  
  38.         .Width = AppWidth / 2  
  39.         .Height = AppHeight * 0.7  
  40.         .Left = 0  
  41.         .Top = AppHeight * 0.3  
  42.         .Activate  
  43.     End With  
  44.     Sheets("BBB").Select  
  45.       
  46.     With Windows(FileName & ":3")  
  47.         .WindowState = xlNormal  
  48.         .Width = AppWidth / 2  
  49.         .Height = AppHeight * 0.7  
  50.         .Left = AppWidth / 2  
  51.         .Top = AppHeight * 0.3  
  52.         .Activate  
  53.     End With  
  54.     Sheets("CCC").Select  
  55. 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 件のコメント: