Window Object - Excel 97

Window
Excel
VBA
Tips to handle Window Objects using Excel VBA.
本文を折り畳む 本文を開く

はじめに

今回のテーマは、Window Object の操作です。前回扱った Workbook Object と似通っていますが、ファイルではなく、ユーザーの開いた画面と一対一で対応する単位になります。

実例

Window の追加と破棄

  1. Workbook Object の Open や Close に連動し、該当 Workbook に対応する Window Object も自動的に生成・破棄されます。ただし、Window Object は、これとは別に、以下のようにして生成・破棄することができます。
  2. 新しく Window を開くには、Workbook Object に対して、NewWindow を指示します。このメソッドは、新規追加された Window Object を返します。
    Sub Window1()
        Dim wi As Window
        Set wi = ActiveWorkbook.NewWindow
        MsgBox wi.Caption, vbOKOnly, wi.WindowNumber
    End Sub
    
    これにより、ワークブックの Window を多重に開くことができます。
  3. NewWindow メソッドは、Window Object にもあり、上と同じように新規 Window を開くことができます。ただし、仕様によれば、このメソッドも Window Object を返すことになっていながら、環境により、うまく返さないようなので、注意が必要です。
    Sub Window2()
        Dim wi As Window
        ActiveWindow.NewWindow
    End Sub
    
  4. Window を閉じるには Close メソッドを指示します。多重に開いた Window Object を閉じる場合、最後の一つになるまでは、ファイル保存の有無は問いません。Close メソッドでファイルを保存した場合、ユーザーが保存確認ダイアログでキャンセルボタンを押したときのみ、False を返し、他の場合は(たとえば保存しないを選んだ場合でも)、True を返します。次のコードは、アクティブな Window に対応するワークブックの、多重に開いた Window を一つだけ残して、残りをすべて閉じます。残される Window は不定です。
    Sub Window3()
        Dim wi As Window
        For Each wi In ActiveWindow.Parent.Windows
            If wi.Parent.Windows.Count = 1 Then Exit For
            wi.Close
        Next wi
    End Sub
    
  5. 次のコードは、上と似た動作ですが、アクティブな Window が最後に残されます。
    Sub Window3B()
        Dim wb As Workbook
        Set wb = ActiveWindow.Parent
        Do Until wb.Windows.Count = 1
            wb.Windows(2).Close
        Loop
    End Sub
    
  6. 次のコードは、すべてのブックについて、多重で開いた Window を閉じます。
    Sub Window4()
        Dim wb As Workbook
        For Each wb In Workbooks
            Do Until wb.Windows.Count = 1
                wb.Windows(2).Close
            Loop
        Next wb
    End Sub
    

ウィンドウを操作する

  1. 次のコードは、Activate メソッドを用いて、ウィンドウを順次、切り替えます。この方法は Workbook Object の時とまったく同じです。
    Sub Window5()
        Dim wi As Window
        For Each wi In Windows
            wi.Activate
            Application.Wait Now() + 1 / 24 / 3600
        Next wi
    End Sub
    
  2. 次のコードは、ActivateNext メソッドを用いて、ウィンドウを順次、切り替えます。このメソッドはループするため、終点を自分で判定しています。
    Sub Window5B()
        Dim oldWin As String
        Dim newWin As String
        oldWin = ActiveWindow.Caption
        Do
            ActiveWindow.ActivateNext
            Application.Wait Now() + 1 / 24 / 3600
            newWin = ActiveWindow.Caption
        Loop Until oldWin = newWin
    End Sub
    
  3. ActivatePrevious メソッドは、逆回転です。
    Sub Window5C()
        Dim oldWin As String
        Dim newWin As String
        oldWin = ActiveWindow.Caption
        Do
            ActiveWindow.ActivatePrevious
            Application.Wait Now() + 1 / 24 / 3600
            newWin = ActiveWindow.Caption
        Loop Until oldWin = newWin
    End Sub
    
  4. Windows Collection の Arrange メソッドは、Window Object を指定した方法で整列させます。引数 ArrangeStyle には並べ方の方法として、Const xlArrangeStyleCascade = 7 (重ねて表示)、Const xlArrangeStyleHorizontal = -4128 (&HFFFFEFE0) (左右に並べて表示)、Const xlArrangeStyleTiled = 1 (並べて表示)、Const xlArrangeStyleVertical = -4166 (&HFFFFEFBA) (上下に並べて表示)、のいずれかを指定します。
    Sub Window6()
        Windows.Arrange ArrangeStyle:=xlArrangeStyleTiled
    End Sub
    
  5. 並べた Window をもとにもどすには、Window Object の WindowState プロパティに、Const xlMaximized = -4137 (&HFFFFEFD7) (最大化)を指定します。ほかには、Const xlMinimized = -4140 (&HFFFFEFD4) (アイコン化)、Const xlNormal = -4143 (&HFFFFEFD1) (通常)、があります。
    Sub Window7()
        ActiveWindow.WindowState = xlMaximized
    End Sub
    

