コラム

ワードの字送りを揃えよう

なんだかウネウネしてるな~問題

ワードを使っていて、行ごとの「字送り」がこんな風にズレてしまうことはないでしょうか?
(この例では、A4で行の文字数を37文字、左余白を30mm、右余白を15mmに設定しています。)

わかりますか? この部分です。

文書全体を見ると、なんだかウネウネしているんですよね。

段落を左揃えにすると別な問題が...

一番簡単な解決方法は、段落を「左揃え」にすることです。

確かに「字送り」は揃いますが、「句読点の字下げ」が行われず、最後の1文字が次の行に送られてしまいます。

ファイルを.docxではなく.docで保存するとなぜか直ります。

しかし、今どき、.docはないでしょう。この状態から.docxで保存し直しても、この状態を維持するようですが、それもまた...

右インデントを調整するというのも...

段落を「両端揃え」にしたままでも、段落の「右インデント」を少し減らしてやれば、字送りを揃えることができます。文書全体を選択してから、右ルーラーをちょっと左に動かすだけです。

でも、右余白と右インデントがあってないとウズウズするのは私だけでしょうか...

原稿用紙というのも...

「原稿用紙の設定にする」では、こういった問題が起きませんが、文字数や余白の設定によっては、文字数が足らなくなる場合があります。

字送りの値が丸められてしまうのが原因

段落を「両端揃え」にすると字送りが揃わない原因は、「字送り」の設定値が0.05pt刻みに丸められているにも関わらず、行中に改行のない行だけが行末を揃えるように「字送り」を調整してしまうからだと考えられます。

段落を「左揃え」にすると句読点の字下げが行われないのは...バグだと思います。

右余白を調整してしまおう

VBAアセットとしての(今のところの)結論は、「右余白を適正な値に調整する」です。

ページ設定を見ると、この例の場合、「右余白」15㎜に設定されています(文字数は37字)。

これを17.5mmに設定すると段落が「両端ぞろえ」のままでも「字送り」が揃います。(文字数の再設定が必要です。)

もちろん、「句読点のぶら下げ」もバッチリです。

問題は、この17.5㎜という値をどうやって算定するかです。
いつも使っている書式はだいたい決まっていると思うので、少しずつ変化させて試行錯誤するという手もありますが...

マクロに調整させよう

文字数の設定画面には、「字送り」の値が表示されています。

この値を利用して、行幅がその倍数になるように右余白を設定してやれば良いのです。

そのためのコードは、次のとおりです。

Const sngPageWidth As Single = "210"            '用紙サイズの幅(mm)
Const strMargines As String = "35,27,30,17.5"   'ページ余白(mm)(上,下,左,右)'右余白は、修正されるのでわずかに増減します。
Const strCharsAndLines = "37,26"                '文字数及び行数(文字)(文字数,行数)
Dim sngLeftMargine As Single        '設定しようとしている左余白(mm)
Dim sngRightMargine As Single       '設定しようとしている右余白(mm)
Dim sngLineWidth As Single          '設定しようとしている行幅(mm)
Dim lngCharCount As Long            '文字数(文字)
Dim sngAppCharFeed As Single        '適正な字送り量(mm)
Dim sngAppCharFeedPt As Single      '適正な字送り量(pt)
Dim sngCalCharFeed  As Single       'ワードが算定する字送り量(mm)
Dim sngCalCharFeedPt  As Single     'ワードが算定する字送り量(pt)
Dim sngAppLineWidth As Single       '適正な列幅(mm)
Dim sngCorrRightMargine As Single   '修正した右余白(mm)
Dim x As Single, y As Single        '計算用代数

'設定しようとしている行幅を求める
sngLeftMargine = varMargines(3)     '設定しようとしている左余白(mm)
sngRightMargine = varMargines(4)    '設定しようとしている右余白(mm)
sngLineWidth = sngPageWidth - sngLeftMargine - sngRightMargine     '設定しようとしている行幅(mm)

'適正な字送り量を求める
lngCharCount = varCharsAndLines(1)              '文字数(文字)
sngAppCharFeed = sngLineWidth / lngCharCount    '適正な字送り量(mm)
sngAppCharFeedPt = sngAppCharFeed / 0.3528      '適正な字送り量(pt)

'ワードが算定する字送り量を求める
'適正な字送り量を0.05刻みで四捨五入します。
'エクセルのMROUD関数と同じことを行っています。
sngCalCharFeedPt = Round(sngAppCharFeedPt * 2, 1) / 2   'ワードが算定する字送り量(pt)
sngCalCharFeed = sngCalCharFeedPt * 0.3528              'ワードが算定する字送り量(mm)

'適正な行幅を求める
sngAppLineWidth = sngCalCharFeed * lngCharCount     '適正な行幅(mm)

'設定すべき右余白を求める
sngCorrRightMargine = sngRightMargine - (sngAppLineWidth - sngLineWidth)  '設定すべき右余白(mm)

VBAアセットが紹介している「VA公用文」というテンプレートにも、このマクロを使っています。

どのように計算しているかは、こちらのエクセルファイルで確認できます。(プログラムの試験用に作成したものです。)

「あれっ? 字送りの値を修正してやれば、右余白を設定値のままにできるんじゃない?」 と思われたあなた、そのとおりです。
でも、ワードのVBAでは、この「字送り」の値を設定できないようなのです。さらにその値を取得することもできません。それで、仕方なく自分で「字送り」を計算して「右余白」を修正しているという次第です。
「字送り」の計算方法は推定でしかありませんが、その結果は、私がテストした範囲ではワードの計算結果と合致しています。また、「余白」の値は、(行端が揃ってさえいれば)そんなに厳密に要求されないと思うので、特に問題はないと考えています。

コメント

  1. 管理人 より:

    計算を行うためのコードを掲載しました。

タイトルとURLをコピーしました