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

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

エクセルで半角数字には数値と文字列がある?

http://okwave.jp/qa/q6473596.html の質問を見て私も納得がいかず質問させていただきます。 たとえば、A1セルの書式を文字列に設定してから半角で数字を打ち込むと数字は数値でなく文字列としてセルに入ります。 この入力後、A1セルの書式を標準や数値に直してもそのセルの中の数字は左に寄ったままで文字列のままでいるようです。 (でもこれをセルの中でエンターキーを押したりすると数値になってしまいますが) 次にB1セルの書式を標準あるいは数値にして数字を打ち込むと、当然のことですが数字は数値としてセルに入ります。 この入力後、B1セルの書式を文字列に変えると数字は左に寄りますから一見文字列になったように見えます。 ところが上記のセルとこのセルをA1=B1で試してみるとFALSEが返ります。 逆に同じ数字を数値として打ち込んだセルと=で試すとTRUEが返ります。 これはA1とB1は同じ文字列としての数字ではないという証拠だと思います。 B1セルの書式を標準に戻すとまた数字は右よりにもどりますから、セルの中の数字は数値のままのようです。 つまり、半角の数字にはセルの書式にかかわらず文字列と数値の二つがあるということなのでしょうか? だとしたらこの二つはどうやって区別すればいいのでしょうか?

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

  • ベストアンサー
  • 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% (7987/21354)
