PDFの表をExcelに起こすときの確かめ方。5つの検査で誤りを全部拾えた

2026-09-21AIの使い方

PDFの表をExcelに起こしたあと、32行を1行ずつ原本と見比べるのは現実的ではない。かといって、そのまま使うと桁の落ちた数字が紛れ込む。

読み取った表そのものを機械で検算する。行数、通し番号、増える順、範囲の大小、境目のつながりの5つだ。32行の公式の表で試したら、5つ全部かけて誤りを100%拾えた。

検査1つで拾える誤りの種類。境目が3種類、行数と連番が2種類、増える順と下限上限が1種類

以下の実験は、2026年9月21日に日本年金機構の厚生年金保険料額表のPDFを使って手元で走らせた。表は32行あり、等級と標準報酬月額と報酬月額の範囲が並んでいる。

実際に1か所まちがえた

この記事の前に、同じ表を読み取って別の記事に使った。そのときに間違えた場所がある。

32等級の行だけ、報酬月額の上限に118,950という数字が入っていた。この表の32等級には上限がない。118,950は保険料の列の数字だ。上限の欄が空なので、読み取りが隣の列に流れた。

1等級も似た形になっている。下限の欄がなく、93,000円未満とだけ書かれている。読み取ると下限が空になる。

表の端の行は、他の行と列の構造が違う。この2行だけは毎回見るようにしている。

貼った直後に、数値になっているかを見る

5つの検査をかける前にやることがある。貼り付けた数字が、Excelで数値として認識されているかだ。

文字列のまま入っていると、上の検査が全部素通りする。文字と数値を比べても、大小の判定が意図どおりにならない。

7個の数字を、カンマ付きや全角や空白付きで混ぜて貼ってみた。

数値として入っている数: =SUMPRODUCT(--ISNUMBER($範囲))
文字列として入っている数: =SUMPRODUCT(--ISTEXT($範囲))
前後に空白がある数:     =SUMPRODUCT(--(TRIM($範囲)<>$範囲))
全角が混ざっている数:   =SUMPRODUCT(--(ASC($範囲)<>$範囲))

数値として入っていたのは7個のうち1個だけ。6個が文字列で、前後に空白があるものが2個、全角が混ざっているものが2個あった。

この状態でSUMを取ると122,000になる。数値として入っている1個だけが足された。本当の合計は766,000なので、6倍以上違う。

合計が明らかに小さいので、ここは気づける。逆に言えば、貼った直後にSUMを1回取るだけで分かる。

直すのは作業列でやる。

=IFERROR(VALUE(SUBSTITUTE(ASC(TRIM(A2)),",","")),"")

TRIMで空白を取り、ASCで半角にし、カンマを消してからVALUEで数値に変える。この列の合計は766,000になり、正しい合計と一致した。

IFERRORを付けておくと、数値に変えられないセルが空欄で残る。空欄が出たら、そのセルだけ原本を見る。

5つの検査

検査は表の性質から作る。この表なら5つ取れる。

1つ目は行数だ。元の表が32行なら、読み取った結果も32行でなければならない。原本のページを開いて数える。

2つ目は通し番号。等級のように1から順に振られている列があるなら、連番になっているかを見る。

3つ目は増える順。標準報酬月額のように、上から下へ必ず増える列があれば、逆転していないかを見る。

4つ目は範囲の大小。下限と上限のある表なら、すべての行で下限が上限より小さいことを確かめる。

5つ目は境目のつながり。上の行の上限と、次の行の下限が一致するか。階級に分かれた表では、ここが必ずつながっている。

行数:     =COUNTA($A:$A)-1
連番:     =SUMPRODUCT(--($A$2:$A$33<>ROW($A$2:$A$33)-1))
増える順: =SUMPRODUCT(--($B$2:$B$32>=$B$3:$B$33))
範囲:     =SUMPRODUCT(--($C$2:$C$33>=$D$2:$D$33))
境目:     =SUMPRODUCT(--($D$2:$D$32<>$C$3:$C$33))

どれも0になるのが正常だ。0でない行を探して、原本と見比べる。

私の読み取りでは、4つ目の範囲の検査が32等級の行を捕まえた。下限635,000に対して上限が118,950なので、下限のほうが大きい。

1つの検査では最大3種類しか拾えない

どの検査がどの誤りを拾うのかを測った。正しい表に誤りを1つ入れて、5つの検査にかける。これを種類ごとに200回ずつ繰り返した。

入れた誤りは5種類。行が1行落ちる、数字の桁が1つ落ちる、隣の列の数字を拾う、2行が1行にくっつく、下限と上限が入れ替わる。

