橋梁点検調書のオートシェイプ座標から評価を読む方法

Excel VBA

セル値ではない評価情報をどう扱うか

Excel帳票の自動処理では、セルの値を読む処理が中心になりやすい。

橋梁名はこのセル、所在地はこのセル、写真番号はこのセル、コメントはこのセル、という形でセル番地を固定すれば、一定範囲の情報は取得できる。

しかし、福島県版の橋梁点検調書では、評価情報の一部がセル値ではなくオートシェイプの配置で表現されていた。

この場合、セルを読んでも評価値は取れない。Excel上では評価表の上に図形が置かれており、その図形がどの位置にあるかによって意味が決まる。

このような帳票では、処理対象をセルからShapeへ広げる必要がある。具体的には、Shapeを走査し、座標を取得し、その座標が評価表上のどの領域に入っているかを判定し、統合マスタの評価項目へ変換する。

この記事では、福島BISTの内部PoCで扱ったオートシェイプ座標解析の考え方を整理する。現時点の実装範囲は、単一橋・3径間サンプルにおける評価情報読取であり、一般配布製品としての多様な帳票対応ではない。

なぜShapeを読む必要があったのか

Excelのオートシェイプは、帳票作成者にとっては見た目を整えるための要素である。一方、橋梁点検調書のような様式では、図形が単なる装飾ではなく、選択された評価を示す記号として使われることがある。

たとえば、評価表の中に丸印やチェックに相当する図形が置かれている場合、その図形の位置が評価値になる。

このとき、Excel上のセルには何も入力されていない。評価は、セルの値ではなく、図形の位置関係として存在している。

そのため、通常のセル読取では次のような問題が起きる。

  • 評価欄のセルを読んでも空欄になる
  • 見た目上は評価済みでもデータとして取得できない
  • 図形の位置を無視すると評価情報が欠落する
  • 後段の一覧化や整合確認に評価値を渡せない

この問題に対して、Shapeの座標を取得し、評価表の構造へマッピングする方法を採った。

処理の基本方針

処理方針は、セル値を読む処理とは少し異なる。

セル値読取では、対象セルがあらかじめ決まっている。対してShape読取では、まずシート上の図形を取得し、それぞれが対象領域に属するかを判定する必要がある。

概念的な流れは次の通りである。

  • 対象シートのShapesコレクションを走査する
  • 各Shapeの中心座標を取得する
  • 評価表として定義した範囲内にあるか判定する
  • X座標から評価区分や損傷規模を判定する
  • Y座標から径間、部材、損傷項目などの行方向の意味を判定する
  • 判定結果を統合マスタの該当列へ格納する
  • 判定不能なShapeはログまたは警告として扱う

ここでのポイントは、Shapeそのものを評価値として保存するのではなく、Shapeの位置から業務上の意味を復元することである。

Shapeの中心座標を使う理由

ShapeにはLeft、Top、Width、Heightがある。これらを使えば、図形の左上座標、サイズ、中心座標を計算できる。

評価欄の判定では、左上座標だけを見るより、中心座標を使う方が扱いやすい。

図形が評価枠内に置かれていても、サイズや微妙な配置によって左上座標が枠外にかかることがある。中心座標を使えば、図形が実質的にどの評価領域に置かれているかを判定しやすい。

考え方を単純化すると、次のような処理になる。

Private Function ShapeCenterX(ByVal shp As Shape) As Double
    ShapeCenterX = shp.Left + shp.Width / 2
End Function

Private Function ShapeCenterY(ByVal shp As Shape) As Double
    ShapeCenterY = shp.Top + shp.Height / 2
End Function

Private Function IsInsideArea(ByVal x As Double, ByVal y As Double, ByVal area As Range) As Boolean
    IsInsideArea = _
        x >= area.Left And _
        x <= area.Left + area.Width And _
        y >= area.Top And _
        y <= area.Top + area.Height
End Function

これは代表的な考え方であり、実際の帳票では評価表の範囲、列方向の区切り、行方向の区切りを別途定義する必要がある。

重要なのは、Shapeの存在を検出するだけでは評価にならないという点である。中心座標が評価表のどの区画に入るかを決めて初めて、データとして扱える。

対象領域の定義が実装の核になる

Shape座標解析では、対象領域の定義が実装の核になる。

評価表全体の範囲、評価列の境界、行方向の意味を定義しないと、座標から意味を復元できない。

たとえば、X方向が評価区分を表し、Y方向が部材や損傷項目を表す場合、X座標の範囲ごとに評価値を割り当て、Y座標の範囲ごとに対象項目を割り当てる。

ここで必要になるのは、次のようなマッピングである。

  • 評価表全体の座標範囲
  • 評価区分ごとの列範囲
  • 損傷項目ごとの行範囲
  • 径間や部材との対応
  • 統合マスタ側の格納列
  • 判定不能時の扱い

このマッピングは、Excelの見た目だけではなく、橋梁点検調書としての読み方を踏まえて定義する必要がある。

セル位置へ変換するか座標のまま判定するか

Shapeの中心座標を取得した後、処理方法は大きく2つある。

