• ベストアンサー

valエクセル 「1000万円」の1000(数字)部分だけ取り出したい3。

たびたび、同じ内容での質問ですみません。 ちょっと前に、 エクセルで、A列に 1000万円 10円 100百万円 とあり、A列の数字部分をB列に取り出したいです。 1000 10 100 という感じにできないでしょうか? という質問に対して、 Val(Cells(1,1)) という回答をいただきました。 確認もしてみて、ちゃんと数字部分だけとりだせたのですが、 桁区切りのカンマがあると、それ以降は数字を拾ってくれないということに気づきました。 1,200円→1となります。 この場合、まずカンマをとってからval関数をつかうのでしょうか? 桁が多くなると面倒くさい気もしますが。。。 すみませんが、よろしくお願いします。 私の確認不足でした。

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

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

こんにちは。Wendy02です。 >「基本的な部分」に関する書籍を探してみようと思います。お勧めがありましたら教えてください。ありがとうございました。 ここら辺りがよいと思います。全部で、三冊です。Mougの大村さんが書いたもので、同Visual Basic シリーズと比較すると、ずっと細かくて、この三冊で、上級まで覚えてほしい、という作者の意気込みが感じられます。基礎編が一番難しい内容が書かれているのに、それを何とか理解させようとした作者の苦心は、逆に読者側が、それを真面目に一字一句理解しようと、途中でめげてしまう人もいます。 オブジェクトの考え方は、それを知らない人が何かというのを会得するのは、最初は無理です。 コツは、一度、ざっと通して読んで、その後、必要な部分をピックアップすると良いです。私の思う方法(ワークシートを忘れる)とは違いますが、ちょうど、ワークシートの数式の配列数式までお済なら、VBAに導入しやすいのではないか、と思います。 かんたんプログラミング Excel2003 VBA 基礎編 (単行本)

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4774119660
noname#66230
質問者

お礼

ありがとうございました。 この本は本屋さんで見た覚えがありますので、 早速、行ってみてみたいと思います。

その他の回答 (5)

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

こんにちは。Wendy02です。 >実際はランダムに近い状態で散らばってます。そうした場合、繰り返して対象を取得することができないと思い、1行で完結するval関数に飛びついてしまいました(今回も。。。)。 楽とか簡単とかいうものがベースにあると、結局は、うまくいきません。もう少し、実際のVBAというものの作り方を、基本的な部分から、積み上げたほうがよいかもしれませんね。とても残念な反応です。 ワークシート関数ではないので、1行で完結なんていう考え方は、VBAでは、なるべく避けたほうがよいです。こちらは、一通りのエラー処理対策を、いくつか考えているのです。初心者の方などは、そういうことを、真っ向から否定したり、以前、私のコードで、「無駄だ」と評した人もいます。 たとえば、入れ子の中で、エラーを起こしたら、分からなくなるからです。VBAは最終的には、プロテクトはしないにしても、エラーフリーを想定して作ります。 それから、ランダムに並んでいるならば、たとえば、SpecialCells で取る方法もあるし、そういうことは、基幹部分を換えるような問題ではありません。 たとえば、Test3 の If VarType(c.Value) = vbString And c.Value Like "#*" Then という意味はなぜか、とかいうのも、考えてほしいです。 VBAは、ワークシートの関数とは、まったく別ものです。同じ考えかたを持ち込んでも旨く行きません。最初は、ワークシートの延長のように考える方がいますが、私は、それは返って、上達を遅らせる原因だというように考えています。前回のコードでお分かりになったかもしれませんが、VBAで、本当に、ワークシート関数を使えるようになるのは、上級コースなのです。 #4 さんの >示形式の設定で、xxx >百万、万、円が同じ列に混在する例など常識的ではないので、どんな実例かなと思う。 それが、もっとも正答です! つまり、エラー処理というのは、もともと、そういうイレギュラーのためにあるのです。

noname#66230
質問者

お礼

>もう少し、実際のVBAというものの作り方を、基本的な部分から、積み上げたほうがよいかもしれませんね。 そうですね。今回は勉強になりました。 自分が参考にしている書籍などは、機能の説明はあっても「基本的な部分」には触れていません。 本当はそういうところから勉強しないといけないのでしょうが、基礎知識がない者には「習うより慣れろ」的に突っ走ってる状態です。 >ワークシート関数ではないので、1行で完結なんていう考え方は、VBAでは、なるべく避けたほうがよいです >VBAは最終的には、プロテクトはしないにしても、エラーフリーを想定して作ります。 >VBAは、ワークシートの関数とは、まったく別ものです。同じ考えかたを持ち込んでも旨く行きません。 といったことは、思ってもみませんでした。2番目はなんとなく思ってましたが全部を把握してないとできないので、通ればいいや、というのが本音ですかね。。。 1番目はまったく逆で、なるべく単純に単純に、というふうに考えていました。だから、また、valを使わせてもらいました。 何はともあれ、一度、「基本的な部分」に関する書籍を探してみようと思います。お勧めがありましたら教えてください。ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

