• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルで半角数字には数値と文字列がある?)

エクセルで半角数字のセル書式による違いとは?

このQ&Aのポイント
  • エクセルで半角数字を入力する際に、セルの書式を文字列に設定すると数字は文字列として入力されます。セルの書式を数値に変えても、数字は左に寄ったまま文字列のままになりますが、セル内でエンターキーを押すと数値になります。一方、セルの書式を標準や数値に設定して数字を入力すると、数字は数値として入力されます。セルの書式を文字列に変えると数字は左に寄りますが、セル間の比較では文字列としては認識されません。つまり、半角数字にはセルの書式によって文字列と数値の二つがあると言えます。
  • エクセルで半角数字を入力する際のセルの書式による違いについて調べました。セルの書式を文字列に設定して半角数字を入力すると、数字は文字列としてセルに入力されます。その後、セルの書式を数値に変えても、数字は左に寄ったまま文字列のままになりますが、セル内でエンターキーを押すと数値に変換されます。一方、セルの書式を標準や数値に設定して数字を入力すると、数字は数値としてセルに入力されます。セルの書式を文字列に変えると数字は左に寄るため、セル間の比較では文字列としては認識されません。半角数字にはセルの書式によって文字列と数値の二つの状態があるようです。
  • エクセルで半角数字を入力する際のセルの書式について調べました。セルの書式を文字列に設定して半角数字を入力すると、数字は文字列としてセルに入力されます。セルの書式を数値に変えても、数字は左に寄ったまま文字列のままになりますが、セル内でエンターキーを押すと数値に変換されます。一方、セルの書式を標準や数値に設定して数字を入力すると、数字は数値としてセルに入力されます。セルの書式を文字列に変えると数字は左に寄りますが、セル間の比較では文字列としては認識されません。半角数字はセルの書式によって文字列と数値の状態が変わるようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

残念ながら、「#6473596」の質問は、どこまで正確に書かれていのか、私には分かりかねます。確かに、「#6473596」について、ある程度の予測は付きますが、その質問の目的は曖昧な部分が残っているように思います。一体、どのような入力をされているのか分かりませんし、解決を目的としない質問は、私には、回答は難しいです。 今回の場合は、簡単に言うと、 [この入力後、A1セルの書式を標準や数値に直してもそのセルの中の数字は左に寄ったままで文字列のままでいるようです。][セルの中でエンターキーを押したりすると数値になってしまいます] エンターキーを押すことを「(データ型の)キャスティング」というのですが、エンターキーを押さないと本来のデータ型に戻らないのです。 =ISTEXT(A1) 文字列なのか数値なのか、これで試してみるとはっきり分かるはずです。 [半角の数字にはセルの書式にかかわらず文字列と数値の二つがあるということなのでしょうか?] 私は、これを、数値として入力された数字と、文字列の数字とは別に、「活性化した数値」と「不活性な数値」というように分けています。例えば、外部データのインポートで、テキストファイルから、区切り位置を使ってインポートしますと、数字が、そのままになってインポート出来ますから、0123 というスタイルも存在してしまいます。 書式が文字列になっていなければ、 A1が文字列認識、B1が数値認識であるなら、  = A1 + B1 この計算も出来ます。(文字列になっているとややこしい現象が現れることがあります) [この二つはどうやって区別すればいいのでしょうか?] 右にあれば数値、左あれば文字列というようになっていればよいのですが、実際、両方とも、右、または左に書式の配置を揃えられていたら分かりません。もちろん、ISTEXT関数でも、ISNUMBER関数でも、判別出来ます。 しかし、作業過程では、このひとつの列の範囲を選択して、再び、区切り位置(ダイアログ)で、「完了」というボタンをクリックするだけで、活性化することが可能です。 他には、空白をコピーし、[形式を選択して貼り付け]で、[加算]を選んで、[OK]と貼り付けても、活性化して、数値に変わるはずです。 これは、おそらく、Microsoft の本来の仕様と、Lotus1-2-3との間の互換性を取るために、このような状態になったのではないかと思っています。だから、明らかに、文字列の数字を入れる時は、書式・文字列を使わずに、「'(アポストロフィ/プレフィックス文字)」を利用することにしています。これも、実際、不活性のままでは、「'」は、文字列としてカウントしてしまいますが、プレフィックス文字として認識すると、文字列ではなく書式記号として働きます。だから、私は、なるべくVBAでは、こちら側を使うことにしています。 VBAでは、区切り位置の代わりに、セル範囲.Value = セル範囲.Value で、数値は活性化します。 p.s.ワークシート上は、あくまでも、何層ものの構造にもなっているわけで、値と表示は別ですが、表示が値に影響を与えることもあり、VBAのように明確に別れて扱えるようではなさそうです。VBAの話は、ここでは割愛させていただきます。