1つは、中心座標が乗っているセルを求め、そのセル位置から意味を判定する方法である。

もう1つは、セルへ変換せず、座標範囲そのものを評価領域として判定する方法である。

セルへ変換する方法は理解しやすい。セル番地を基準にできるため、既存のセルマッピングと合わせやすい。一方、結合セルや罫線、微妙な配置の影響を受けることがある。

座標範囲で直接判定する方法は、図形の見た目上の位置に近い判定ができる。一方で、帳票レイアウトが変わった場合には座標定義を見直す必要がある。

福島BISTの内部PoCでは、Shapeの座標を評価表の領域に対応させる考え方を採った。目的は、セルに値が入っていない評価情報を、統合マスタへ格納できる形にすることだった。

例外処理をどう考えるか

Shape座標解析では、判定できない図形が出る可能性がある。

たとえば、次のようなケースである。

  • 評価表の外側にある図形
  • タイトルや注記用の図形
  • サイズや位置が想定外の図形
  • 複数の評価領域にまたがる図形
  • レイアウト変更により対象範囲からずれた図形
  • 帳票作成時の手修正で配置が微妙に変わった図形

このような図形を無理に評価値へ変換すると、誤ったデータを統合マスタへ入れることになる。

そのため、分類できないShapeは、いったん警告やログとして扱う方が安全である。

点検調書の処理では、処理を止めるか、警告として残して後確認するかの判断も重要になる。すべてを自動判定しようとするより、分類できたものだけを格納し、曖昧なものを確認対象として残す設計の方が実務には合いやすい。

統合マスタへの格納

Shape座標から評価値を読み取った後、その結果は統合マスタへ格納する。

ここで必要になるのは、評価値そのものだけではない。どの径間、どの部材、どの損傷項目、どの評価区分に対応するかを保ったまま格納することである。

単に「評価C」と保存しても、後段処理では使いにくい。どの対象に対する評価Cなのかが分からないからである。

そのため、統合マスタ側では、反復構造に対応した列を用意し、Shape座標から復元した意味を該当列へ入れる必要がある。

このとき、Shape読取処理とヘッダー生成規則は分離できない。評価表のどの位置がどの統合マスタ列に入るかは、あらかじめスキーマ側で定義されている必要がある。

技術的に一般化できる部分

Shape座標解析の考え方は、橋梁点検調書に限らず、Excel帳票で図形が意味を持つ場合に応用できる。

一般化できるのは、次の部分である。

  • Shapeを走査する
  • 中心座標を取得する
  • 対象領域に含まれるか判定する
  • 座標範囲を業務上の意味へ変換する
  • 判定不能な図形をログへ退避する
  • 結果を構造化データへ格納する

一方で、評価表の意味、行列の対応、対象外や未評価の扱いは帳票ごとに異なる。ここは流用できない。

つまり、汎用化できるのは座標解析の枠組みであり、帳票固有のマッピングは別途定義する必要がある。

実装済みと未実装の境界

今回確認したのは、福島県版橋梁点検調書の単一橋・3径間サンプルにおける、オートシェイプ座標からの評価情報読取である。

複数橋、別年度、別様式、レイアウト差分を含む汎用的なShape読取エンジンとして完成しているわけではない。

また、読み取った評価情報を使った評価結果一覧生成、差分抽出、整合確認、帳票再出力は現時点では未実装である。

この記事で扱っているのは、セル値では取れない評価情報を、Shape座標から統合マスタへ取り込むための技術的な考え方である。

位置ずれを許容する設計が必要になる

Shape座標を使う場合、帳票上の図形が常に理想的な位置に置かれているとは限らない。

人間がExcel上で調整した図形は、見た目には同じ評価欄に置かれていても、座標値としては少しずれていることがある。印刷範囲、拡大縮小、列幅、行高、結合セル、コピー時の微小なずれも影響する。

そのため、判定領域を厳密にしすぎると、本来読み取るべきShapeを分類不能にしてしまう。逆に、領域を広くしすぎると、隣接する評価欄のShapeを誤判定する危険がある。

実務的には、対象領域を定義したうえで、境界付近のShapeを警告に回す設計が考えられる。完全にどれかへ寄せるのではなく、分類に迷うものを確認対象として残す方が、評価情報を扱う処理としては安全である。

この点でも、Shape解析は単なる座標計算ではない。座標誤差、帳票レイアウト、実務上の評価単位、確認フローを含めた設計になる。

まとめ

オートシェイプで表現された評価情報は、セル値読取では取得できない。

そのため、Shapeを走査し、中心座標を取得し、評価表の領域へマッピングし、統合マスタへ格納する処理が必要になる。

ただし、座標を読むこと自体よりも重要なのは、その座標が帳票上で何を意味するのかを定義することである。ここには、Excelのオブジェクト構造だけでなく、橋梁点検調書としての読み方が必要になる。

福島BISTの内部PoCでは、この考え方により、セルに存在しない評価情報を構造化データとして扱う道筋を確認した。今後別様式へ展開する場合も、Shape座標解析の枠組みは再利用できるが、評価表の意味付けとマッピングは帳票ごとに確認する必要がある。