![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
データが「数値と文字列」の組み合わせのセルにおいて、数値部分だけを取得するには?
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() のような関数などはありませんでしょうか?
どなたか、お詳しい方、教えて下さい。
必ずお返事致します。
No.2ベストアンサー
- 回答日時:
元のデータが数字+(文字)が信頼できるなら、少々手抜きですが
Valが使えますね。
文字を数値に変換する関数です。
先頭から数字変換可能な文字を探して、変換できない文字以降は無視しますので、(文字)部分以降は無視されます。
信頼できるならってのは、先頭から変換できない文字の場合は0を返すこと。
全角数字も変換してしまう事、"&HFF"などの文字を16進数と解釈して変換してしまうこと。
上記に問題がある場合は使用できないって事です。
※例として書かれたデータであれば使用に問題はありませんが。
Val関数、これ、なかなか素晴らしいですね。
(当初、このような関数を探していましたのでドンピシャリで、とても嬉しいです。)
ただ、下の回答の「お礼欄」にも書きましたが、
平均値を求める際、各セルに対し、Val関数を適用するような方法になるのでしょうか?
具体的に、本件の例で平均値を求める方法は、どのような形になりそうでしょうか。
もし、またよろしければ教えて下さい。
No.4
- 回答日時:
別セルに、数値部分と文字列部分を関数にて分割してから
VBAで、処理してはどうでしょうか?
たとえば、B1セルに以下の関数を入力しておきます。
=VALUE(MID(A1,1,FIND("(",A1,1)-1))
C1セルに以下の関数を入力しておきます。
=MID(A1,FIND("(",A1,1),LEN(A1))
上記関数を埋め込み後、VBAでB1を参照した場合、B1には105を処理することに
なると思います。
文字を入力する場合には、”(りんご)”を処理することになると思います。
回答ありがとうございます。
>別セルに、数値部分と文字列部分を関数にて分割してから
いったん、値を別セルに置き、それを足場に、、、という作戦ですね。
確かにそういう考え方もありますね。
ただ、私が作ろうとしているプログラムは、
その足場となるセルを用意できない(ビジュアル的に、そうしたセルを作りにくい)仕様なので、
今回に関しては、この方法はとれないんですよね、、、。
ということで、Valで1つずつ処理し、それをFor~Nextで回しながら処理することにしました。
でも、参考になりました。
また色々と教えて下さい。
No.3
- 回答日時:
文字列から数値化するために列Bを使用した方が良いかも。
VBAで行く決断なさったのなら、Rangeを渡してForEachで有効なセルのみ
判定しながら抽出しながら計算させたほうがスッキリする気がします。
補足をありがとうございます。
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で割って、平均値を出す、
という方法で現在、検討中ですが、
この方法で、いかに完結に書くか、について、悩んでおります。
どう書くのがスマートでしょうね。
もし、何かアイデアなどありましたら、教えて下さい。
宜しくお願い致します。
No.1
- 回答日時:
ワークシート上なら、区切り位置の「その他」で ( を指定するとか。
VBAであれば文字列を配列に分解するSplit関数を使用。
(デフォルトはカンマだが、デリミタを指定できるので)
教えて頂いたsplit関数という関数で、したいことが出来そうです。
ただ、平均値を求める際に、
average = WorksheetFunction.average(Range(A1:A4))
というようなやり方で今、考えているのですが、
この方法と、split関数を使って、問題を解決するには、
どうしたら良いでしょうか?
A1~A4まで、1つずつ、まずsplit関数で、数値にしてから、「A1:A4」の範囲で平均値を出すような感じになるのでしょうか。
VBA初心者であるため、変なことを言っているかもしれません。
なにとぞ、宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) Sub 分けてソートして貼り付ける() Dim srcSheet As Worksheet Dim 6 2023/08/04 19:57
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) エクセルでIF関数中にIFERROR関数を使いたいのですが???? 5 2022/04/08 13:24
- Excel(エクセル) VBAのoffsetの動き方について教えてください 3 2022/11/25 23:36
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1バイト文字の上位4ビット・...
-
データが「数値と文字列」の組...
-
VBAのコマンドボタンの文字列の...
-
記号は半角と全角どちらがよい...
-
文字化け変換方法
-
全角英数文字が嫌われる理由を...
-
複数行の文字列を1行にまとめる...
-
正規表現で特定のHTMLタグのク...
-
エクセルVBA 文字列領域が不足...
-
選択したセルでダブルクリック...
-
文字の入力で横バー上段、中断...
-
ソースコードの1行が長いとき...
-
掲示板で改行されない
-
Excel関数「COUNTIF」で”文字”...
-
VBAでCSVをExcelに取り込む時に...
-
\\nと\\rの違い
-
JAVA System.out.println の ...
-
最終行の改行について
-
○個ずつ改行
-
IT企業の技術屋にとって全角英...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数値をASCII文字にする方法につ...
-
カンマの含まれる文字列の数値...
-
16進数の文字列をアスキーコー...
-
マクロで半角を全角に
-
VC++ マルチバイト文字とUniCod...
-
fgetws関数で読み込んだUNICODE...
-
iPhoneの絵文字をWebサイトに表...
-
16進数の文字列を10進数の数値...
-
外字を削除したい
-
サロゲートペア文字の半角カナ...
-
文字数が決まっていないの文字...
-
絵文字のフォーム入力について
-
マージ型文字列のデリミタ2文...
-
VB6 機種依存文字の変換
-
シフトJIS⇒MIMEエンコード(RFC2...
-
1バイト文字の上位4ビット・...
-
Excel VBAの数値変換
-
SQLインジェクション対策で、エ...
-
c言語 文字 - '1'+26
-
特殊な文字列のデコードについて
おすすめ情報