5つ全部をかけると、どの誤りも200回とも見つかった。100%だ。

ところが、検査ごとに見ると偏りがある。境目の検査が拾えるのは3種類で、行が落ちる場合と隣の列を拾う場合と入れ替わる場合。行数と連番はそれぞれ2種類で、行が落ちる場合と2行がくっつく場合しか拾えない。増える順は桁が落ちる場合だけ、範囲の大小は入れ替わる場合だけだ。

つまり、1つの検査だけでは最大でも3種類にとどまる。桁が落ちる誤りを拾えるのは増える順の検査だけで、これを省くと59万円が5万9千円になっていても気づかない。

検査は安い。5つとも入れる。

検査が使えない表もある

上の5つは、この表の性質に依存している。通し番号がなければ2つ目は使えないし、階級の表でなければ5つ目も使えない。

売上の一覧のような表だと、使えるのは行数の検査だけになる。そのときは別の手を用意する。

合計の行があるなら、それが最も強い検査になる。読み取った数字を足して、原本の合計と一致するかを見る。1桁の誤りも拾える。

合計がない表なら、自分で合計を計算して原本と照合する。原本のPDFに表示されていなくても、電卓で1列だけ足せばいい。全部の行を見比べるより速い。

どちらも使えないなら、抜き取りで見る。最初の行、最後の行、そして数字がいちばん大きい行の3つを原本と見比べる。端の行は構造が違いやすく、大きい数字は桁の誤りが出やすい。

PDFの表を読み取ってExcelに貼り、5つの検査をかけて、通らない行だけ原本と見比べる

頼むときに書くこと

読み取りを頼むなら、検査ができる形で返させる。

添付のPDFの表を、そのままの列でCSVにしてください。

・列は原本の並びのまま。列を足さない、減らさない
・数字はカンマを付けず、半角で書く
・空欄は空欄のまま返す。前の行の値で埋めない
・読み取れなかったセルは「不明」と書く
・最後に、読み取った行数を書く

3行目が効く。上限のない行や下限のない行を、隣の値で埋められると検査が通ってしまう。空欄は空欄で返させて、こちらで判断する。

5行目の行数も効く。返ってきた行数と原本の行数が違えば、それだけで読み直しになる。

数字にカンマを付けないよう指定するのは、Excelに貼ったときに文字列になるのを避けるためだ。文字列のまま計算すると、検査が全部素通りする。

検査を通ったあとに残るもの

機械で見られるのは、表の形が壊れていないかだけだ。

形が正しくても、数字そのものが間違っていることはある。590,000が580,000になっていても、増える順も境目も通る。桁が落ちる誤りは拾えるが、1桁だけ違う誤りは拾えない。

原本が古い版だった場合も、検査は全部通る。料率や等級は改定されるので、PDFの日付と版を自分で確かめる。

引用を義務づけて原文と照合する方法は長い資料を読ませる記事に書いた。表の場合は文字列の照合が効かないので、数の性質で見る形になる。

踏んだ失敗

読み取った表をそのままVLOOKUPの引き当て先に使ったことがある。32等級の上限が118,950になっていたので、報酬が高い人の等級が引けなくなった。エラーで気づいたからよかったが、近似一致にしていたら間違った等級を返していた。

カンマ付きの数字をそのまま貼ったこともある。見た目は数字だが文字列なので、合計が実際の6分の1になった。0なら気づくが、中途半端な数字が出るほうが危ない。検査より先に、数値として認識されているかを見る。

原本の行数を数えずに始めたこともある。読み取った結果が30行だったが、元が30行なのか32行なのか分からなかった。読み取る前に数える。

複数ページにまたがる表で、2ページ目の見出し行を1行として取り込んだこともある。連番の検査で気づいた。ページをまたぐ表は、見出しが繰り返されていないかを見る。表記のぶれを潰す話は名簿の突き合わせの記事に、金額の検算は経費精算のチェックの記事に書いた。

確認していないこと

どの道具で読み取るとどれだけ正確かは測っていない。上の実験は、正しい表にこちらで誤りを入れて、検査が拾えるかを見たものだ。道具の比較ではない。

画像として貼られた表は扱っていない。文字が取り出せないPDFでは、この方法の前に別の処理が要る。

結合されたセルのある表も試していない。1つのセルが2行分を占める形は、CSVにした時点で構造が変わる。

5種類という誤りの分け方も、私が思いつく範囲のものだ。実際にはもっと多くの壊れ方があるはずで、5つの検査で全部拾えると言っているわけではない。

PDFExcelAIの使い方確認