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を紹介しました。
コメント