こんにちは、Ryoです。
VBAで処理を行う中で、文字列となっている数字を「数値」に変換する必要があることも多いのではないでしょうか。この場合Val関数を使うのですが、カンマ(,)や\が含まれている場合は数値として処理されないので、Replace関数などで少し工夫が必要になります。
今回はその内容についてサンプル交えて簡単に書いてみたいと思います。
1.サンプル概要
シート上に簡単な例として書いていますが、画像内Sample1はVal関数のみで変換します。
≪実行前≫
≪実行後≫
Val関数というのは、指定した文字列の先頭から順に「数値として認識できない文字」が見つかるまで取得して「数値に変換」してくれるものです。ここで困ることになるのが、冒頭にも書きましたカンマ(,)になります。
このカンマがある状態から数字の部分をVal関数で変換させようとした場合、Replace関数を使って処理を行えば以下のように変換できます。
また、サンプル内に\100は文字ではなく普通に入力しているので、「通貨」となっていますが変換した結果の通り、「\」は数値と見なさないので「100」と変換されるということを知っておくと良いかと思います。
通貨形式の\100自体をVal関数を使って変換するようなことは無いと思いますが、このように数値判定されないですから、文字列としての”\100″に対しVal関数のみ使っても「100」にはなりません。
この場合、カンマ同様Replace関数を使い¥を除いて処理すれば「100」の数値に変換してくれますが、用途的に変換後も通貨形式にしたいので、更にNumberFormatLocalプロパティを使って数値の「\100」にします。
2.サンプルコード
◆Sample1・・・Val関数
Sub sample1() For i = 3 To 5 Cells(i, 4) = Val(Cells(i, 3)) Next i End Sub
これはサンプル概要内のSample1に使用したコードで、セルC3~C5に対しVal関数で数値変換させてみたものです。
Val(指定文字列)
構文自体は簡単で、指定文字列を指定すればOKです。
注意事項としては上述の通りカンマや\ですが、他には指定文字列内にあるタブや改行は「無視」されるという点ぐらいですね。
◆Sample2・・・Val/Replace関数でカンマを処理する
Sub Sample2() Cells(9, 4) = Val(Replace(Cells(9, 3), ",", "")) End Sub
これはVal関数で処理する上でカンマ(,)を含めた数値はうまく変換出来ないので、文字列からカンマを取り除く為にReplace関数を使っています。
Val(Replace(対象文字列,”指定文字”,”置き換える文字”))
こうすることでReplaceでカンマが除かれ、その文字に対しValで変換し結果としてサンプルのように1,234円が数値の「1234」となります。
変換して計算処理などを行ったあとに改めて表示する時は、Format関数などで表示形式を指定すればセル上にカンマを含めた数値として表示できると思います。
例:Cells(9, 4) = Format(Val(Replace(Cells(9, 3), “,”, “”)), “0,000”)
Replace関数については以前の記事がありますので、よろしければご参照ください。
◆Sample3・・・\を含む文字を\形式の数値に変換する
Sub Sample3() Cells(17, 4) = Val(Replace(Cells(17, 3), "\", "")) Cells(17, 4).NumberFormatLocal = "\#,##0;\-#,##0" End Sub
サンプルコード上では\がバックスラッシュになっていますので、下に書きますと
Cells(17, 4) = Val(Replace(Cells(17, 3), “\”, “”))
Cells(17, 4).NumberFormatLocal = “\#,##0;\-#,##0”
こうなっています。
まずValとReplace関数で文字列となっている\を除き、数値に変換しNumberFormatLocalプロパティで表示形式を\(通貨)にしています。
\形式をFormat関数でも出来るのではないかと思い、いろいろ試してみましたが上手くいかないのでNumberFormatLocalを使うのが確実かと思います。
NumberFormatLocal = 表示形式
表示形式はExcelでよく使う「セルの書式設定」にある表示形式と同様です。
3.まとめ
文字列を数値に変換すること自体はVal関数を使えば簡単なのですが、カンマや\が含まれていると、他の関数やプロパティを利用する必要があるので、その点を重視して書いています。
処理自体は数行で済むレベルですから簡単ですので、直ぐに利用出来ますので知っておいて損はないと思います。機会があればご検討くださいませ。
以上、カンマや¥を含む文字列の数値変換を行う方法についてでした!
今回書きましたValやReplace、NumberFormatLocalは他の記事サンプルコード内で色々使ってますが、改めて利用方法について書いてみると案外長くなりました(笑)
今回の記事が何かの参考になれば幸いです。
Ryo