にっきダイアリー

はてなダイアリーからはてなblogに移動してみました。

Excel の不思議 - 2006/04/13

まずは、昨日いろいろ試行錯誤してみた部分を書いてみる。

セルの高さを1センチにしようと思った場合は超簡単に、

Cells(row,col).RowHeight = Application.CentimetersToPoints(cm) 

とできる。本来は、セル幅も、まず Application.CentimetersToPoints でポイントに変換し、 標準スタイルのフォント「0」の横幅から算出した数値で割ったものを ColumnWidth にすればいいはずだ。

私もそう思ったので、最初はそうやってみた。

MS Pゴシック 11pt の「0」の幅は 6pt。ゆえに、ColumnWidth = 10 のセルは 60pt ……のはずが、なぜか 63.75pt になる。ん?

ColumnWidth = 100 だと、603.75pt。ColumnWidth = 20 だと、123.75pt。なんですか、この 3.75 っておまけは。

まぁ、いいや。すると、ポイントから ColumnWidth を出すには、cw = (pt - 3.75) / 6 という簡単な式で出せる。 実際、ColumnWidth = 30 な セルに対して、

ActiveCell.ColumnWidth = (ActiveCell.Width - 3.75) / 6

ってやってもセルの幅は変わらない。オッケー。3.75 を引かないと値が変わるから、3.75 を引くことは正しいはず。 じゃあ、センチメートル単位で出すなら、cw = (Application.CentimetersToPoints(cm) - 3.75) / 6 でいけるじゃーん。 いけると思うだろ〜? 思うよね。

でまぁ、それで1センチ(のはずの)のセル幅は約 28 pt となり、ColumnWidth は 4.13 となる。おけおけ。じゃあ、AからJまでのセル幅を 4.13 にして印刷してみよう。

すると、なぜか、9mm ちょいの幅のセルが10個印刷されるのだ。つまり、Application.CentimetersToPoints(cm) で出したポイント幅は正しくない。なぜだ……?

悩みつつセル幅の微調整をしてみた結果、41 ピクセルだとちょうど1センチになることがわかり、ポイントよりもピクセルで換算したほうが誤差が出ないことがわかり、そして昨日のマクロが出来上がったと。

で、こっからが Excel の不思議なところだが、高さのほうは 28pt(実際は 28 というきっちりした数字が出せないので、27.25 or 28.13) でちゃんと1センチになるのだ。なにこれ。