2024/04/02

Notes - Excel 連携:#35)Excel で使用する単位と変換

Excel を利用しているとさまざまな単位が登場します。

例えば、セルの幅や高さを変更しようとすると次のように表示されます。

幅の方が広いのに小さな数字となっており、明らかに単位が違います。横にピクセル値が表示されていることからもわかりますね。

また、文字の大きさを指定する際にはポイントを使用します。マージンの設定画面では、センチメートルで指定しますが、VBA のプロパティではポイントで指定する仕様となっています。

PageSetup.LeftMargin プロパティ (Excel)


単位の関係と列幅の単位

Microsoft Learn のドキュメントを調査していると、ヒントを発見しました。Excel ではなく Publisher ではありますが、次のメソッドがあります。

Application.PixelsToPoints メソッド (Publisher)

Application.PointsToInches メソッド (Publisher)

このドキュメントによると以下の関係で変換できるとのことです。

  • 1 ピクセル = 0.75 ポイント
  • 1 インチ = 72 ピクセル

25 ピクセルは 18.75 ポイントになりますので、高さの単位は ポイントであることがわかります。

幅については、72 ピクセルですので 1 インチの幅なのでしょうが、8.38 の単位ははっきりしません。Google 先生に聞いてみると『Excel 標準のフォントサイズ(11 ポイント)の時、1 セルに入る「文字数」』だそうです。なんだかいい加減な単位ですね。

ためしに Excel のオプション画面から既定フォントを変更してみました。

その上で、同じように 72 ピクセルとなるよう幅を調整すると 6.50 となりました。この結果からこの単位は定量的な長さの単位ではないことがわかります。

プログラムで指定するときには、『デフォルトの環境を基準に作成し、必要に応じて調整する』ぐらいのおおらかな気持ちで開発する必要がありそうですね。


変換関数の準備

Notes -Excel 連携アプリを作成するには、この単位変換が必要となるケースが多々あります。そこで、変換関数を lsXls ライブラリに作成します。

対象とする単位はインチ、ポイント、ピクセルに加えてなじみのあるセンチメールの4種類です。ちなみに、

  • 1 インチ = 2.54 センチメートル

です。

これら単位を相互に変換できるようにすべての組み合わせで準備しておけば変換で困ることはないでしょう。


◇ インチ ⇔ センチメートル

Public Function CMToInch(ByVal vdCM As Double) As Single
   CMToInch = vdCM / 2.54
End Function

Public Function InchToCM(ByVal vdInch As Single) As Single
   InchToCM = vdInch * 2.54
End Function


◇ インチ ⇔ ポイント

Public Function InchToPoint(ByVal vdInch As Single) As Single
   InchToPoint = vdInch * 72
End Function

Public Function PointToInch(ByVal vdPoint As Single) As Single
   PointToInch = vdPoint / 72
End Function


◇ インチ ⇔ ピクセル

Public Function InchToPixcel(ByVal vdInch As Single) As Integer
   InchToPixcel = CInt(vdInch * 96)
End Function

Public Function PixcelToInch(ByVal viPixcel As Integer) As Single
   PixcelToInch = viPixcel / 96
End Function


◇ センチメートル ⇔ ポイント、ピクセル

上記関数を利用して、対センチメートルの関数を作成します。

Public Function CMToPoint(ByVal vdCM As Single) As Single
   CMToPoint = InchToPoint(CMToInch(vdCM))
End Function

Public Function CMToPixcel(ByVal vdCM As Single) As Single
   CMToPixcel = InchToPixcel(CMToInch(vdCM))
End Function

Public Function PointToCM(ByVal vdPoint As Single) As Single
   PointToCM = InchToCM(PointToInch(vdPoint))
End Function

Public Function PixcelToCM(ByVal viPixcel As Integer) As Single
   PixcelToCM = InchToCM(PixcelToInch(viPixcel))
End Function


◇ ポイント ⇔ ピクセル

Public Function PointToPixcel(ByVal vdPoint As Single) As Integer
   PointToPixcel = CInt(vdPoint / .75)
End Function

Public Function PixcelToPoint(ByVal viPixcel As Integer) As Single
   PixcelToPoint = viPixcel * .75
End Function


前回 Notes - Excel 連携


0 件のコメント:

コメントを投稿