Microsoft Excelの列の右端を印刷範囲ギリギリまで広げる

まずは、Microsoft Excelの選択セルの幅を広げて印刷範囲ギリギリにする、というツールのソースコードを。

```
Sub 列幅最大化()

Const 幅調整シート = "幅調整"

Dim 現在ブック As String
Dim 現在シート As String

Dim 現在行 As Long
Dim 現在列 As Long

Dim j As Long

Dim 現在縦ページ数 As Long

Dim 幅 As Long
Dim 調整幅 As Double
Dim Cpage As Long

    現在ブック = ActiveWorkbook.Name
    現在シート = ActiveSheet.Name

    現在行 = ActiveCell.Row
    現在列 = ActiveCell.Column

    現在縦ページ数 = ActiveSheet.PageSetup.Pages.Count
    If 現在縦ページ数 = 0 Then
        現在縦ページ数 = 1
    End If

    Application.ScreenUpdating = False

    ThisWorkbook.Activate
    Call シート作成(幅調整シート)

    With Workbooks(現在ブック).Worksheets(現在シート)
        For j = 1 To 現在列
            Cells(1, j).Font.Name = .Cells(1, j).Font.Name
            Cells(1, j).Font.Size = .Cells(1, j).Font.Size
            Cells(1, j).Font.FontStyle = .Cells(1, j).Font.FontStyle
            Cells(1, j).Borders(xlEdgeLeft).LineStyle = .Cells(1, j).Borders(xlEdgeRight).LineStyle
            Cells(1, j).Borders(xlEdgeRight).LineStyle = .Cells(1, j).Borders(xlEdgeRight).LineStyle
            Cells(1, j).Borders(xlEdgeLeft).Weight = .Cells(1, j).Borders(xlEdgeLeft).Weight
            Cells(1, j).Borders(xlEdgeRight).Weight = .Cells(1, j).Borders(xlEdgeRight).Weight
        Next j
    End With
        
    Cells(1, 現在列 + 1).Value = "D"    '右側が空欄でなくする。Dummyの"D"をツッコム
    Cells(1, 現在列 + 1).EntireColumn.AutoFit

    幅 = 0

    Do
        幅 = 幅 + 1
        Columns(現在列).ColumnWidth = 幅
        DoEvents
        Cpage = ActiveSheet.PageSetup.Pages.Count
    Loop Until Cpage > 現在縦ページ数

    調整幅 = Columns(現在列 + 1).ColumnWidth

    Do
        調整幅 = 調整幅 - 0.01
        Columns(現在列 + 1).ColumnWidth = 調整幅
        DoEvents
        Cpage = ActiveSheet.PageSetup.Pages.Count
    Loop Until Cpage = 現在縦ページ数

    Columns(現在列).ColumnWidth = 幅 + 調整幅
    DoEvents

    Application.DisplayAlerts = False
    Worksheets(幅調整シート).Delete
    Application.DisplayAlerts = True

    Workbooks(現在ブック).Activate
    Worksheets(現在シート).Activate

    Columns(現在列).ColumnWidth = 幅 + 調整幅

    Application.ScreenUpdating = False

End Sub

Sub シート作成(作成シート名 As String)

Dim ws As Worksheet, flag As Boolean
    
    flag = False
    For Each ws In Worksheets
        If ws.Name = 作成シート名 Then
            flag = True
            Exit For
        End If
    Next ws

    If flag = True Then
        Application.DisplayAlerts = False
        ws.Delete
        Application.DisplayAlerts = True
    End If
    Set ws = Worksheets.Add(before:=Worksheets(1))
    ws.Name = 作成シート名

End Sub
```

なぜこんなしょーもないもの（ありそうでなかった、というより、だれも作る気にならなかった、という方が適切だろう）を作ったかの経緯を説明する。
***
　日本は遅れた国であるのは「罫線」を多用することにも表れている。罫線がないとどこに字を書けばよいかすらわからないという主体性のなさの反映だからだ。
　もう5年以上前になるが、それを克服するためにスキャナで読み込んだ画像から(多少傾むこうが滲もうが)罫線を消去するプログラムを書いた。これで欧米に少しでも迫れるかと思ったところ、罫線を利用するのがAIによる読み取りのトレンドだからと却下された。　それほど罫線というものは日本文化に深く根付いているらしい。作文感想文その他を原稿用紙に書かせる教育は即刻廃止すべきである。(ところであの時に出た「罫線の中の文字を読み取る」AI製品群、ものになったのかしら。)

　こんな国なので誰もが一度は出くわしたことがあろう。パソコンで罫線付きのフォーマットを提示されてこれに記入せよ、というの。
　これが、テキストエディタに打ち込むようにキーをたたいているうちに連続する文字が一行に収まりきらなくなると、あたりまえのように右端で折り返して次の行にカーソルが移動する、という仕様になってくれていればよいのだが、そんな風に作りこんでくれたものは只の一度しかお目にかかったことがない。
　記入欄にMicrosoftWordの表を使いながらも、文字を書き込む欄を一つの大きなセルにしてくれて、罫線は線画でそれっぽく重ねていたわけだ。行間隔と罫線の間隔をしっかりと一致させてくれているので、そういう風に使えるのだ。
(このように作った本人が少し手をかければ、他の人すべてが楽になるのに、なぜ皆やらないのだろう。← やらない人を「エゴイスト」と呼んでいいですか？)