回答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

  • エクセル 文字列で入力した数字を数値にする

    エクセルで、文字列の設定で入力した数字は、[セルの書式設定]で、数値として設定しても、文字列のままになります。 (セルの左上に、文字列と分かる緑の三角が付いたままになり、表を作ってもグラフの表示は出来ません。) 数値として数字を入力をした後、[セルの書式設定]で文字列にして、再び[セルの書式設定]で数値にすると、数値にはなります。 (この場合、文字列にしても、セルの左上に緑の三角が付かず、このまま表を作ると数値(小数点以下が0の場合は小数点以下が削除されます。)の扱いとなりグラフの表示が出来ます。) 文字列で入力した数字は、数値にはならないのでしょうか? よろしくお願いいたします。

  • Excelの「’」とセルの書式設定(文字列)の違い

    こんばんわ。 Excelの文字列表示について、教えてください。 数字を入力する際に、先頭に「'」を入力すると 文字列として入力することが出来ますが、 数字が入っているセルのセルの書式設定から 「文字列」に表示形式を変更することとの 違いはなんなんでしょうか? やり方は違うけれど、結果は同じということでしょうか? 「'」を入力すると、データが文字そのものに変わり、 表示形式を変更すると、見た目だけ(左揃えになるなど) 文字列のように見えるだけで、データは 数字のままということなんでしょうか?? また、文字列として入力された数字を Value関数で数値に変換してしまうのと セルの書式設定で「数値」に変更するというものも 同じように、違いが良く分かりません。。。 もう、頭の中が「??」だらけです。 違いを教えていただけたら・・・と思います。 どうぞよろしくお願いいたします<m(__)m>

  • エクセルのセル内の数字を一発で(または、2発、3発)で半角にする方法

    エクセルで、 パソコン初心者が入力した半角や全角交じりの数字を、 簡単に、列ごと行ごとに半角(全角)数字に揃える方法をご存知の方おられましたら、教えてください。 元々のセルの書式設定は、文字列にしてあります。 (ゼロで始まる数字もあるため。)

  • エクセル2000で文字列から数値を抽出したい。

    エクセル2000で文字列から数値を抽出したい。 ワークシートのA列に下記の文字列が入力されています。 A1セル="123456 日本男子 54,321 7,654,321 12,345" A2セル="234567 東京都子 1,234 2,345 5,321" A3セル="345678 大阪太郎 99 689 9,876" データ間はスペースで区切られています。 後方2番目の数値をB列に取出す方法を教えて下さい。 B1セル=7,654,321 B2セル=2,345 B3セル=689 よろしくお願い致します。

  • Excel 数値を文字列にしたい

    お世話になります。 例えば、型番として  0001  0001A  0001B  0002   ・   ・ というものがあった場合、0001と0002は数値と認識されて1と2に なってしまいます。 この状態で、セルの書式設定で文字列にしたとしても、現状の1が 文字列になるだけです(要するに手遅れ)。 また、頭にシングルクォーテーションをくっつけて'0001や'0002と 入力してやればよいかと思うのですが、上記のようなケースが 数百行あった場合、ひとつずつシングルクォーテーションを くっつけていくには手間がかかります。 何かよい方法はございますでしょうか。 ご教示の程、宜しくお願い致します。

  • EXCELで、数字が文字列扱いになってしまう

    お世話になります。 なぜだか分からないのですが、 EXCELで、数字が文字列扱いになってしまって、 計算してくれません。 「セルの書式設定」で「表示形式」を、数値や標準にしたり、”,"を付けたりしているんですけど、 反応してくれません。 ただし、該当セルの数字をダブルクリックすると、 数字扱いに代わってくれるようです。 いちいち、全てのセルをダブルクリックするのは、 大変ですし、漏れによる誤差が怖いのですが、 何かいい方法はないでしょうか?

  • エクセルで数字の文字列を計算させたくないのですが、うまく出来ません。良い方法はないでしょうか?

    エクセル2003で、下記のようにセルに入力したとします。    A   B   C 1  10   20 2  11  ’21 3  13   14 4 ※B2は「’」をつけて数字の文字列として認識させています。 B4のセルに、=SUM(B1:B3)とすると、うまく34となってくれますが、 C2のセルに、=A1+B2とすると、32となってしまいます。 当方としては、B2を文字と認識してほしいので、求めている答えは11です。 数字の文字列を文字列のまま処理して、計算させない方法はあるでしょうか? 皆様、ご教授願います。

  • セルの書式が標準なのに文字列にできるのはなぜ?

    会社のシステムで吐き出したデータですが セルの書式設定が標準なのに文字列となっています。 マクロを利用して、あるセルの値を別セルへ転記すると、 数字は数値に変換され、先頭の0は消え、桁数が多いと指数表示になってしまいます。 会社のシステムが吐き出したエクセルはセルの書式が標準なのに 中の数字が文字列でいられるのが疑問です。 会社のシステムの吐き出したデータは Microsoft Excel 2.1ワークシートで 全てのセルの書式設定は「標準」です。 で例えば 12345678901234 は 12345678901234 と表示されていて 「数値が文字列として保存されています」 となっています。(先頭に ' は入っていません) 0101という値のセルでも 表示は0101ですが 「数値が文字列として保存されています」 となっています。(先頭に ' は入っていません) それらのセルの値をマクロとかで別セルに転記すると 転記先では1.23457E+13 と表示されてしまいます。 (0101は101になります。) まっさらなエクセルに自分で手入力すると ・セルの書式設定が標準だと 12345678901234 ↓ 1.23457E+13になります。 ・セルの書式設定が数値だと 12345678901234 ↓ 12345678901234 ・セルの書式設定が文字列だと 12345678901234 ↓ 12345678901234 (ただし 数値が文字列と保存されています と注釈有) なのに会社のシステムの吐き出しデータは セルの書式設定が標準なのにもかかわらず 12345678901234 ↓ 12345678901234 (ただし 数値が文字列と保存されています と注釈有) となっています。 手入力で書式設定が標準の状態でセルに12345678901234 と表示させるには先頭に ' をつける方法しか知りませんが ' が無いのに表示されています。 でもこの該当セルをマクロで別セル(書式設定:標準)に転記すると 1.23457E+13 となります。 またシステムが吐き出したエクセルの同じシート内に 以下のマクロで転記すると ↓ Sub 転記() 行 = 2 Do If Cells(行, 6).Value = "" Then Exit Do If Cells(行, 6).Value >= 10 Then Cells(行, 7).Value = Range("A2") Else Cells(行, 7).Value = Range("A3") End If 行 = 行 + 1 Loop End Sub ↓ このマクロだと A列~F列が書式設定が標準なのに文字列として表示されているのですが 転記先のG列が書式設定が標準であっても 12345678901234 (数値が文字列と保存されています と注釈有) と同じ状態のまま転記できます。 新しいBOOKのシート2に 会社の吐き出しデータをシートコピーした後、 (セルの書式設定:標準だが文字列で表示されている) そのBOOKに登録されているマクロで シート2のセルからシート1のセル(書式設定:標準)に転記すると 数字は数値に変換され、先頭の0は消え、桁数が多いと指数表示 となってしまいます。 ちょっと混乱しています。 理屈等教えていただければと思います。お願いします。

  • エクセル セルの表示形式「文字列」だけを抽出したい

    エクセル2007を使用しています。 A列に数字が入力されていますが、そのセルの表示形式は、「標準」「数値」「文字列」とバラバラです。 この「文字列」のセルだけを抽出したいのです。 例えば、関数などを利用して、B列に表示するなど。 よろしくお願いします。

  • Excelで数値が文字列になっています

    Excel2010で「このセルにある数値がテキスト形式か、またはアポストロフィで始まっています」という警告が表示されたりして、計算が出来ません。 打ち直ししたり、「エラーチェックルール」で「文字列形式の数値、、またはアポストロフィで 始まる数値」のチェックを外したりして計算は出来るようになります。 「表示形式を変えてもセルの中の値は変化しません。数値データは数値のまま、文字列データは文字列のままです。」とは本当ですか? 本当ならば、数字の保存形式が文字列データかどうかを確かめる方法はありますか? なお、ISNUMBERという関数ではTRUEと出ます。

専門家に質問してみよう