Sub test01() s = Replace(Cells(1, "A"), ",", "") Cells(1, "B") = Val(s) End Sub ----- または縮約して Sub test02() Cells(1, "B") = Val(Replace(Cells(1, "A"), ",", "")) End Sub ーーー 前質問にも、私の回答を少し修正して、Replaceは使えますね。 VALはたまたま文字列を無視して数字部分を数値化してくれるのですが 、前質問は文字列のままの取り出しだったようで、それには また文字列へ戻さないといけない。ただ実用性からすると 数値で取り出すほうがよい。 ーー エクセルからすると、セルの値は数値で、表示形式の設定で、xxx百万 などと見た目にするのが常道。 百万、万、円が同じ列に混在する例など常識的ではないので、どんな実例かなと思う。 ーー それとこういう発展形の質問の場合は、前の質問の番号をかいておいてはどうでしょう。

noname#66230
質問者

お礼

>Cells(1, "B") = Val(Replace(Cells(1, "A"), ",", "")) これを、参考にさせていただきました。ありがとうございました。 >それとこういう発展形の質問の場合は、前の質問の番号をかいておいてはどうでしょう。 今後はそうしたいと思います。すみませんでした。

noname#204879
noname#204879
回答No.3

=VALUE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"円",""),"万",""),"百",""))

noname#66230
質問者

お礼

ありがとうございます。 今後、参考にさせてください。 今回はval関数を使わせていただきました。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

カンマぐらい置き換え機能を使ってまとめてに取り除けばとか思ったりもしたんですが。そんなに面倒ですかね?

noname#66230
質問者

お礼

ありがとうございました。 replaceなどを使えばよいのですね。

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

こんばんは。 前回の#2 のWendy02です。 >確認もしてみて、ちゃんと数字部分だけとりだせたのですが、 >桁区切りのカンマがあると、それ以降は数字を拾ってくれないということに気づきました。 私は、それを想定して書いたのですが、私のコードは試さなかったのですね。 >これは、 > 1,000万円 >でも、1000を導きだします Val関数を使うなら、 Sub Test1() Dim c As Variant Dim buf As String For Each c In Range("A1", Range("A65536").End(xlUp))  buf = Replace(c.Value, ",", "")  c.Offset(, 1).Value = Val(buf) Next c End Sub でよいのですが、Val関数は、プロの世界では、使ってはいけないと言われることもあります。(たぶん、VB4 の世界の話で、今は関係ありませんが) 少し、研究してみてください。以下、二つは、CDble を使っています。 数字と認識されるまで、ループを繰り返す方法 '------------------------------------------- Sub Test2()  Dim c As Range  Dim buf As String  Dim i As Long  For Each c In Range("A1", Range("A65536").End(xlUp))   buf = c.Value   For i = 1 To Len(buf)    If IsNumeric(Mid(buf, 1, i)) = False Then     buf = Mid(buf, 1, i - 1)     Exit For    End If   Next i   If IsNumeric(buf) Then    c.Offset(, 1).Value = CDbl(buf)   Else    c.Offset(, 1).Value = c.Value   End If  Next c End Sub 十~万までと、円が入った場合に、それらをすべて抜く方法 '---------------------------------------- Sub Test3()  Dim buf As Variant  Dim c As Variant  Dim v As Variant  For Each c In Range("A1", Range("A65536").End(xlUp))   If VarType(c.Value) = vbString And c.Value Like "#*" Then    buf = c.Value    For Each v In Array("円", "十", "百", "千", "万")     buf = Replace(buf, v, "")    Next v    buf = CDbl(buf)   Else    buf = c.Value   End If   c.Offset(, 1).Value = buf  Next c End Sub

noname#66230
質問者

お礼

いつもありがとうございます。 ほんとに助かります。 NO.2さんとNO.4さんの考え方はTest1のことをいっていて、 NO.3さんはTest3のことをいっていますよね? 結局、NO.4さんの Cells(1, "B") = Val(Replace(Cells(1, "A"), ",", "")) を使わせていただくことにしました。 >私は、それを想定して書いたのですが、私のコードは試さなかったのですね。 質問では、単純化するためにA列に対象があると書きましたが、 実際はランダムに近い状態で散らばってます。そうした場合、繰り返して対象を取得することができないと思い、1行で完結するval関数に飛びついてしまいました(今回も。。。)。 また、時間に追われていることもあり、簡単ですぐに理解できるほうを参考にさせていただきました。すみませんでした。 今度、時間があるときにゆっくり検証させてください。3例も挙げてくださりありがとうございました。

関連するQ&A