　でもWordはまだいい。やろうと思えばできる。問題はMicrosoft Excelである。Wordのような技が使えない。かつ「画面ではきれいに収まっている文字列が、印刷するとはみ出る」ことが普通に起こる。これを回避するために印刷プレビューで確認しながら、1行(1セル)に入れる文字数を調整する、という超めんどくさいことが起こる。
　頻度としては決して多くはないだろうが、誰もが出くわしたことがある「ただひたすらに面倒なこと」といってよかろう。

　一方、欧米ではあまり罫線が使われていないので、こういった問題とは無縁である。日本は生産性が悪いといわれるが、こういうところにも原因があったのだ。

　と、安っぽいビジネス書のようなことを言っておいてなんだが私の発想は「めんどくさいなら自動化すればいいじゃないか」である。面倒な思いをした経験のある人はそれなりに多いだろうに、どうして誰も作ってないのだ。理由は大体見当がつく。見栄があるからだ。罫線好きな人も手間がかかることは知っているのだろうが、だからといって「セルに分割して流し込むツールを作って提供しますのでこのフォーマットでお願いします」などとは言えない。「だったらはじめからそんなフォーマット作るな!」というリアクションが返ってくるのは分かり切っている。ならば自己防衛として「そういう問題ははじめから存在しない」と言い張るしかない。(こういう人を「エゴイスト」と呼んでいいですか？)
　あるいは恥ずかしいからだろう。まさかそんな非効率なことをやっている、なんて他人に言えない。なので「自動化したいけど何とかならない?」なんて要望を出せるわけがない。

　かくしてこの悪習は、その問題の存在すら隠されたまま、続いてゆくことになる。まあWebアプリの場合は「罫線に合わせて書きこんでね」ができないので、それにつられて罫線偏愛問題は徐々に消えていっていると思うが。
　しかし、今、目の前にある面倒くささに業を煮やした私は
「作った」。

　おそらくは世界一ニッチで、かつ広範囲に需要が見込めるツールである。(ただし絶対に売れない。そんな非合理が自分の会社にあることをお金を出す部署は認めないからである。逆にいうと売ってないから欲しければ自分で作るしかないともいえる。)
　やることはそんなに難しくないとはいえ、気にすべきことは多い。
内部的には、作業用シートを一つ作って、そこに一文字ずつ追加してゆき、列幅を自動調整した結果が元の列幅以上になったら、次の行にゆく、という「一見無駄だがこれしかないね」という方法をとっているのだが、細かい調整が色々入る。フォント名、フォントサイズ、フォントスタイルはコピーしてくるのは当然として、それだけでは印刷時に「線一本分はみ出る」場合がある。はっはあ「罫線の太さ」が影響しているな、と左右の罫線もコピーしてくる。ところがこれで試してみるとごく希に文字の右側が罫線にかかる。
　MicrosoftExcelがこんな挙動を示したら、もうこちらが妥協するしかない。バッファーとして1ポイント確保、その代り「列幅を自動調整した結果が元の列幅より大きくなったら」次の行に行く、と修正。その辺の文章、片っ端から読み込ませて検証、どうやらこれでいいみたいね。
　もちろん禁則処理は入れているし、簡易的ながらワードラップもかけている、という心配り。

　さて「世界一ニッチ」とは書いたが、需要は「広範囲」としただけで「世界的」とは書いてない。理由はもちろん「罫線にこだわるエゴイストが跋扈しているのは日本だけだろう」という事情もあるが、
「画面では正常でも印刷するとはみ出す現象が起こるのは日本だけかもしれない」
という懸念があってのことである。
　この現象が起こる元凶は、Microsoft ExcelがApple Macintosh用のソフトとして作られたことにある。MacはWISIWIG。つまり画面で見たとおりのものが印刷されることがウリであったが、実は当時のシステムフォントOsakaは画面に表示されるときと印刷するときは同じフォントでも幅が違うという問題を抱えていた。Microsoft Excelはこれをアプリケーション側で補正していたわけである。つまり、印刷したときにセル内にぴったり収まるよう、画面の方を調整していたのだ。この特性を持たせたままWindowsに移植したため、Windows側がWISIWYGでなくなった、と、そういう経緯がある。MacOSが世界的にそういうタコ仕様なのかどうかはわからないので「世界的に需要がある」とまでは言えなかったのだ。
(マイクロソフトの日本法人に画面幅を調整するような技術力があるとは?「はがきスタジオ」を見る限り~思えないので世界的だとは思うのだが、こんどは逆にこのツール他の言語でも動くか、テストができないので何とも言えなかったりする。)

　このツール、記入を求められたフォーマットにムカッと来て作ったのだが、個人的には結構多用しそうだ。

　ほら、システム開発のドキュメント、文中に表が作りやすいこともあって、Microsoft Excelで作ることも結構あるじゃない。そのとき、ひとかたまりの文章を複数セルに流し込みたくなること、少なくないんじゃないかな？印刷してもはみ出ないように中途半端に気を使うと行末がガタガタになって逆に読みにくくなったりするので、自動で行分けをしてくれると助かる。
　さらに開発ドキュメントならはWordのアウトラインで書くことが多いとしても、各部署に数字入れてね、とお願いする作業シートはMicrosoft Excelで作ることが多くないですか？その時「使い方」のシートとか挟みたくなりますよねえ。説明が別紙になるよりも同じブック内にある方が取り回しがいいのは自明でしょ。このとき、このツール使って説明文を流し込むと「楽」。
　手間をかけて作ったかいはあったかもしれない。

　そのためには「印刷範囲ギリギリまでセル幅を広げる」という操作が必要になるなあ。
　これもめんどくさいから自動化。それが冒頭に紹介したツール。