PAGE TOP

取り組み

印刷する

Excelの文字切れ

さぼ郎
画面表示と印刷結果が異なる場合
Excelを使っている人にとって共通する問題と思います。

セル幅ギリギリにしておくと隣接する右列に文字列がかかってしまったり、改行して表示するようにしておくと、縦幅を十分に取っていないことで、プレビューでは改行されていないのに、印刷では改行がかかり、それが下の行に潜ってしまったりしてしまいます。

マイクロソフトの公式の見解では、
プレビューは印刷物と可能な限り同じにしなければなりませんが、画面とプリンタでは解像度や、物理的なサイズや特別なケースを除いて使用されるフォントが異なるため、まったく同じというわけにはいきません。
これは Excel が、プリンタ ドライバからそのプリンタが持っている能力や情報を受取り、これらを基に印刷物のイメージを画面上で作り上げているためです。
もし印刷物とプレビューが異なる場合は、プリンタ ドライバの選択が異なっているか、プリンタ及びプリンタ ドライバに問題がある可能性があります。
しかし画面上のワークシートは、表示の正確さよりも速度を重視しています。
つまり、「プリンタドライバに問題が有る」「表示の正確さよりも速度を重視している」ことに起因しているわけで、「全く同じ」という訳にはいかないとのことです。

幾つかの回避策がネットに上がっていました。

表示幅を「98%」にする
-完全な対応でもなさそうです
列幅の自動調整
ー完全な対応でもなさそうです
縮小して全体を表示
ー完全な対応でもなさそうです
折り返して全体を表示する
完全な対応でもなさそうです
セルの最後に改行を入れる
-完全な対応でもなさそうです
「MS Pゴシック」ではなく「MS ゴシック」を使う
-完全な対応でもなさそうです
メイリオを使う
-完全な対応でもなさそうです

つまりは、完全なる解決策ではないようです。厄介なのはプリンタドライバを経由させなければならないということです。というのは、表示はあくまでも画面解像度ですが、印刷はプリンタ解像度に依存することとなります。

しかし、画面においてはプリンタ解像度はあまり意味が無いわけで、Excelでは列幅や行の高さの数が相当数有る上に、それぞれのセルに様々なフォントが思いのままの文字数でセットされているので、印刷プレビューを正確に計算するのは大変なことは想像に難くありません。

しかし、ビジネスシーンでおそらく一番多く使われていると思われるExcelですので、プレビューの「簡易表示」と「精緻表示」が選べれば、問題は解決するように思いますが、いまのところマイクロソフトでは取り組む予定はないようです。

文字切れの原因の一つとして「プロポーショナルフォント」が上げられていますが、正確には、プロポーショナルフォントの文字同士の間隔(アキ)を調整する「カーニング」という演算と、Excelのプレビュー画面作成演算が、個別に行われていることに原因が有るような気もします。

カーニング
wiki「カーニング」にリンク ↑

「MS P明朝「MS 明朝「メイリオ」を比べてみると、

カーニング

上段が「P明朝」で中央が「明朝」、下段が「メイリオ」です。固定ピッチの明朝は、ほぼ等幅ですが、「P明朝」では、「L」「T」は、固定ピッチより文字幅が大きいです。

また、メイリオは固定ピッチだという情報もありましたが英字に関してはプロポーショナルです。

カーニング

しかし、日本語に関しては「明朝」と「メイリオ」の文字幅は固定ピッチです。

カーニング

「明朝」は完全に固定ピッチですが「メイリオ」は英文字に関してはプロポーショナルであることがわかります。

このサンプルはイラストレータで作成してありますが、Excelでも全く同じです。つまり、文字のピッチは、画面表示においては少なくとも全く同じ結果なので、個々のアプリが表示幅を決めているわけでもなさそうです。

カーニング

Excelでも文字の幅は同じですが、文字の高さはメイリオだと文字の下にも余白が取られます。文字を72ポイント使用したときのExcelの行の高さは、明朝の83.25に対してメイリオは113.25で1.36倍ほど高さを必要とするようです。

マイクロソフトが対応しないと明言している文字切れを、どうにかならないかと打診されていますが、使用するフォント、カーニングそしてプリンタドライバが絡み合って「画面表示」「プレビュー」そして実際の「プリントアウト」で3様の出力結果となっていることへの対処が、果たして可能なのかが思案のしどころとなっています。

一番気になることは、プリントアウトして提出した印刷物において文字切れが発生すれば、仮にそれが重要な数字だったりすると、大きな問題になることなども懸念されます。数字の場合は、オーバーフローすると「#」になるようですが、その仕組も解明しないとなりません。

ラスタライズする直前で、セル幅とセル内のデータとで幅と高さを比較するようなロジック以外に、オーバーフローチェックはできないのでしょうか?

もうし少し、研究してみます。

キーワード