トップ «前の日記(03/15) 最新 次の日記(03/26)» 編集

hossy online - といぼっくす

ゲームの感想日記、たまにIT・プログラミングの話


03/20

_ [IT] Excelの罫線が行挿入時におかしくなる理由

たまにIT・プログラミングの話 と今年初めにこのサイトの先頭に書いたものの、その後一度もそんな日記はありませんでした。そこでExcelネタを一つ。

事例(1)

左図は3*3の表です。ここに対して行を挿入すると、同じように全て罫線のある行が増えそうです。

しかし、表の作り方によっては右図のように一部だけ罫線が切れます。見た目を気にしなければいいのですけれど、だいたい気になって書式設定することに。

B2のセルを選択して書式設定で外枠をつけ、これを [C2, D2, B3, D3, B4, C4, D4] に [F4] キーで繰り返し設定して作りました。

理由

検索すると、[miauの避難所 / Excel 罫線の挙動を調べてみた] に詳しい調査結果がありました。

  • 縦の罫線は、「左セルの右辺」と「右セルの左辺」の「2本」の設定場所があり、見た目上はこの2つが繋がって「1本」になる
  • 「コピー・ペースト」や「行の挿入・削除」をすると、2本の罫線の差の影響を受ける

ということでした。より詳しいことを知りたい方はリンク先をどうぞ。

事例(2)

内部データはおそらく右図のようになっています (行・列番号はずれています)。これなら行を挿入して真ん中が抜けるのは納得です。

片側だけ線が付いていることは、セルの書式設定で C2:D2 を見ると、青丸で囲んだ表の内部が実線になっていなくて、複数の線になっていることから分かります。C2 の書式設定から下罫線、D2 の書式設定から上罫線を見ても、見た目通りの実線になっていて内部データは確認できません。

回避方法

表の内部の書式を設定すると、両側の線が同じように変わるようです。行や列を挿入することのある場所では、線の書式を表の内部で設定すれば大丈夫です。既存の表に対して行が挿入できないときにこれを行うのは一手間かかりますけれど、一回行えばもう壊れないという安心感。

罫線のタイプが変わる場所、ヘッダ行や集計行近くでは挿入しないというのも。

また、Excel2007以上でブックの共有が必要なければ、「テーブルとして書式設定」がお手軽です。

修正方法 (VBA)

隣のセルの罫線の方が表示優先度が高い場合、罫線の書式を再設定すると、優先度の低かったこちら側のセルの罫線が高い隣側と同じ値に上書きされて、整合性が解消するそうです。ということは、全セルの4辺の罫線を見た目通りに設定しなおせば直る?

Private Sub NormalizeBordersSub(cell As Range, index As XlBordersIndex)
    cell.Borders(index).LineStyle = cell.Borders(index).LineStyle
End Sub
Sub NormalizeBorders()
    For i = 1 To Selection.Count
        NormalizeBordersSub Selection.Item(i), xlEdgeLeft
        NormalizeBordersSub Selection.Item(i), xlEdgeTop
        NormalizeBordersSub Selection.Item(i), xlEdgeBottom
        NormalizeBordersSub Selection.Item(i), xlEdgeRight
    Next
End Sub

手元の Excel 2013では 最初のデータに対して B2:D4 を選択してこのマクロを実行したところ、行の挿入が普通にできるようになりました。cell.Borders(index).LineStyle = cell.Borders(index).LineStyle 、右辺が見た目上の値、左辺が設定する場所。何もしていないようにも見えますけれど、ちゃんと仕事しています(汗)。

他のバージョンでも動くのか、セルの結合など単純でない表でも効果があるのかは未確認です。

HTMLの表と比べてみる

見た目上は1本でも実際は2本あるというのは、HTMLの表と似ています。たとえばこの 3/9 の日記を加工した表、左側のように一本の線で書いています。この表のスタイルを、ブラウザの開発者ツールで border-collapse: separate と書き換えると、右のように2本の線に分かれます。border-collapse: collapse で 1本にまとめるときは、2本の線のどちらかが使われます。

このどちらが使われるかはCSSで決まっています。[血統の森] で公開されている [CSS 2.1仕様(日本語訳) / 17.6.2.1 ボーダーの競合の解決] から、collapse のときに太線優先な見た目と分かります。

Excelも、見た目的に目立つ線が優先的に表示されているようです。点線より実線のほうが優先度が高い、濃い色の方が強い、と。しかしどちらが勝つのか、CSSのようにはまとまっていないのではと。たぶん。

最後に

Excel難しいです(汗)。

罫線が外側からは単純な1本と捉えられる作りにしたところ、ちょっとユーザーが変わったことをしたときに、見えない内部状態によって余計に振り回されるような。せめてVBAからでも内側プロパティーが見られれば良いのに、と思いました。