Window に関する、その他の操作

  1. Window Object の持つ、表示属性に関するプロパティによって、ワークシートの外観を制御できます。
    Sub Window8()
        With ActiveWindow
            .DisplayFormulas = Not .DisplayFormulas
            .DisplayGridlines = Not .DisplayGridlines
            .DisplayHeadings = Not .DisplayHeadings
            .DisplayHorizontalScrollBar = Not .DisplayHorizontalScrollBar
            .DisplayOutline = Not .DisplayOutline
            .DisplayVerticalScrollBar = Not .DisplayVerticalScrollBar
            .DisplayWorkbookTabs = Not .DisplayWorkbookTabs
            .DisplayZeros = Not .DisplayZeros
            .EnableResize = Not .EnableResize
        End With
    End Sub
    
  2. Window Object の表示・非表示を切り替えるには、Visible プロパティを利用します。
    Sub Window9()
        Static wiCap As String
        If wiCap = "" Then
            wiCap = ActiveWindow.Caption
            Windows(wiCap).Visible = False
        Else
            Windows(wiCap).Visible = True
            wiCap = ""
        End If
    End Sub
    
  3. Window Object の Zoom プロパティで表示倍率を変更できます。また、VisibleRange プロパティで、画面に表示されている範囲を掴むことができます。
    Sub Window10()
        With ActiveWindow
            .Zoom = 150 - .Zoom
            MsgBox "現在の倍率" & .Zoom & "%では、" & 
                .VisibleRange.Address & "が見えています。"
        End With
    End Sub
    

小噺

Window を特定する、いくつかの方法

数多くの Window Object の中から、目的の Window を選び出す方法は、いくつかあります。
用例解説
ActiveWindowActive になっている Window を特定する。
Windows(1)Window Collection の item 順位を利用する。1から始まる連番を指定する。
Windows.Item(1)Windows Collection の item 順位を利用する。上の方法の丁寧な表現。*1 *2 *3
Windows("Book3.xls:2")Windows Collection に対して、Window Object の Caption プロパティを与える。
ThisWrokbook.Windows(1)特定の Workbook Object に属する Windows Collection の item 順位を利用する。1から始まる連番を指定する。
  1. Windows Collection の Item 数は、Count プロパティで取得できます。
  2. item 順位 1 は、ActiveWindow となります。
  3. item と似たものに、 Window Object の WindowNumber というプロパティがあります。これは、Window を開いた順に割り振られる数字です。

上位 Object

Window Object の上位 Object は、Workbook Object です。一つの Workbook は、複数の Window を持つことができます。
ActiveWindow.Parent
上の表現は、ActiveWorkbook と同じものを返します。

Download a Sample Code

上記の解説で用いたサンプルコードは、以下のリンクからダウンロードできます。テキストファイルとして用意しているので、保存して Excel の Visual Basic Editor にインポートしてください。
  1. Save a program source (sample-vbaxlwi1-1.bas) on your local disk.
  2. Start Microsoft Excel with a blank(new) book.
  3. Open the Visual Basic Editor. (Tool/Macro/Visual Basic Editor)
  4. Import the downloaded program source. (File/Import Files)

History

2002/3/24
URL移転
2001/2/26
sample-vbaxlwi1-1.bas put
2001/2/26
初版
本文を折り畳む back to home index of VBA