2011年3月31日木曜日

エクセルのワークシートをスクロールさせる

VBAで、ワークシートに処理結果をたくさん出力するプログラムを作っているとする。

現在表示されている領域の外にデータが出力された場合、普通はプログラムが終了するまで待って、手動でワークシートをスクロールしなければならない。これでは面倒だから、ちゃんとリアルタイムで追いかけて確認したい。つまり、表示領域外にデータを出力した場合には、自動的にワークシートがスクロールし、最新のデータに追従して欲しい。

こうした動作は、VisibleRange, ScrollRow, ScrollColumn等を使って実現できる。

サンプルコード

' Sleepを使うためのおまじない
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'------------------------------------------------------------
' 指定されたセルに文字列を出力。
' 表示範囲外のセルに出力した場合は、スクロールさせる。
'------------------------------------------------------------
Sub printAndScroll(row, col, str)
    Cells(row, col) = str   '出力
    'シートのスクロール
    With ActiveWindow
        '行方向にスクロール(マイナス2で微調整している)
        If row > (.VisibleRange.Rows(1).row + .VisibleRange.Rows.Count - 2) Then
            .ScrollRow = .ScrollRow + 1
        End If
        '列方向にスクロール(マイナス2で微調整している)
        If col > (.VisibleRange.Columns.Columns(1).Column + .VisibleRange.Columns.Count - 2) Then
            .ScrollColumn = .ScrollColumn + 1
        End If
    End With
End Sub

'------------------------------------------------------------
' サンプルmain
'------------------------------------------------------------
Sub main()
    '右下に向かってテキトーな文字を出力
    For i = 1 To 50
        Call printAndScroll(i, i, "(" & i & ", " & i & ")")
        Sleep 100   '動作確認のためスリープ
    Next
End Sub

サンプルの動作

0 件のコメント:

コメントを投稿