任意の文字列に対して擬似的にワードラップを適用する

任意の文字列に対して擬似的にワードラップを適用する

総務省の通知文書

きみは、これを見て何も感じないのか?

この画像を見て、何も感じないだろうか。

何も感じなかった、という人は、では、次の画像はどうだろうか。

どうだろうか。

私は、こわかった

二つ目の画像でマーカを施した箇所は、〝全角の2けた以上の数字〟である。

全部行内におさまっていて、数字が行分かれしていないのは単なる偶然なのだろうか……?

この画像は、同じ文書の別の箇所である。これまた、2けた以上の数字がどれ一つとして行分かれしていないのである。

もちろん、(勝手にWordで作成していると決めつけるが、)Wordに全角2桁以上の数字を行折り返しのときにうまい具合に行内におさめてくれるような気の利いた機能はない。(……でいいんですよね? もし間違えていたら教えてください)

だから、行またぎのところに数字があると、

フツーに行分かれしてしまう。無慈悲である。

ま、まさか……。

それにしても、できあがった通知文書を見ると、2けた以上の数字が行分かれしているところがない。不自然なぐらい。

もしかして……。


めちゃくちゃ入念にチェックしている

のだろうか……。

擬似的にワードラップっぽくしてみる

〝ZERO WIDTH NO BREAK SPACE〟を使う

文字と文字の間に〝ZERO WIDTH NO BREAK SPACE〟が挟まっていると、その部分で行分かれすることを自動で防いでくれるらしい。

「3」と「1」の間に挟まっているへんなやつが〝ZERO WIDTH NO BREAK SPACE〟というやつ。すべての編集記号を表示しているから見えているだけで、印刷すると非表示になる。

〝ZERO WIDTH NO BREAK SPACE〟は入力しにくい

ところが、〝ZERO WIDTH NO BREAK SPACE〟というやつは非常に入力しにくい。

何せ、〝UNICODE文字コードFEFF〟である。

自分でも何を言っているのかわからないぐいらである。

単語登録してみようとしたが、できなかった。(やり方次第でできるのかもしれない。やり方を知っている人がいたら教えてください。)

そこで、マクロですよ!

そうなると、マクロの出番である。

得に、Wordのマクロは、こういう〝めんどくさい作業を1クリックでできるようにする〟ところに真価があると思う一人である。

選択した文字列のカンチャンに〝ZERO WIDTH NO BREAK SPACE〟を入れるマクロ

リスト1
Public Sub SetCustomWordwrap()
  Dim ZWNBSP As String
  ZWNBSP = ChrW(&HFEFF)
  Dim rng As Range
  Set rng = Selection.Range
  '文字が選択されていない、1文字だけのときはExit'
  Dim cnt As Long
  cnt = rng.End - rng.Start
  If cnt < 2 Then Exit Sub
  Debug.Print rng.Characters.Count
  Dim tmpText As String
  tmpText = rng.Text
  Dim c As String
  Dim result As String
  Dim i As Long
  For i = 1 To Len(tmpText) - 1
    c = Mid(tmpText, i, 1)
    If c <> ZWNBSP Then
      result = result & c & ZWNBSP
    End If
  Next
  result = result & Mid(tmpText, Len(tmpText), 1)
  rng.Text = result
End Sub

とりあえず作ってみただけなので、検証は不十分であることをおことわりしておく。

動作確認

マクロをクイック アクセス ツール バーに登録し、文字列を選択して実行してみる。

こんな感じ。

ワードラップっぽい挙動になる。

1行の文字数を超えるような範囲とか、ページ全体なんかを選択したときの動作は、怖くて確認していない。追い追い検証して制限をかけていくことにする。

ついでに

選択範囲から〝ZERO WIDTH NO BREAK SPACE〟を取り除くマクロも掲載しておく。

Public Sub RemoveZWNBSP()
  Dim ZWNBSP As String
  ZWNBSP = ChrW(&HFEFF)
  Dim rng As Range
  Set rng = Selection.Range
  Dim tmpText As String
  tmpText = rng.Text
  tmpText = Replace(tmpText, ZWNBSP, "")
  rng.Text = tmpText
End Sub

おわりに

これで書類作成がちょっとでも楽になったらいいですね。