Excelの隠れ仕様に気を付けろ(XlCVErrorと-2146826281)
-
TAG
渡部直樹 -
UPDATE
2021/07/17
目次
お疲れ様です。渡部です。
梅雨が明けて連日35超えの猛暑になるようで、もーしょうがないですね。
今日はそんな暑い日に涼しくなるRPAとExcelのちょっと怖いお話です。
セルの値を信じるな
数式エラーを読み取った場合
Excelにはいろいろと隠れ仕様があり、今回紹介するのはExcelのXlCVErrorクラスというものです。
たとえば以下のようなExcelシートがあったとします。
この場合、RPAでC1セルを読み込んだ時にどういう値になると思いますか?
答えは「-2146826281」です。
え?どこから出てきたこの数字・・・マイナス21億ちょい
本来は数式エラーなので、空かエラーになってほしいですが、さも意味のある正しい数字のようなものが取れてしまいます。
この数字がそのまま入出金や受発注の金額に使われたら恐ろしいですね。(ひんやりしました?)
XlCVErrorクラスとは
Excelの仕様でセルで数式入力間違いなどで間違った設定をするとセルの「エラー値」がセルに挿入されます。セルのエラー値としては、次に示す XlCVError クラスの定数がエラー内容によって割り当てられています。セルに挿入されるのはエラー番号から2146828288を引いた値となります。
定数 | エラー番号 | セルのエラー値 | 表示出力される値 |
---|---|---|---|
xlErrDiv0 | 2007 | #DIV/0! | -2146826281 |
XlErrNA | 2042 | #N/A | -2146826246 |
xlErrName | 2029 | #NAME? | -2146826259 |
XlErrNull | 2000 | #NULL! | -2146826288 |
XlErrNum | 2036 | #NUM! | -2146826252 |
XlErrRef | 2023 | #REF! | -2146826265 |
XlErrValue | 2015 | #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のこういう裏仕様にも理解をする必要があり、私も現象に突き当たったら調査してノウハウを貯めていくしかないと思います。
この記事が誰かの助けになれば幸いです。
しかし、暑い・・・
最新情報をお届けします!
RPAに関する最新コラムやイベント情報をメールで配信中です。
RPA領域でお仕事されている方に役立つナレッジになりますので、ぜび登録してください!
- November 2024 (2)
- October 2024 (3)
- September 2024 (2)
- August 2024 (4)
- July 2024 (1)
- June 2024 (2)
- May 2024 (3)
- April 2024 (1)
- March 2024 (1)
- February 2024 (1)
- January 2024 (1)
- December 2023 (1)