作成したカレンダーを、良い感じの位置とズームで表示する ②

昨日は、作成したカレンダーがパチッと画面内に収まるようにならないか、色々と試行錯誤してみた。
infoment.hatenablog.com
今日は、昨日のお試し版を更に作りこむことに挑戦する。
f:id:Infoment:20190305181125p:plain
昨日のブログ公開の後も、更に試行錯誤を繰り返した。ああでもない、こうでもない。

その時ふと、あるものに気が付いた。
f:id:Infoment:20190305181351p:plain
何だこれは。今まで目に入っていたはずなのに、意識したことが無かった。

試しにマクロの記録で、どのような記述になるか確認してみた。

    Range("B2:G10").Select
    ActiveWindow.Zoom = True

え、これだけ?衝撃の事実に、血反吐を吐いて倒れそうになった。

しかしこれならば、話は随分と簡単になる。
1. まず、対象となる範囲を設定する。
2. フィットさせたい範囲によって、選択範囲を変更する。
  ① 横幅でフィットさせたい ⇒ 一行目を選択する。
  ② 縦高でフィットさせたい ⇒ 一列目を選択する。
  ③ 全体をフィットさせたい ⇒ 全体を選択する。
① ~ ③ は、列挙型にして選択することにしよう。

Enum ZoomType
    RowFit
    CollumnFit
    AllFit
End Enum
Sub ZoomFit(target_range As Range, _
            Optional zoom_type As ZoomType = CollumnFit, _
            Optional zoom_ratio As Double = 1)
            
    
    ' フィットさせたい範囲の左上セル。
    Dim UpperLeftCell As Range
    Set UpperLeftCell = GetUpperLeftCell(target_range)
    
    'Gotoメソッドで、当該セルを画面の左上に表示させる。
    Application.Goto UpperLeftCell, True

    ' フィットさせたい範囲の右下セル。
    ' ※余白用にオフセットさせている。
    Dim BottomRightCell As Range
    Set BottomRightCell = target_range.SpecialCells(xlCellTypeLastCell).Offset(1, 1)

    Dim myRng As Range
    Set myRng = Range(UpperLeftCell, BottomRightCell)
        Select Case zoom_type
            Case ZoomType.AllFit
                myRng.Select
            Case ZoomType.CollumnFit
                myRng.Rows(1).Select
            Case ZoomType.RowFit
                myRng.Columns(1).Select
        End Select
        
        ActiveWindow.Zoom = True
        UpperLeftCell.Select
        ActiveWindow.Zoom = ActiveWindow.Zoom * zoom_ratio
End Sub

何だか随分、あっさり短くなってしまった。
早速テストしてみよう。

Sub test()
    With Range("H20")
        .NumberFormatLocal = "d"
        .Value = "4/1"
    End With
    Call MakeCalendar(Range("H20"), 12, 3)
    
    ActiveSheet.UsedRange.EntireColumn.AutoFit
    
    ZoomFit ActiveSheet.UsedRange, RowFit, 1
End Sub

f:id:Infoment:20190305182704g:plain

あの苦労は、何だったのか。
それにしても、カレンダーだけでなく、色々な場面で使えそうです。

参考まで。