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





