[Excel][VBA]「紙というディスプレイへ」～Excelは印刷するまで信じるなを再現してみた

# コード

```vb
Sub DontBleaveUntillPrintOutSuccessfull()
ActiveSheet.UsedRange.Select
Selection.Clear
    ActiveSheet.PageSetup.PrintArea = "$A$1:$A$10"
    Application.PrintCommunication = False
    With ActiveSheet.PageSetup
        .LeftMargin = Application.CentimetersToPoints(1.8)
        .RightMargin = Application.CentimetersToPoints(1.8)
        .TopMargin = Application.CentimetersToPoints(2.5)
        .BottomMargin = Application.CentimetersToPoints(2.5)
        .HeaderMargin = Application.InchesToPoints(0.31496062992126)
        .FooterMargin = Application.InchesToPoints(0.295275590551181)
        .PrintHeadings = False
        .PrintGridlines = False
        .PrintComments = xlPrintNoComments
        .CenterHorizontally = True
        .CenterVertically = True
        .Orientation = xlPortrait
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = 100
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
    End With
    Application.PrintCommunication = True
    Range("A4:A10").Select
    Selection.ClearContents

    Range("A1:A10").Select
    With Selection.Font
        .Name = "ＭＳ Ｐゴシック"
        .Size = 48
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    Rows("1:1").RowHeight = 51
    Range("A4").Value = "エクセルは印刷するまで"
    Range("A6").Value = "信じるな"
    ActiveWindow.Zoom = 100
    Range("A1:A10").Select
    ActiveSheet.PageSetup.PrintArea = "$A$1:$A$10"
    With Selection
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Range("A4").Select
    Range("A1:A10").Select
    Range("A10").Activate
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With

End Sub
```

