2023年3月 プログラムの話 その1 | 初めての犬飼い日記

初めての犬飼い日記

シゲという名前の保護犬を飼うことになったアラフォーオッサンの記録です

 

EXCELでセルの幅を調整する時に数値が2つ表示されるのをご存じでしょうか?

 

こんなのや…

 

こんなのです。

 

『幅』や『高さ』という表示の右側に注目すると、小数点付きの数値に並んでピクセル数が表示されていることが分かると思います。

 

ところで今回、ピクセルでセルの幅を指定する必要に迫られまして…

 

VBAでセル幅を設定するにはどうればいいのかしら?🤔

 

と、調べてみました。

結果、設定方法に関してはそんなに難しい話ではなくて、Range オブジェクト の ColumnWidth というプロパティに数値を代入すればいいだけでしたニヤリ

 

そんなわけで、試しにセル幅を50ピクセルに設定してみようと、50を代入してみたのですが、50ピクセルにならない!チーンガーン

 

なんだこれ?どういうこと?

 

と、先述の ColumnWidth のページをよく読んでみると注釈の項に…

 

>> 1 単位の列幅は、標準スタイルの 1 文字の幅に等しくなります。
>> プロポーショナル フォントでは、数字の 0 の幅が列幅の単位になります。

 

こんな記述がありました。

なるほど、横幅の数値は『数字の 0 を横並びに置ける個数』ということらしいです。

つまり、この横幅の画像の 8.38(72ピクセル) という数値は、『数字の 0 を 8.38個並べることのできる幅です』という意味なのです。

 

 

どんな単位やねん!笑い泣き笑い泣き笑い泣き

 

それはともかく、ピクセルではなく『0 を並べられる個数』(以下、ポイントと呼びます)で設定してやる必要があるというのが分かりました。となると、ピクセルをポイントに変換する必要が出てくるわけです。

 

8.38 ポイント = 72 ピクセル

 

というのが分かっているので…

 

8.38 ÷ 72 = 0.116389...

1 ピクセル ≒ 0.116389 ポイント

 

と求めることが出来ます。

では、この係数を使って、50 ピクセル をポイントに変換すると…

 

50 × 0.116389 = 5.819444

 

はい、こんな感じで求めることが出来ました。

簡単ですね!ニヒヒ

 

 

って、全然違うやんけ!ガーン

 

ちなみに、5.819444 ポイントに最も近いのは、52 ピクセルでした。

こういう時には人類の叡智であるGoogle先生に頼ろう!(他力本願)

というわけで、トップに表示されたこちらの記事を読んでみました。

 

 

ここの記事によると…

 

>> 幅    0.118ポイント : 1ピクセル
>> 高さ 0.75ポイント   : 1ピクセル

 

という、100 ピクセル時のポイント数から割り出した係数を採用しているようです。

 

何故にピクセルの数値が大きくなると、係数も大きくなるの?🤔

 

そんな疑問がわきましたが、とりあえずこの係数を使わせてもらいましたが、やはりズレるのです。ふと、この記事を最後まで読み進めると…

 

>> 値が小さいと正方形に見えないくらい
>> 高さと幅に差が出るようです。

 

どうやら、この係数の算出方法も完全とは言い難いようです。

しかし、小さい値だと誤差が大きくなるというのは良い情報を入手できました。

 

単純な比率計算ではないようだけれど、EXCELというアプリケーションで動いている以上、なんらかの法則はあるはずなのです…

 

こうなったら、とことんやってやろうじゃーねーか!物申す

 

というわけで、1~50 ピクセルに設定した際のポイントを表にまとめてみました。

 

 

くっそ面倒でしたが、ド根性でやりとげましたよ!笑い泣き

その甲斐あってか、データの妙なところに気付けました。

 

『ピクセル』の値が 13 と 14 の行の『差分』の値に注目してください。

ここを境にして、『幅』の値の増え方が変わっているのです。

 

ピクセルの値が 1 ~ 13 の間の増分値の平均は、0.076667 です。

それに対して、ピクセルの値が 14 ~ 50 の間の増分値の平均は、0.125 です。

 

つまり、セルの幅が狭い時と広い時で変換用の係数が違っていたのです。

そういうわけで、先述の係数を求める方法だと、小さな値を設定した場合に誤差が大きくなっていくという現象とも辻褄が合います。

 

ここで疑問がわきます…

 

なぜ、1 ~ 13 ピクセルの場合にのみ係数が違うのか?🤔

 

ここからは私の推測ですが…

係数の境目である 14 ピクセルの際のセル幅は 1 となっています。

そして、先述の通りにここから先の増分値は 0.125 ずつとなっています。

仮に 1 ~ 13 ピクセルの場合に同じ増分値が採用されていたとすると、5 ピクセルに達した時点でセル幅はゼロになってしまい、それよりも小さな値が指定されるとマイナスになってしまうのです。

それを防ぐ為に、単純に 1 ポイントを残りのピクセル数で等分しているのではないでしょうか?

 

1 ÷ 13 = 0.0769...

 

このように、先ほど私が求めた係数の近似値となっています。

EXCEL内部の処理は分かりませんが、セル幅が 1 ポイント未満となる場合には、セル幅が 1 ポイントの時のピクセル数を基準に指定された値で等分した値を係数として変換している…みたいな感じかなぁ…と推測しました。

 

と、随分と前置きが長くなってしまいましたが、変換用のメソッドを作ってみました。

パラメータの値がピクセルで、14未満の場合と、それ以外で計算式を変えております。

 

セルの横幅をピクセル → ポイントに変換する
Public Function Pixel2Point(ByVal pix As Double) As Double
    Pixel2Point = IIf(pix < 14, pix * 0.077, (pix - 13) * 0.125 + 1)
End Function
 
50 ピクセルまでしかデータがなかったので、念の為にセル幅を 1000 にして試してみましたが、問題なく変換されましたので現環境であれば問題なく使えそうです。
 
 
最後にセルの高さについてですが、Range オブジェクト の RowHeight というプロパティに数値を代入すればよく、変換係数は 1 ピクセル = 0.75 ポイントとなっております。