Excelシートを好きなサイズに方眼化するVBA

VBAを使ってExcelを所望のサイズ(mm単位)に方眼化します。PCの解像度やフォントサイズにかかわらず、最小の誤差を実現します。

スポンサーリンク

Excelシートを好みのサイズに方眼化するVBA

以前の記事で、Excelを方眼紙にして、図を書くことをオススメしました。

記事の中では、方眼紙をVBA(マクロ)で作ることを提案しています。VBAでは、ColumnWidthとRowHeightの値によって列幅や行幅を指定します。ところが、ColumnWidthは、文字幅が単位です。すなわち、環境ごとに値がばらつくため、動作前に設定値を決めるための手作業が発生していました。

本記事で紹介するVBAは、PCの解像度やフォントサイズ等にかかわらず、方眼の寸法誤差がシステムで定まる最小値になります。もちろん、事前の手作業も不要です。

アルゴリズムとしては、設定に用いた値と、設定値反映後のカラム寸法の比を算出し、漸近的に近づける方法を採用しました。誤差が減らなくなった時点で収束完了です。ほぼ2、3回のループ数で収束します。この方法は、カラム寸法が、ポイント(pt)単位で正確に得られるために成立します。

しかし、なぜ文字幅をColumnWidthの設定用の単位にしたのでしょうか?日本人なら、環境で変わることのないmmやインチを単位にしたはずです。でも、そもそも日本人はExcelを作ることを思いつかないのでしょう。

それでは、VBAのコードを示します。
標準モジュールにコピー&ペーストしてください。

VBAを使ったことのない方は、先ずこちらの記事をご参照下さい。

'-----------------------------------------------------------------------
' Summary: 方眼パターンをつくる
'-----------------------------------------------------------------------
Public Sub MakeAGridPattern()
    Const cstSize       As Double = 5   ' [mm] グリッドのサイズ
    Dim dblHeight       As Double       ' [pt] A1セルの高さ
    Dim dblMin          As Double       ' [pt] 最小誤差
    Dim dblTarget       As Double       ' [pt] 目標サイズ
    Dim dblWidth        As Double       ' [pt] A1セルの幅
    Dim dblSetHeight    As Double       ' [pt] 行高さの設定値
    Dim dblSetWidth     As Double       ' [字] 列幅の設定値
    Dim i               As Integer      ' ループ変数
    
    ' 目標グリッドサイズをpt単位で得る
    dblTarget = 72 * cstSize / 25.4
    
    ' 初期値を設定
    dblSetWidth = cstSize / 3   ' 1文字3mmくらい
    dblSetHeight = dblTarget    ' 高さはptで与えられる
    dblMin = 36                 ' 誤差の初期値を1/2inにする
    
    ' 全セル範囲を選択
    Cells.Select
    ' 上限を10回としてループする
    For i = 1 To 10
        ' 列幅と行高さを設定する
        Selection.ColumnWidth = dblSetWidth
        Selection.RowHeight = dblSetHeight
        ' 代表値としてA1セルの列幅と行高さをpt単位で取得する
        dblWidth = Range("A1").Width
        dblHeight = Range("A1").Height
        ' 誤差が前回までの最小誤差と一致したらループを抜ける
        If Abs(dblWidth - dblTarget) = dblMin And _
                Abs(dblHeight - dblTarget) = dblMin Then _
                Exit For
        ' 最小誤差を更新する
        If Abs(dblWidth - dblTarget) < dblMin Then _
                dblMin = Abs(dblWidth - dblTarget)
        If Abs(dblHeight - dblTarget) < dblMin Then _
                dblMin = Abs(dblHeight - dblTarget)
        ' 設定値と実際の値の比から新たな設定値を計算する
        dblSetWidth = dblSetWidth * cstSize * 72 / 25.4 / dblWidth
        dblSetHeight = dblSetHeight * cstSize * 72 / 25.4 / dblHeight
    Next i
End Sub

コードの中で、「Const cstSize As Double = 5」の数値を変更することにより、所望のサイズの方眼を作ることができます。

できあがった方眼において、若干の誤差が気になるかもしれません。

しかし、量子化誤差があるため、それより小さくできません。例を示すと、Windows 11の64ビット上で動作するExcelバージョン2202のWidth及びHeightの刻み幅は0.6 ptであり、Vistaで動作するExcel 2007の刻み幅は0.75 ptでした。つまり、1セルにつき、それぞれ最大で、0.11mm (=25.4*0.6/2/72)、0.13mm (=25.4*0.75/2/72)の誤差が生じる可能性があります。これを回避することはできません。

まとめ

PCの解像度やフォントサイズ等に左右されずに、所望のサイズの方眼が得られるExcelのVBAを紹介しました。

コメント

タイトルとURLをコピーしました