いまさら聞けないExcelの使い方講座

【Excel】AIが作った数式に「--」が入っていたけど、いらなくない? 削除禁止の理由

「--」の使い道を知っておこう

数式にある「--」は何のため?

 以前の記事では、Copilotが生成した数式に含まれる正規表現の読み方に注目しました。以下は生成された数式の1つです。

=--REGEXREPLACE(REGEXEXTRACT(A2,"[0-9]+ *(本|個|袋)"),"[^0-9]","")

 先頭にある「--」は、取り出した文字列を数値として扱うための記述と紹介しましたが、見慣れない人もいるでしょう。この記述は、AIが生成した数式に限らず、Excelに詳しい人が作った数式でも見かけることがあります。

 では、マイナスを2回付けることに、どのような意味があるのでしょうか。今回は「--」の仕組みと、あえて使う理由を紐解いてみます。

「--」を付けると数値に変換できる

 Excelでは数値と文字列を区別します。「"」で囲んだ数値は文字列として扱われます。ここでは、単純な数式で「--」の結果を確認してみましょう。

 例えば、「=12」という数式の結果は数値ですが、「="12"」の結果は文字列です。先頭に「-」を付けて「=-"12"」とした場合の結果は、数値の「-12」になります。Excelが文字列の「12」を数値に変換し、その符号を反転しているためです。

「数式」列(A列)の数式が「結果」列(B列)に表示されている。「="12"」の結果は文字列ですが、「=--"12"」の結果は、数値の「12」になります

 重要なのは「=--"12"」の結果が、数値の「12」になることです。先頭に「--」を追加したことで、符号は元に戻り、数値への変換はそのまま有効になったためです。

 つまり、「--」は特別な関数や独立した演算子ではなく、符号を反転する「-」を2回使い、Excelが自動的に数値へ変換する仕組みを利用した記述です。

 冒頭の数式も同じです。REGEXEXTRACT関数で文字列から数量と単位を取り出し、REGEXREPLACE関数で単位を取り除いています。その結果は、見た目が数値の文字列なので、先頭の「--」で数値に変換しています。

 なお、数値に変換する方法はほかにもあります。これらはいずれも、文字列の「12」を数値の12に変換します。「*1」や「+0」は「--」と同じ目的で使われる書き方です。

="12"*1

="12"+0

=VALUE("12")

 「--」なら、変換したい値や関数の先頭に付けるだけなので、簡潔に記述できます。ただし、数値として解釈できない文字列は変換できません。また、「0012」のような文字列を数値に変換した場合は、先頭の「00」は保持されずに数値の「12」になります。

「--」で「TRUE / FALSE」は「1 / 0」に変換される

 論理値の「TRUE」「FALSE」と「--」を組み合わせると「TRUE」は「1」、「FALSE」は「0」という数値に変換されることを知っておきましょう。

 以下は、セルA2とB2の2つの値が等しいかどうかを判定した結果を数値に変換した例です。

 「=A2=B2」に「--」を付けた「=--(A2=B2)」という数式が入力されているため、値が等しい「TRUE」は「1」、異なる「FALSE」は「0」に変換されています。この動作は「>=」「<=」「<>」といった比較演算子を使った場合も同様です。

 先頭の「=」は数式の開始を表す。「A2=B2」の結果は論理値ですが、「--」によって「1」「0」の数値に変換されます(①)

「--」を使って、変更されたデータを数える

 では「--」の具体的な利用シーンを考えてみましょう。以下の表には、修正前後の商品コードと数量が入力されています。商品コードまたは数量のどちらか一方でも変更された行を数えたいとします。

A列とB列には更新前後の商品コード、C列とD列には更新前後の数量が入力されています。同じ行にあるセル同士を比較して変更件数を求める処理は、COUNTIF関数やCOUNTIFS関数だけではできません

 このような処理は、COUNTIFS関数では直接計算できません。COUNTIFS関数は、指定したセル範囲のデータを検索条件と照合して件数を数える関数です。今回のように同じ行にある別々のセル同士を比較し、変更された行数をまとめて数えることは、COUNTIF関数やCOUNTIFS関数だけではできません。別途、各行の比較結果を求める必要があります。

 そこで利用したいのがSUMPRODUCT関数です。複数の範囲にある数値を同じ位置同士で掛け合わせて、その結果を合計する関数です。例えば、A列に単価、B列に数量が入力されていれば、「=SUMPRODUCT(A2:A10,B2:B10)」で売上金額の合計を求められます。

 また、引数に計算式を指定して、その結果をまとめて合計することもできます。この仕組みを利用すれば、各行の商品コードと数量を比較し、変更された行数を求められそうです。

 修正前後の商品コードが不一致であることを表す数式は「=A2:A10<>B2:B10」、数量では「=C2:C10<>D2:D10」です。この2つの条件を組み合わせると以下のような数式が考えられます。

=(A2:A10<>B2:B10)+(C2:C10<>D2:D10)>0

セルF2に「=(A2:A10<>B2:B10)+(C2:C10<>D2:D10)>0」(②)と入力した結果です。修正前後の商品コードと数量のいずれかが異なっていれば「TRUE」、どちらも同じ(変更なし)なら「FALSE」となります(③)

 2つの比較結果を「+」で加算しているのがポイントです。Excelでは、論理値を加算すると「TRUE」が「1」、「FALSE」が「0」として扱われます。

 どちらか一方だけが変更されていれば、加算結果は「1」、両方とも変更されていれば「2」、どちらも変更されていなければ「0」です。最後の「>0」は、この合計が「0」より大きいかどうかを判定しています。つまり、どちらか一方でも変更があれば「TRUE」、変更がなければ「FALSE」になります。

 実は、この数式をSUMPRODUCT関数の引数に指定しても正しく計算されません。結果は「0」となってしまいます。SUMPRODUCT関数は、引数に含まれる数値以外の要素を「0」として扱います。

セルG2に「=SUMPRODUCT((A2:A10<>B2:B10)+(C2:C10<>D2:D10)>0)」(④)と入力すると、結果は「0」となります(⑤)

 先ほどの結果からわかるように「=(A2:A10<>B2:B10)+(C2:C10<>D2:D10)>0」の結果は論理値です。つまり、「TRUE」「FALSE」が無視された加算結果が「0」となったわけです。

 ここで、SUMPRODUCT関数の引数に「--」を追加します。「TRUE」は数値の「1」、「FALSE」は「0」に変換されるため、SUMPRODUCT関数で変更された行数を正しく合計できます。

=SUMPRODUCT(--((A2:A10<>B2:B10)+(C2:C10<>D2:D10)>0))

セルG2に「=SUMPRODUCT(--((A2:A10<>B2:B10)+(C2:C10<>D2:D10)>0))」(⑥)と入力すると、「--」によって「TRUE」が「1」、「FALSE」が「0」に変換され、変更された行数の「6」が返されます(⑦)

 もちろん、AND関数で商品コードと数量の両方が一致しているかを判定し、COUNTIF関数で「FALSE」の件数を数えても同じ結果を得られます。ただし、この方法では各行に判定用の数式を入力する必要があります。判定結果を目視で確認したい場合には有用でしょう。

 一方、変更された行数だけを知りたいなら、SUMPRODUCT関数と「--」を組み合わせれば、判定用の列を追加せずに1つの数式で集計できます。商品マスターや見積書など、修正前後のデータを比較する際にも応用できるでしょう。

 「--」は単なるマイナスの繰り返しではなく、文字列や論理値を数値に変換するための記述です。AIが生成した数式に限らず、ほかの人が作った数式を読み解く時にも、この仕組みを知っておくと役立ちます。