このエラーを説明して修正を提案してください


セルに入力した数式が、エラーになっているとき、そのエラーの理由を説明し、修正方法を提示してくれる機能です。

この機能は、ブックの自動保存がオンになっていないと使えません。自動保存に関しては、下記のページをご覧ください。

Excelで使えるAI機能

VLOOKUP関数のエラー

まずは、超あるあるなエラーから。

エラーの原因は「VLOOKUP関数で調べている検索値(ここでは"104")が、セル範囲D2:D4の中に存在しない」からです。エラーになっているセルを選択して「このエラーを説明して修正を提案してください」を実行します。もし、スピった結果の一部がエラーだった場合は、数式を入力したセルではなく、エラーになっているセルを選択してください。

結果は、Excel画面の右に表示されるサイドペインに出てきます。

この式の #N/A エラーの原因は、VLOOKUP の検索値(B3)が範囲 $D$2:$E$4 の1列目(D列)に存在しないためです。
現在、B3 には「#N/A」が表示されていますが、B3 の式は =VLOOKUP(A3,$D$2:$E$4,2,FALSE) です。
ご質問の式 =VLOOKUP(B3,$D$2:$E$4,2,FALSE) では、B3 の値(#N/A)を D列で検索しようとしていますが、該当する値がないため #N/A になります。

修正方法
検索値を「A3」に変更してください。
正しい式は次の通りです。
=VLOOKUP(A3,$D$2:$E$4,2,FALSE)

この式なら、A3 の値(104)を D列で検索し、該当する名前があれば返します。
ただし、A3(104)は D2:D4 に存在しないため、この場合も #N/A になります。
A3 の値が D列に存在する値(101, 102, 103)であれば、正しく名前が返ります。

まとめ
検索値はB3ではなくA3にする
それでもA3の値がD列にない場合は #N/A になるので、値を確認してください
もし #N/A を非表示にしたい場合は、IFERROR を使って次のようにできます。

=IFERROR(VLOOKUP(A3,$D$2:$E$4,2,FALSE),"")

エラーの理由については正しいのですが、修正方法はちょっと疑問です。

修正方法
検索値を「A3」に変更してください。
正しい式は次の通りです。
=VLOOKUP(A3,$D$2:$E$4,2,FALSE)

最初読んだとき、うん?ってなりました。こいつは何を言っているだと。これ要するに「A3の値"104"は存在しないので、A3に存在する値を入力してください」ってことですかね。まぁ、それも確かに修正っちゃ修正ですか。検索値の入力間違いじゃね?ってのが第一候補に出てくるんだ。「まとめ」の指摘もちょっと意味不明ですが、IFERROR関数を使って"エラーにしない"方法も教えてくれます。今回は、Copilotアイコンから実行できる「このエラーを説明して修正を提案してください」機能の検証なので、自動的に提示される回答に注目します。本当を言えば、Copilotに直接プロンプトを与えれば、欲しい結果が得られやすいかも。

確かに「エラーにしない」のと「エラーを表示しない」のは、意味が違いますしね。

じゃ、次のエラー。

「検索値(A列)が数値なのに、セル範囲D2:D4が文字列」のパターンです。

この式
=VLOOKUP(A2:A5,D2:E4,2,FALSE)
は、A2:A5 の各値を D2:E4 の範囲で検索し、2列目(名前)を返そうとしています。しかし、A3(104)やA2(102)など、D2:D4 に存在しない値を検索すると #N/A エラーになります

IFERROR関数を使わずにエラーを非表示にする方法としては、IF と ISNA を組み合わせる方法があります。例えば、A2セル用に個別に書く場合は次のようになります。

=IF(ISNA(VLOOKUP(A2,D2:E4,2,FALSE)),"",VLOOKUP(A2,D2:E4,2,FALSE))
この式は、検索結果が #N/A なら空白("")を返し、見つかった場合のみ値を返します。

範囲(A2:A5)に一括で適用したい場合は、スピル(動的配列)を使って次のようにします。

=IF(ISNA(VLOOKUP(A2:A5,D2:E4,2,FALSE)),"",VLOOKUP(A2:A5,D2:E4,2,FALSE))
この方法で #N/A エラーを非表示にできます。

ん?そういうことじゃないんだよね。存在しない"104"があるから、そう判断したのかな。1つの数式だけでやってみます。

#N/A エラーは、VLOOKUP で検索値(A2の「102」)が検索範囲(D2:D4)に存在しない場合に発生します。
D2:D4 には「101」「102」「103」がありますが、実際には「102」はD3に存在します。しかし、A2の値が数値(102)、D列の値が文字列("102")となっているため、型が一致せず一致しません

修正方法: A2の値を文字列に変換して検索するか、D列の値を数値に変換して一致させます

提案する式(A2を文字列に変換):
=VLOOKUP(TEXT(A2,"@"),D2:E4,2,FALSE)

または、D列を数値に変換する場合:
=VLOOKUP(A2,VALUE(D2:D4),2,FALSE)

どちらかで型を揃えることで #N/A エラーを回避できます。

今度は、エラーの説明に型を述べています。でも、試すまでもありませんが、修正方法の2つめ「=VLOOKUP(A2,VALUE(D2:D4),2,FALSE)」は間違っています。実際に入力するとエラーになります。

このエラーについても調べてみましょう。

この式の #REF! エラーの原因は、VLOOKUP の第2引数(検索範囲)に VALUE(D2:D4) を使っているためです。VALUE 関数は複数セル範囲には使えず、VLOOKUP の検索範囲には2列以上の範囲が必要です。

修正方法:
D2:E4 の2列範囲をそのまま指定してください。

修正版の式:
=VLOOKUP(A2, D2:E4, 2, FALSE)

この式で #REF! エラーは解消されます。

「#REF!」エラーは解消されますが「#N/A」エラーになりますよw それに「VALUE 関数は複数セル範囲には使えず」って、使えますよ。スピります。そうじゃなくて、VLOOKUP関数の検索範囲に「VALUE(D2:D4)」と、1列しか指定していないのに(ちなみに、それ自体は間違っていない)、第3引数の列位置に"2"を指定しているのがエラーの理由です。「=VLOOKUP(A2,VALUE(D2:D4),1,FALSE)」とすれば、正しく"102"が返ります。意味ないけど。そもそもあなた、自分で言ってるじゃないですか「VLOOKUP の検索範囲には2列以上の範囲が必要です」って。それなのに、エラーになる修正候補を提示してくるなんて。これが"ポチョムキン理解"ですかね。

もうひとつ、VLOOKUP関数あるあるのパターン。

#N/A エラーの原因は、検索値 "2025/8/1" のデータ型(日付の形式)が、検索範囲 D2:D4 の値(シリアル値 45870 など)と一致していないためです。
VLOOKUP で日付を検索する場合、検索値もシリアル値にする必要があります

修正方法の例:
=VLOOKUP(D2, D2:E4, 2, FALSE)

または、検索値を日付のシリアル値で指定します:
=VLOOKUP(45870, D2:E4, 2, FALSE)

どちらかの方法で #N/A エラーを回避できます。

うん、行ってることは正解。VLOOKUP関数は「"2025/8/1"」という文字列と「2025/8/1」という日付(シリアル値)を区別します。エラーの原因は正しいのですが、修正方法の例が、いただけません。「=VLOOKUP(D2, D2:E4, 2, FALSE)」ってw そりゃ、セルD2をセル範囲D2:D4で探せば間違いないですって。でも、そんなの意味ないっしょw 「=VLOOKUP(45870, D2:E4, 2, FALSE)」もなぁ、そういうこっちゃないんだよね。毎回シリアル値調べろってか。ここは、せめてDATEVALUE関数くらい提案して欲しかったな。"データ型が違う"という同じ意味なんだけど、次のケースではどうだろう。

#N/A エラーの原因は、VLOOKUP の検索値と検索範囲の値の形式が一致していないためです。
A2の値は「2025/8/1(金)」ですが、式で TEXT(A2,"yyyy/m/d") により「2025/8/1」となります。一方、D2:D4の値は日付シリアル値(例: 45870)です。

修正方法の提案:
検索値と検索範囲の形式を揃える必要があります。例えば、D2:D4も同じ書式でテキスト化して検索する方法です。

修正例:
=VLOOKUP(TEXT(A2,"yyyy/m/d"),TEXT(D2:D4,"yyyy/m/d"),E2:E4,0)

この式は、D2:D4を「yyyy/m/d」形式のテキストに変換し、A2のテキストと一致させて検索します。

セルに日付を入力すると、セルの中にはシリアル値が入力されます。対して、TEXT関数の変換結果は文字列形式です。VLOOKUP関数は、シリアル値の中で文字列を検索することはできません。って言って欲しいな。さらに、修正例を見て驚き二度見しました。「=VLOOKUP(TEXT(A2,"yyyy/m/d"),TEXT(D2:D4,"yyyy/m/d"),E2:E4,0)」ってエラーでしょ。この書き方はXLOOKUP関数ですw 第4引数に「0」を指定しているのも謎ですね。もしこの修正例がVLOOKUP関数を使いたいのだとすれば、「0」は"FALSE"の意味になり完全一致で検索します。対して、もしXLOOKUP関数を候補としているのなら、この「0」は「XLOOKUP関数がエラーになった(検索値が見つからない)ら、"0"を返す」という意味です。どっちにしろ、修正例としては役に立ちません。

ここまでで結論を出すのは早計ですけど、ちょっと、いろいろ問題ありますね。

  • エラーの理由については、だいたい合ってるけど分かりにくい
  • 修正候補の数式は、間違っていることが多い

って感じかな。

単純な間違い

別のパターンも試してみましょう。

B列から"佐倉"を探して該当するA列を表引きしたい数式です。検索する"佐倉"はセルD2に入力してあります。エラーの原因は、MATCH関数に指定した引数の順番が違うことです。MATCH関数は「MATCH(検査値,検査範囲,照合の種類)」と指定しますが、間違えて「MATCH(検査範囲,検査値,照合の種類)」になっています。これ、よくあります。使用頻度の高いSUMIF関数が「SUMIF(範囲,検索条件,合計範囲)」のように検索値を2番目に書くので、それと混同するのかも。さて、AIの解説を見てみましょう。

ご質問の式
=INDEX(A2:A5,MATCH(B2:B5,D2,0))
は、MATCH関数に複数行(B2:B5)を渡しているため、正しく動作しません。MATCHの第1引数は通常1つの値(例: B2)である必要があります。

#N/Aエラーの主な原因:
MATCH関数の第1引数に配列(B2:B5)を渡しているため、D2("佐倉")と一致する値が見つからずエラーになります。

修正方法
「D2("佐倉")」に一致する「名前」がB2:B5にある行の「数値」(A列)を取得したい場合、次のように修正します。
=INDEX(A2:A5,MATCH(D2,B2:B5,0))
この式は、D2の値("佐倉")がB2:B5のどこにあるかを探し、その位置のA列の値(数値)を返します。

補足
D2がB2:B5に存在しない場合は#N/Aになります。エラーを回避したい場合はIFERRORを使ってください。
=IFERROR(INDEX(A2:A5,MATCH(D2,B2:B5,0)),"")
このように修正してください。

これは、いいですね。私が意図した間違いは「引数の順番が違う」という点でしたけど、でも「本来は1つのセルを指定するところ(第1引数)に複数行を指定している」という指摘の方が、より客観的ですね。私の意図よりも、状況から判断した結果です。もうひとつ、よく間違える引数の順番です。

RANK関数は、数値の順位を求める関数です。引数は「RANK(数値,参照,順序)」と、第1引数が「順位を調べたい数値」で、第2引数が「順位を調べたい数値などが入力されている範囲」です。上図は、引数の順番が違っています。さて結果は。

ご質問の式 =RANK($A$2:$A$5,A2) は、ExcelのRANK関数の引数の順序が誤っています
RANK関数の正しい構文は次の通りです。
RANK(number, ref, [order])

つまり、最初の引数は「順位を求めたい数値」、2番目が「参照範囲」です
現在の式では、範囲が先に来ているため #N/A エラーが発生しています。

修正例(A2の順位を求める場合):
=RANK(A2, $A$2:$A$5)

この式をB2セルに入力し、B3~B5にもコピーすれば、各行の「数値」列の順位が表示されます。

100点ですね。ここまで説明されれば、ビギナーでも理解できるでしょう。では最後に、引数関係で、ちょっと難しい数式です。

数式に意味はありませんし、そもそも考え方が間違っています。そうじゃなくて、このエラーの根本的な理由は「MAP関数は、LAMBDA関数に1つの値しか渡さないのに、受け取るLAMBDA関数が、a, bと2つの引数を受け取ろうとしている」ことです。

ご質問の式
=MAP(A2:A5,LAMBDA(a,b,a+b))
は、MAP関数に渡す配列が1つなのに、LAMBDAの引数が2つ(a, b)になっているため、#VALUE! エラーが発生しています。

修正方法:
配列が1つの場合、LAMBDAの引数も1つにしてください。

修正版(A2:A5の値をそのまま返す例):
=MAP(A2:A5, LAMBDA(a, a))
もし2つの配列を加算したい場合は、2つ目の配列(例:B2:B5)を用意し、次のようにします。

=MAP(A2:A5, B2:B5, LAMBDA(a, b, a + b))
このように、配列の数とLAMBDAの引数の数を一致させる必要があります。

素晴らしい。的確です。感心したのは、修正候補の2つめです。「LAMBDA関数の引数が多い」という点に注目するのなら、LAMBDA関数を修正しますが、2つめの修正候補は「LAMBDA関数は正しい、MAP関数の方が間違っている」という視点ですね。余談ですが、このようにMAP関数に複数の範囲を指定するやり方は超レアです。MAP関数の解説でも、あまり見かけません。

エラーの原因が別のエラー

数式がエラーになっている原因が、別のエラーだというパターンを検証してみましょう。

SUM関数で合計を計算していますが、数値が入力されている(べき)範囲内にエラーが含まれています。対処法はAGGREGATE関数なんですけど、はたして結果はいかに。

式 =SUM(A2:A5) で #DIV/0! エラーが発生する理由は、範囲 A2:A5 の中に #DIV/0! エラー(A4セル)が含まれているためです。
SUM 関数は、db、エラーを返します。

修正方法:エラー値を無視して合計を計算するには、SUM と IFERROR を組み合わせます。
=SUM(IFERROR(A2:A5, 0))

この式は、A2:A5 の各値がエラーの場合は 0 とみなし、合計を計算します。
Enter キーだけで配列数式として動作します。

これも的確ですね。修正候補としてIFERROR関数を提示してきましたか。まぁ、確かにその手もありますけど、じゃ、次のケースだったら?

これ、IFERROR関数でエラーを"0"としたら、結果が異なりますよ。欲しい結果は"10"です。

A2:A5 の範囲に #DIV/0! などのエラー値が含まれている場合、MIN 関数は計算できず #DIV/0! エラーになります。
エラー値を除外して最小値を求めるには、IFERROR を使ってエラーを空白に置き換えます

修正版:
=MIN(IFERROR(A2:A5, ""))

この式は、A2:A5 のエラー値を無視して最小値を返します。
Enter キーだけで配列数式として動作します。

なるほど、その手があったか(ちくしょう)。ちなみに、こういう「エラーを除いて計算したい」ってときには、AGGREGATE関数が万能なんでが、どうもAIは、新しい関数の提示を避ける傾向を見受けます。もちろん、古いバージョンのExcelでは、新しい関数を使えませんから、古くからある誰でも使える関数を提示することは理にかなっています。ちなみにAGGREGATE関数は、Excel 2010で追加された関数ですから、Excel 2007以前のバージョンでは使えません。

では、ちょっと違うパターンを試してみます。まずは正常に機能する状態を、ご覧ください。

このとき、C列とD列を削除するとエラーになります。

#REF!というのは"参照できない"という意味のエラーです。うっかり、どこかのセル範囲を削除した結果、何かの数式がそのセル範囲を参照していたのでエラーになると。これ、実務で起こりがちです。こうしたケースでは、もともと数式内に書かれていたアドレス部分が#REF!に変更されてしまいますので、複数のセル範囲を削除したとき、どこの削除が原因だったのかが分かりにくいです。さて、どういう説明が提示されるのでしょう。何となく想像はつきますがw

この式の #REF! エラーは、VLOOKUP 関数の検索範囲(第2引数)が無効または削除されているために発生しています。
正しい範囲を指定する必要があります。

たとえば、「Sheet1 (2)」シートの D2:E4 に「コード」と「名前」の対応表があるので、次のように修正できます。

=VLOOKUP(A2,'Sheet1 (2)'!D2:E4,2,FALSE)
このように、#REF! の部分を正しい範囲(例: 'Sheet1 (2)'!D2:E4)に置き換えてください。

いや、ちょっと驚きました。確かに、今使っているブックの「Sheet1 (2)」にはリストが存在します。

これ、別の検証で使ったやつです。AIは、今回エラーになった数式を正常に機能させるために、ブック内の全シートを調べたってことですね。そして、使えそうなリストを提示したと。じゃ、「Sheet1 (2)」のリストも削除しちゃいましょう。

この式の #REF! エラーは、第2引数(検索範囲)が無効または削除されているため発生しています。
「コード」と「名前」の対応表(例: Sheet1!A1:B5)を正しく指定することで修正できます。

修正版の式例:
=VLOOKUP(A2,Sheet1!A1:B5,2,FALSE)
このように、#REF! の部分を「Sheet1!A1:B5」など正しい範囲に置き換えてください。

実際には「Sheet1!A1:B5」にリストは存在しません。こうしたら機能しますよ、と提示してくれるのは助かりますが、どこを削除したのかを覚えていないと詰みますね。同じように「うっかり削除しちゃった」ケースが、名前定義だったらどうなるでしょう。

ここで、名前定義を削除します。

この式の #NAME? エラーは、「リスト」という名前が定義されていないため発生しています。
「リスト」部分を実際の範囲(例: C2:D4)に置き換えることで修正できます。

修正版の式例(Sheet5 (3) の C2:D4 を参照):
=VLOOKUP(A2,C2:D4,2,FALSE)

このように、存在しない名前ではなく、正しい範囲を指定してください。

さっき、ブック内の全シートをチェックしたのですから、アクティブシート内に使えそうなデータがあったら提示してくれますよね。じゃ、もうちょっと複雑にします。もう一度、セル範囲C2:D4に"リスト"と名前定義します。その後「C列とD列を削除」します。すると名前定義の方がエラーになります。

この式の #REF! エラーは、「リスト」という名前の範囲やテーブルが定義されていないため発生しています。
修正方法は、「リスト」の部分を実際の範囲(例: Sheet1!D2:E4)に置き換えることです。

修正版の例:
=VLOOKUP(A2,Sheet1!D2:E4,2,FALSE)

このように、正しい範囲を指定してください。

なるほど。消えてしまった(エラーになった)アドレスを復活させたり、ヒントを与えることは不可能ですから、せめて代替えのセル範囲を提示してくれるのですね。シート数が少ない、シンプルなブックでしたら復活できるかもしれません。大規模なブックで、どこかのセル範囲や名前定義などを削除するときは、くれぐれもご注意を。


試してみた感想です。なぜエラーになったのかの「理由」に関しては、ときどき的外れな指摘をしますけど、概ね正しいことを教えてくれます。そして、どうしたらいいかの「修正」は、当たり前ですけど、ユーザーが何を望んでいるかまでは、理解してくれないです。エラーにしたくないのか、エラーを表示したくないのか、などなど。そして、修正候補として提示される数式は、けっこう間違えます。とはいえ、それはCopilotが使えない、ということではありません。「このエラーを説明して修正を提案してください」は、あくまで"ワンアクションでやってくれる"お手軽機能です。自分でプロンプトを書いて、自分がどんな回答を望むのかを、適切に指示すれば、より満足のいく回答を得られるでしょう。今回の機能に限らず、AIを有効活用するには、何よりも"適切なプロンプト"を記述する日本語能力Excelの理解が要求されますね。