emaxemax
質問者

お礼

> 「活性化した数値」と「不活性な数値」というように分けています。 なるほど、よくわかる表現です。 > 例えば、外部データのインポートで、テキストファイルから、区切り位置を使ってインポートしますと、数字が、そのままになってインポート出来ますから、0123 というスタイルも存在してしまいます。 はい、この質問も出発点はここなんです。 で、そのデータをリストにもってくるとワークシート関数のVLOOKUPでHitせず、Cells(i, "A").Value = Cells(i, "B").ValueでもFALSEになり、困ってしまうわけです。 頭が0からはじまるものももあるので一律に活性化させるわけにもいかず、かといって全部が不活性な数値ならそれなりに対処できますが、手作業でデータを加えるとそこだけは 「活性化した数値」になってしまい混在すると非常に厄介なんで頭を痛めているんです。 すくなくともVBAなら CStr(Cells(i, "A").Value) = CStr(Cells(i, "B").Value) 'TRUEを返す あるいは Cells(i, "A").Text = Cells(i, "B").Text 'TRUEを返す で比較すればいいわけですね? ありがとうございました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#2のお礼: >オブジェクトがどうのという話はよくわかりませんが、 私もわかりません。ただ、データオブジェクト(DataObject)というのは、ExcelのUserFormの中にある、クリップボードのバッファだと思いますが、それ以外にあるのか知りません。 日付値を、2011/1/26 とセルに入れますね。そうすると、数式バーも2011/1/26となっているけれども、中身は、40569 という数字(シリアル値)になっているわけです。数式は、=VALUE(A1) Cell関数で調べても、 =CELL("format",A1) 最初は、Gだったはずなのに、戻り値は、D1 が返ってきます。 つまり、データ型の変換だけではないようですね。これを中間値、つまり、2011/1/26が、数値ではなく、入力した時点の[文字列]に戻すことは出来ません。「データ型のキャスティング」は、エンターキーによって発生するけれども、それは、単に、「データ型のキャスティング」だけではないようです。書式を変更して、なおかつ「データ型のキャスティング」と二重の作業をしているようです。 ところで、#3のお礼側につけられた 「>頭が0からはじまるものももあるので一律に活性化させるわけにもいかず、かといって全部が不活性な数値ならそれなりに対処できますが、手作業でデータを加えるとそこだけは 「活性化した数値」になってしまい混在すると非常に厄介なんで頭を痛めているんです。」 A列のデータは、'01 '02 '05 ……'3 '4 というように、プレフィックス文字が入ってm文字列化しています。これはご質問者さんなら、VBAで加工出来るはずです。 例えば、 A列 B列 C列  D列 01 A  3  数式(以下) 02 B 05 E 06 F 07 G 08 H 09 I 3  C 4  D (並べ替え済み)非常に特殊な例です。 C1; 3  ←数値で入れる(書式-文字列では上手く行かない) =VLOOKUP(C1,A1:B9,2,FALSE) ←これでは上手く行かない =IF(ISERROR(MATCH(TEXT(C1,"#"),A1:A9,0)),VLOOKUP(TEXT(C1,"00"),A1:B9,2,FALSE),VLOOKUP(TEXT(C1,"#"),A1:B9,2,FALSE)) このようにしたらいかがでしょうか?試してみると、MATCH関数を、COUNTIF関数で行っても、上手く行かないようです。検索フィールドは、文字と数値の混在を嫌いますから、どちらかに統一するしかありません。しかし、書式で文字列にすると、数式に対して書式がコピーされて文字列にされてしまいます。ですから、書式の文字列は使えません。 こういう場合は、本当は、コントロールツールのテキストボックスを使ったほうが楽なのかもしれません。 詳しい事情が分かれば、この話は変わるかもしれません。VBAが万能だとは思いませんが、こういう問題を解決する方法は、あると思います。なお、セルに置かれているデータは、安定した状態(エンターキーで変化しない)にしておいたほうがよいと思います。