# Excelは印刷ソフトという現実
[「Excelは印刷するまで信じるな」　新社会人がやりがちな“Excel失敗あるある”に「何度騙されたことか」と反響](https://nlab.itmedia.co.jp/nl/articles/2104/10/news044.html)
この記事で何が衝撃的だったかというと、Excelは一言もWysingを実現しているなどと言われていないのに、そういう前提になっていることなんですね。さらにペーパーレスなんてありえないんですね。

[印刷物第一主義の会社で社内Wikiを立ち上げた話 - えくせるちゅんちゅん](https://www.excel-chunchun.com/entry/20210121-wiki-growi)
しかしえくせるちゅんちゅん氏の職場でもそうです。

##英語圏では
[EXCEL worksheet shows different Print Preview with different Printers](https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-mso_winother-mso_2007/excel-worksheet-shows-different-print-preview-with/d10cf1d9-28a6-4edd-8d2d-0deead95223c)

<iframe width="560" height="315" src="https://www.youtube.com/embed/SZBRFRoGSFY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

このように印刷するなど馬鹿だと。。。言ってないですね。。。

<iframe width="560" height="315" src="https://www.youtube.com/embed/JAOAYDA34lQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
なお、Cannonのプリンターがよく出てきます。あと、Marginではなく、スケーリングが修正の最優先順位のようです。そして罫線はほぼ使わず、枠線だけ使っています。
また、2010年代の記事が多い印象があります。
[Excel Print Preview not matching the actual printed document](https://techcommunity.microsoft.com/t5/excel/excel-print-preview-not-matching-the-actual-printed-document/m-p/1030343)
[How to Go Paperless at Your Small Business](https://smallbiztrends.com/2021/04/go-paperless.html)
この記事は2021年4月の記事です。
> Paper documentation has been a major part of running a business for decades. But times are changing. And more and more businesses are considering going paperless to save money, stay organized, and help the environment. If you’re looking to trade in your paper documents for alternatives, here’s a guide.

これはPRらしいんですけど、まるで2021年に「ペーパーレス化」が始まったかのような書き方です。つまり英語圏でもペーパーレスなんて全く関係なく紙にバンバン印刷しているんです。
## 中国ではどうか
[同一个excel文件在不同电脑上打印高度不同的原因](https://blog.csdn.net/huangchao064/article/details/40740613)
中国は罫線を引いて字数をカウントしています。つまり英語圏は日本と使い方が違いますが、中国はほぼ同じなわけです。自分もやりましたし。

要は英語圏の場合、字数は最小で、罫線は引かずグリッドライン（枠線）オプションで対処することが多いんですね。だから多少縮小してもそれで見やすくなります。ところが日本や中国の場合1つのセルに限界まで字数を打ち込むためその方法が効かないのです。

[同一个excel表格在不同电脑打印预览不同，如何处理？ 百度知道](https://zhidao.baidu.com/question/365947360824676412.html)
このひともキャノンだ。

## 韓国はあまりない
公式以外の解説は詳細なものが少ないですね。いうまでもなくHancomOfficeを使っているためでしょう。Excelのカスっぷりで生産性が阻害されることがないのです。たぶん。

### 韓国から訳すとわかりやすいってなんなの
>[Excelで印刷したときに、列の幅が異なってくる場合がある](https://support.microsoft.com/ko-kr/topic/excel에서-인쇄-했을-때-열-너비가-달라-지는-경우-9756db9b-ba72-e6b8-7d94-db84e148dd85)
追加情報
ほとんどのプリンタは、コンピュータの画面（72 dpi）よりもはるかに高い解像度（300または600 dpi）を提供しています。したがって、画面に表示される情報は、印刷された出力とは異なるレンダリングされます。列または行を選択し、自動調整コマンドを使用すると、画面に使用されるフォントメトリックがプリンタが使用するメトリックとは異なります。一部のフォントの一部の文字は、小数の値を使用することができます。たとえば、フォントは9.1ピクセルを報告することができますが、ディスプレイドライバは、分数を使用して作業することができないため、最も近い整数値に対応するフォントサイズを四捨五入します。この例では、9.1ピクセルを9.0ピクセルにおろします。解像度が高いプリンタが印刷プレビューで表示をレンダリングしたり、ワークシートを印刷するときに使用されている場合、9.1ピクセルの解像度で文字が印刷されることがあります。列の幅は、丸めた整数値に基づいて計算されるため、列の幅の印刷された出力は、表示された列の幅とは異なります。この違いは、自動調整コマンドを使用して、長いテキスト文字列が含まれている列のサイズを変更する場合に特に明らかな表示されます。
参照
自動調整コマンドを使用する方法の詳細については、[ヘルプ]メニューの[Microsoft Excelヘルプをクリックし、Officeアシスタントまたはアンサーウィザードで列の幅の変更を入力し、検索をクリックしてアイテムを表示します。

#### しかしこのマイクロソフトの説明はおかしい
いまのディスプレイは少なくとも72 dpiではなく96dpiとかあります。これはExcelが72dpiを基準にしているという意味だと思われます。
#### ついでにいうと、だからExcelは印刷せざるを得ない
画面で見るExcelは本来のフォントのきれいな部分がうまく出ていないし、見づらい原因はここでもわかるように72dpiという低い解像度が原因です。IT業界はフェミニストと似ています。日本は異常で狂った生産性の低い連中であり、その原因は○○だという点です。しかしながら72dpiに言及する人間はいません。ここがポイントなのにも関わらずです。実はウソなんですね。ディスプレイの解像度は低く、見づらいものだったのです。
　考え方を変えましょう。Excelを印刷するのは実は高い解像度の「ディスプレイ」で見る行為だとお考えください。「紙という超々高解像度のディスプレイ」に切り替えているだけなんですね。だからペーパーレスなんてありえないわけです。解像度が低い、電気を使う、重い、そういうものでわざわざ見るなどという生産性が低い行為を労働者に強要するような連中の極悪非道さに思い至るべきでしょう。つまり印刷することこそ生産性を改善する鍵であり、ペーパーレスどころかきれいに印刷する技術を持つべきだということがわかります。
#### 当方の立場からするとまったくありえない記事の例
[｢つい紙に出力してしまう人｣が知らないPC上ですべてを完結させるコツ5つ ](https://president.jp/articles/-/44762)
まず「つい紙に出力」などという想定ができる方がおかしいです。なぜこんなありえないウソを書くのか。さらに人は「画面上で思考」することもできません。これはディスプレイの解像度が低く、遠く紙に及ばないからです。割り箸で木刀の代わりができる。それくらいのレベルなんですね。
この記事はそのあと5つのコツを紹介していますが、「紙に比べてそういうコツがいる」という時点で紙に勝てるほどの生産性も思考能力も得られるはずがありません。紙はそこで脳のリソースを食わないからです。こういうことをしてディスプレイを使いこなそうという趣旨ならわかりますが。印刷する人は全く悪くないです。明確に見づらいから印刷しているので正しく当然な行為です。ディスプレイという紙に敗北したデバイスを少しでも使いこなすコツくらいなんですね。ペーパーレスどころか世界中なぜExcelはディスプレイと印刷が一致していないのかで問題にされています。みな印刷しているんですね。それなのにどこを見てペーパーレスとか言えるのでしょうか。

## では記事に戻りましょう
このようにマイクロソフトの説明に納得する人は世界中どこを探してもいません。解析すると2015年代後半から急速にExcelのカスっぷりは人類すべてを激怒させるポイントとなっているようです。こうした点がわかった上で、ねとらぼに戻ってみましょう

あたりまえなんですけど、これを投稿している人はまったく新社会人ではないですし、このExcel<b>文字が切れるための仕掛けが相当してあります</b>かなりプロですね。
<OL>
<li>プロポーショナルフォントをチョイス
<li>中央揃えを選択
<li>ディスプレイと印刷がずれるはばを心憎いまでにチョイス
<li>外枠を太罫線にして確実に文字を切りにいっている
</OL>
極めてあざとい方法で、この方わざと切れるフォント、切れる行間をチョイスしているんです。只者じゃないです。
もっとも上記記事で100回発狂している人は反省しましょう。この方は知っててやっているので、この程度のレベルは秒で直せます。Excelは演算誤差など致命傷を抱えているので、印刷でもめるなんていうことは本来は、そこじゃないんですよ。ただ、あとに述べるようにパラダイムシフトが起きているということは言えると思いますが。
## 対策
等幅フォント(Fixed Width Font)を使う。
外枠を太罫線にしてはいけない。
文字切れがあるとわかったら縮小して表示にする。
印刷範囲は今回`A1:A10`としても必ず0幅で行列を入れます。
具体的にはA列ではなく、B11までを印刷範囲とする。
B列、11行目はB列が列幅0、11行目が行の高さが0とします。
この点を以下のマクロで確認します。
まず、前段のマクロを実行したら、ディスプレイと印刷のずれを確認し、次のマクロを実行します

```vb
Sub Macro3()
    Columns("B:B").Select
    Selection.ColumnWidth = 0
    ActiveSheet.PageSetup.PrintArea = "$A$1:$B$11"
    Rows("11:11").Select
    Selection.RowHeight = 0
    Range("A1:A10").Select
    Range("A10").Activate
    With Selection.Font
        .Name = "HGS明朝E"
        .Size = 48
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With

    Selection.Font.Size = 48
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = True
        .ReadingOrder = xlContext
        .MergeCells = False
    End With

    Range("A1").Select
End Sub
```

とこんな感じで対策できます。

## Excelの発想
### ディスプレイは
ディスプレイは基本72dpiでプロポーショナルフォントなので、与えられた幅で早くきれいに見せようとする。このため<b>1行に何文字入るか正確に計算していない。さらに折返しの場合、何行はいるかもあまり正確に計算していない。</b>
### 印刷は
印刷するときは文字の大きさは決まっているので、正確に印刷しなければならない。
### 結果として現象が起きる
この2つの発想の結果、画面ではきれいに、印刷では正確に両端が切れるという現象になります。Excelとしては一貫しているんですね。

[21世紀も1/5過ぎて今だにWYSIWYGもまともに出来てないテクノロジーの停滞…](https://b.hatena.ne.jp/entry/4701049721534770594/comment/mory2080)
上のように理由ははっきりしており、技術の停滞ではありません。

[Excelはもともと印刷して人に見せるためのツールじゃないはずなんだけど、なまじっか見栄え良くて気軽に使えるからつい使ってしまうんだな。](https://b.hatena.ne.jp/entry/4701049721534770594/comment/niwakano18124)
マイクロソフトはしっかり解説しており、「印刷するソフトではない」という言い訳は通じないと思います。
### このケースではプリンタは影響しない（再現率100%）
なお、プリンター次第ではこの現象は変わりません。この幅だと通常A4サイズに印刷できるプリンターは正確にこういうずれを再現します。このひとは意図的かどうかは別として、そこまで計算しているんですね。

### PDFも解決にならない
[印刷前に一旦pdf化して確認するのがオススメ](https://b.hatena.ne.jp/entry/4701049721534770594/comment/oguri0220)
PDFで出して確認する、それはオプションをいじっていることが前提ですね。
[Excelを！！！！！！！！！！！！！！！印刷すんな！！！！！！！！！！！！！！！！！！！！！！！！！！！！！](https://b.hatena.ne.jp/entry/4701049721534770594/comment/pulldown)
昔だとそう言えたんですけど、今は無理ですね。
[Excelを印刷するなはクソリプ。かなり減ったけど、仕事では絶対必要なシーンもある。／プレビューと印刷結果が合わなくて直す時間もない時は、Excelを全画面表示してキャプチャしたPDFを印刷して持参したことがある。](https://b.hatena.ne.jp/entry/4701049721534770594/comment/shields-pikes)
それはExcelのせいではなく、1セルにいれる字数が多いからかもしれません。字数が多く行数が増えるほどどんどんおかしくなります。

## Excelは印刷するものに変わっっていたらしい
　今回記事を書いていて本当に驚いたのですが、Excelの印刷のバカっぷりはしだいに世界の人々に理解され始めているようなんですね。
　また、それはExcelは印刷ソフトとして使われていることを意味しています。
　とくに2010年代後半から急にそうなっているようです。
　現在この記事は2021年に書いています。何年後かに見るとどう見えるんだろう。こんにちは2021年以降に読んでいるみなさん。Excelはまだ存在していますか？Excelでバックステージを出して印刷ボタンを押していますか？それともQATに印刷プレビューと印刷オプションを表示させてそこからプレビューをみて印刷していますか？あなたのそばにあるプリンターはリコー、キャノン？ゼロックス？
　そしてそれはごく普通なことですか？
 少なくとも今から5年前にパラダイムシフトが起きました。Excelのディスプレイと印刷は同じではない。なぜだ、と問題になり始めたのです。それは日本語圏ではずっと前から問題でした。だからこそ「Excelは印刷まで信じるな」という記事に同意しかなかったのです。
　しかし、印刷する日本人の行為は異常で狂ったITを知らない生産性の低い人間以下の連中だとバカにされ、嘲笑され、日経新聞などマスコミの有識者にバカにされ、社会問題にされてきました。
　しかし、そのパラダイムシフトは実は日本人の使い方が正しいことを証明していました。IT業界の連中は雁首を揃えて全部間違ったウソをいっていたのです。生産性の低い行為を強要されるのですから、日本人の生産性が低い原因はIT業界にあったんですね。Excelで作るデータが詳細になるほど、ディスプレイでは見づらいため印刷してみるようになったてきました。世界は複雑化したんですね。Canonのプリンターはいまや世界中で使われています。Canonのインクジェットは安価できれいで精細です。そしてレーザーのような巨大なカートリッジがいりません。これも「紙というディスプレイ」を復権させたのでしょう。これをあなたが読むときにはどうなっているんでしょうね。しかしこの流れは変わっていないと思います。
## パラダイムシフトは続くだろう
Excelが72dpiを頑なに死守する理由は、「表示を早くする」「互換性」という点でしょう。他のWordでも見られる発想です。このためディスプレイの72dpiは変わらないわけです。また、フォントが切れる現象も変わりません。
その一方で、インクジェットプリンタも600dpiから上にはなかなかいきません。これ以上になるとレーザーになるためでしょう。技術的に均衡している関係になっています。この中で1枚のディスプレイ、紙に収めるべき情報が増えて紙へ移行していっているということになります。以上から、このパラダイムシフトは今後も継続するだろうという結論にしかならないのです。「Excelは印刷するまで信じるなと」言うのは実はこのパラダイムシフトの大きな流れを構成している記事である- そうとらえることができると思います。もうペーパーレスなどというありえない概念を振り回して嫌がらせをするあくどい行為はやめましょう。そして自分のようなITのことをよく知らない素人も「ペーパーレスなんて世界は来ない」ということをしっかり認識しましょう。これはもう「公理」であり「人類普遍の常識」であり「証明されて覆らない真実」です。ペーパーレス化は働き方改革どころか「生産性を低下させる理不尽な要求であり、いやがらせであり法律で禁じてもいい」レベルです。「ペーパーレス化」に成功したニュースも少なくなり、その後も継続しているということも聞きません。