公式アカウントからの投稿が始まります

データが「数値と文字列」の組み合わせのセルにおいて、数値部分だけを取得するには?

 A

1 105(りんご)
2 110(グレープフルーツ)
3 65(ハッサク)
4 250(パイナップル)

A1~A4のセルには、価格(果物名) が入っています。

このA1~A4の平均値を出すためには、各セルのデータ型が数値でないとマズイようなのですが、
これを、数値として取り出すことは可能でしょうか?

たとえば、
A1のデータは、

105(りんご)

ですが、これを、105 として取り出す、ということがしたいわけです。
(stringである「りんご」の部分は、無視してくれるような仕組み)

Dim string_to_num as long

string_to_num = HogeFunc(Range("A1").Value)    '105(りんご) → 105 と変換

Msgbox string_to_num    '105 と表示される

上記の HogeFunc() のような関数などはありませんでしょうか?

どなたか、お詳しい方、教えて下さい。
必ずお返事致します。

A 回答 (4件)

元のデータが数字+(文字)が信頼できるなら、少々手抜きですが


Valが使えますね。
文字を数値に変換する関数です。
先頭から数字変換可能な文字を探して、変換できない文字以降は無視しますので、(文字)部分以降は無視されます。

信頼できるならってのは、先頭から変換できない文字の場合は0を返すこと。
全角数字も変換してしまう事、"&HFF"などの文字を16進数と解釈して変換してしまうこと。
上記に問題がある場合は使用できないって事です。
※例として書かれたデータであれば使用に問題はありませんが。
    • good
    • 0
この回答へのお礼

Val関数、これ、なかなか素晴らしいですね。
(当初、このような関数を探していましたのでドンピシャリで、とても嬉しいです。)

ただ、下の回答の「お礼欄」にも書きましたが、

平均値を求める際、各セルに対し、Val関数を適用するような方法になるのでしょうか?
具体的に、本件の例で平均値を求める方法は、どのような形になりそうでしょうか。
もし、またよろしければ教えて下さい。

お礼日時:2010/05/05 00:09

別セルに、数値部分と文字列部分を関数にて分割してから


VBAで、処理してはどうでしょうか?

たとえば、B1セルに以下の関数を入力しておきます。
 =VALUE(MID(A1,1,FIND("(",A1,1)-1))
C1セルに以下の関数を入力しておきます。
 =MID(A1,FIND("(",A1,1),LEN(A1))

上記関数を埋め込み後、VBAでB1を参照した場合、B1には105を処理することに
なると思います。
文字を入力する場合には、”(りんご)”を処理することになると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>別セルに、数値部分と文字列部分を関数にて分割してから

いったん、値を別セルに置き、それを足場に、、、という作戦ですね。
確かにそういう考え方もありますね。
ただ、私が作ろうとしているプログラムは、
その足場となるセルを用意できない(ビジュアル的に、そうしたセルを作りにくい)仕様なので、
今回に関しては、この方法はとれないんですよね、、、。
ということで、Valで1つずつ処理し、それをFor~Nextで回しながら処理することにしました。
でも、参考になりました。
また色々と教えて下さい。

お礼日時:2010/05/05 10:34

文字列から数値化するために列Bを使用した方が良いかも。



VBAで行く決断なさったのなら、Rangeを渡してForEachで有効なセルのみ
判定しながら抽出しながら計算させたほうがスッキリする気がします。
    • good
    • 0
この回答へのお礼

補足をありがとうございます。

Val関数で手軽に解決できそうなので、このVal関数を使うことにしたのですが、
その先で、つまずいています。

例えば、A1~A100までの平均を出す場合、

Val(Range("A1").Value) + Val(Range("A2").Value) + Val(Range("A3").Value) + Val(Range("A4").Value) ・・・ Val(Range("A100").Value)

この和をとってから、それを、100で割って、平均値を出す、
という方法で現在、検討中ですが、

この方法で、いかに完結に書くか、について、悩んでおります。
どう書くのがスマートでしょうね。

もし、何かアイデアなどありましたら、教えて下さい。
宜しくお願い致します。

お礼日時:2010/05/05 00:54

ワークシート上なら、区切り位置の「その他」で ( を指定するとか。



VBAであれば文字列を配列に分解するSplit関数を使用。
(デフォルトはカンマだが、デリミタを指定できるので)
    • good
    • 0
この回答へのお礼

教えて頂いたsplit関数という関数で、したいことが出来そうです。

ただ、平均値を求める際に、

average = WorksheetFunction.average(Range(A1:A4))

というようなやり方で今、考えているのですが、
この方法と、split関数を使って、問題を解決するには、
どうしたら良いでしょうか?

A1~A4まで、1つずつ、まずsplit関数で、数値にしてから、「A1:A4」の範囲で平均値を出すような感じになるのでしょうか。

VBA初心者であるため、変なことを言っているかもしれません。
なにとぞ、宜しくお願い致します。

お礼日時:2010/05/04 23:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!