emaxemax
質問者

お礼

いろいろ教えていただき、ありがとうございました。 これからもまた質問見かけたらよろしくお願いします。

  • FEX2053
  • ベストアンサー率37% (7991/21371)
回答No.2

この問題でややこしいのは、示された質問にも関連するのですが、「Excelのセル上のデータはオブジェクトとして保持されている」ということが原因なんです。 Excelのセル上のデータは、どんなものでも「オブジェクト」として処理されます。で、実際に画面に表示するに当たって、このオブジェクトに指定されている表示方法(式が入っていると式の計算もする)に従って、シート上に表示を行います。オブジェクトとして保持している為に、結果として「計算した後でも表示形式が変えられる」んですね。 同様に、数値データも、数値のオブジェクトとして保持されます。この状態は「文字列としての数値でもあり、バイナリーのデータでもある」中途半端な状態で、このオブジェクトをシート上に表示するとき、セルの表示形式に従って数値にしたり文字列にしたりして表示します。逆に言えば、セルの書式設定を適用する前は、どちらのデータとして保持されているかはっきりしないんですね。 一方、セルの書式設定を適用し計算などをする場面では、文字列と数値は全く違うものとして処理されます。実際、計算を始めると、数値は倍精度2進数として処理されることはExcelでは有名で(だもんで、小数以下の計算に誤差が出るんです)、文字列として処理される場合と全然違う動きをします。逆に言えば、実際に表示したり計算したりする前は、表示されているセル(=データオブジェクト)がどのようなふるまいをするかわからないんです。 VBAなどでプログラムする場合は、オブジェクトのまま処理すると思いがけない動きをしたりするので、セルのデータを明示的に規定した変数などで受けてから計算します。まあ、このあたりはExcelのクセと言えばクセですから、そう言うもんだ、と思って処理するしかないでしょう。 ということで、ご質問の趣旨から言えば「その通り2つの状態が存在し、計算してみないと、どちらのふるまいをするかは厳密には分からない」です。

emaxemax
質問者

お礼

ありがとうございます。 オブジェクトがどうのという話はよくわかりませんが、中の数字のデータについて設問のA1とB1を以下のように比較したら違いがわかりました。 Sub 比較テスト() i = 1 MsgBox Cells(i, "A").Value = Cells(i, "B").Value 'FALSEを返す MsgBox Val(Cells(i, "A").Value) = Val(Cells(i, "B").Value) 'TRUEを返す MsgBox CStr(Cells(i, "A").Value) = CStr(Cells(i, "B").Value) 'TRUEを返す MsgBox Cells(i, "A").Value = Cells(i, "B").Text 'TRUEを返す MsgBox Cells(i, "A").Text = Cells(i, "B").Text 'TRUEを返す End Sub

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

例えばISNUMBER関数を使って調べることもできますね。 C1セルに次の式を入力してD1セルまでオートフィルドラッグすればA1セルやB1セルの状態がわかります。空白の場合には文字列になります。 =IF(ISNUMBER(A1),"数値","文字列")

emaxemax
質問者

お礼

ISNUMBER関数またはISTEXT関数で区別できますね、ありがとうございます。

関連するQ&A