エラー値の不思議

ワークシート関数を使っていると、打ち間違いでエラー値が返ってくることがあります。
エラー値には、#####、#VALUE!、#NAME?、#DIV/0!、#N/A、
#REF!、#NUM!、#NULL! の8種類があります。
あるとき、そのエラー値をコピーして、値貼り付けをしたところから疑問が始まりました。

1.値貼り付けをすると、表示している文字が貼り付けられるが・・。

左のワークシート関数では、VLOOKUP関数で検索条件を設定するA7のセルが空欄であるため、A8に #N/Aエラー が表示されています。
これをコピーして、A10に 値貼り付けをしました。
  文字列あつかいなので、当然、バックスペースなどで編集ができます。 
  ところが、B10に「文字」という文字列を入力して、C10にA10とB10の文字列をつないだものを表示させようとすると、『#N/A文字』とならずに、単に #N/A となってしまいます。

A11とB11の文字列をつないだものは、『ある文字』となっています。 
  この原因をさぐるために、A13に#N/Aを値貼り付けしたあと、C13でISERROR関数を使って調べてみました。
すると、おもしろいことに『#N/A』をエラーメッセージだと認識しています。
比較として、A14の内容を調べてみると、エラーではないと返ってきています。 


つまり、エラー値は、文字列そのものがエラーとしての働きをする特殊な文字列だということになります。

2.VBAで扱ってみる。

今度は、VBAで扱ってみることにします。
A18の『#N/A』が値貼り付けされた文字であることから、変数aを文字列で宣言しました。

(ア)でA8を変数aに代入しようとすると、エラーになりました。
これは、VLOOKUP関数がエラーを起こしているので、当然と言えば当然ですね。

ところが、(イ)の値貼り付けした『#N/A』でも同じようにエラーになってしまいます。
やっぱり、エラー値は特殊な文字列として扱っているようです。

(ア)
(イ)
 
 

3.エラー値を、変数に格納する。

上では、String型にエラー値を格納しようとしましたが、うまくいきませんでした。
しかし、Variant型なら、格納できるようです。

  Sub a3()

  Dim a As Variant

  a = Cells(10, 1) ← ここで格納

  Debug.Print a ← イミディエイトウィンドウなら表示できる。

End Sub
  Sub a4()

  Dim a As Variant

  a = Cells(10, 1) ← ここで格納

  MsgBox a ← メッセージボックスだとエラーになる。

End Sub