Excelの隠れ仕様に気を付けろ(XlCVErrorと-2146826281)

お疲れ様です。渡部です。
梅雨が明けて連日35超えの猛暑になるようで、もーしょうがないですね。
今日はそんな暑い日に涼しくなるRPAとExcelのちょっと怖いお話です。

セルの値を信じるな

数式エラーを読み取った場合

Excelにはいろいろと隠れ仕様があり、今回紹介するのはExcelのXlCVErrorクラスというものです。
たとえば以下のようなExcelシートがあったとします。

この場合、RPAでC1セルを読み込んだ時にどういう値になると思いますか?

答えは「-2146826281」です。

え?どこから出てきたこの数字・・・マイナス21億ちょい

本来は数式エラーなので、空かエラーになってほしいですが、さも意味のある正しい数字のようなものが取れてしまいます。
この数字がそのまま入出金や受発注の金額に使われたら恐ろしいですね。(ひんやりしました?)

XlCVErrorクラスとは

Excelの仕様でセルで数式入力間違いなどで間違った設定をするとセルの「エラー値」がセルに挿入されます。セルのエラー値としては、次に示す XlCVError クラスの定数がエラー内容によって割り当てられています。セルに挿入されるのはエラー番号から2146828288を引いた値となります。

定数エラー番号セルのエラー値表示出力される値
xlErrDiv02007#DIV/0!-2146826281
XlErrNA2042#N/A-2146826246
xlErrName2029#NAME?-2146826259
XlErrNull2000#NULL!-2146826288
XlErrNum2036#NUM!-2146826252
XlErrRef2023#REF!-2146826265
XlErrValue2015#VALUE!-2146826273


https://www.relief.jp/docs/excel-vba-xlcverror.html
調べてみると少なくとも14個の定数があるようですね。

RPAでの挙動

UiPathの場合

いつもの「セルを読み込み」アクティビティで実行してみます。値が「-2146826281」であることが確認できました。

ためしに、プロパティで「表示形式を保存」オプションをONにすると、「#DIV/0!」が取れます。

Blue Prismの場合

いつものMS Excel VBOの「Get Cell Value」アクションで実行してみます。こちらもUiPath同様に値が「-2146826281」であることが確認できました。

「Get Cell Value」アクションではなく「Get Formatted Cell Value」アクションで実行すると、「#DIV/0!」が取れます。

XlCVErrorクラスを考慮したRPAの作り方

XlCVErrorクラスの対応でExcelからの転記において間違った値を入力させないようにRPAを作るには複数の方法が考えられます。

変数をint型にする

「表示形式を保存」(UiPath)・「Get Formatted Cell Value」(Blue Prism)で取得する時に出力先をint型の変数にします。「#DIV/0!」という文字列をint型の変数に入れることはできないので、無事エラー停止させることができます。

あとは、各RPAの仕組みでそのエラーをキャッチして、数式エラーがあることを実行者に通知します。
ただ、「#DIV/0!」のようにエラーを取得できないRPAツールも実際にはあり、そのツールでは使えないやり方となります。。。。

マクロで事前チェックする

マクロの機能でそのセルがエラーかどうか判定できるIsError関数というのがあります。

https://www.tipsfound.com/vba/05iserror

マクロでA1セルからシートの有効範囲のセルに対して、IsError関数を当てて、エラーがあったら実行者に「セル〇〇に数式エラーがあります」のメッセージを通知させ、以降の処理を実施しないようにします。個人的にはこの方法をよく使います。一度マクロ作ってしまえば転用が楽なので。

数式でエラーの個数を数える

Excelシートの使っていないセルにエラー個数取得用の数式を入れます。

例)
=SUMPRODUCT(ISERROR(A2:X65536)*1)

数が0でなかった場合、実行者に「数式エラーが〇個あります」のメッセージを通知させ、以降の処理を実施しないようにします。

まとめ

丁寧にRPAを作っていくためには、Excelのこういう裏仕様にも理解をする必要があり、私も現象に突き当たったら調査してノウハウを貯めていくしかないと思います。
この記事が誰かの助けになれば幸いです。

しかし、暑い・・・

もっと知りたい方はこちら


ページトップ