エクセルVBAのデータ型変換関数で、Str関数とCStr関数の使い方とその違いについて説明します。
それは戻り値に違いがあります。
使い方の違いでその後のコードの進行に影響が出ることがあり、なおざりにできません。
こんにちは、じゅんぱ店長(@junpa33)です。
今回は、文字列操作に関連してVBA関数の「Str関数とCStr関数」の使い方についてです。
コンテンツ
Str関数とCStr関数の知っておくべき違いと使い方
Str関数とCStr関数は、数値を文字列型(String)に変換するために利用する関数となります。
「数値を文字列で表示する必要がそんなにある?」
答えは「エクセルを利用する業務内容で様々な状況だ出てきます。」ということです。
例えば数値を文字列型にしないといけない時とは
例えば自身のエクセル利用環境の中でお話すると・・・
第一義的には、エクセルの仕様上の都合によってです。
雑誌書籍の数値データの桁数は、
- 書籍コード(ISBN)13桁
- 雑誌の場合は18桁
を扱うことになります。
これらの数値データは文字列型の扱で行うことになります。
そしてさらに、この大きな桁の数値の中には「商品固有識別番号」や「価格データ」が含まれています。
これらのデータを取り出すときにも、この数値を文字列の扱いとする必要が出てきます。
ちなみに、
セルの表示桁数の限界と表示(数値と文字列)の四則(足し算)の関係はこのような感じです。
- 16桁以上の数値は計算することは出来ません。
- 文字列で表示していても、エクセルが自動で判断し計算をしてしまいます。③+④(数値と文字列)、④+⑤(文字列と文字列)は計算されます。
- ⑦の文字列表示した先頭半角スペースの数値文字列も、スペースをないこととして計算してしまいます。④+⑦
では、どういうことになるかというと、
実務エクセル的には、加工したいデータを変数化します。
ある処理では文字列型に変換して、文字列としての処理を行います。
またほかの処理では、その数値を、数値データとして四則計算などを行います。
その場合の、その数値のデータ型は敢えて数値型に変換しなくとも、
エクセルが自動的に「この数値のこの文字列は、数値型として計算できる。」
と判断して四則計算してくれるということです。
Str関数とCStr関数の知っておくべき違い
- Str関数の場合、正負記号(+と-、プラスの場合は半角スペース)が先頭につきます。
- CStr関数は、シンプルに数値を文字列に変換します。
- 「P」・・・加工する数値(データ型は数値型)
- 「IDa」「IDb」・・・Pの中に含まれるID番号(データ型は文字列型)
- 「Ra」「Rb」・・・Pの中に含まれる価格情報(データ型は数値型)
- 「Sa」「Sb」・・・複数個(2個)のときの価格
Sub ミスに注意()
Dim P As Long
Dim IDa As String, Ra As Long, Sa As Long
Dim IDb As String, Rb As Long, Sb As Long
P = 10023456
'Str関数での処理
'ID番号の取り出し
IDa = Mid(Str(P), 2, 3)
'価格情報の取り出し
Ra = Mid(Str(P), 5)
Sa = Ra + Ra
'CStr関数での処理
'ID番号の取り出し
IDb = Mid(CStr(P), 2, 3)
'価格情報の取り出し
Rb = Mid(CStr(P), 5)
Sb = Rb + Rb
Debug.Print "Str関数を使った処理"
Debug.Print ""
Debug.Print "P=" & P & " " & TypeName(P)
Debug.Print ""
Debug.Print "Str(P)=" & Str(P) & " " & TypeName(Str(P))
Debug.Print ""
Debug.Print "Len(Str(P))=" & Len(Str(P))
Debug.Print ""
Debug.Print "IDa=" & IDa & " " & TypeName(IDa)
Debug.Print ""
Debug.Print "Ra=" & Ra & " " & TypeName(Ra)
Debug.Print ""
Debug.Print "Sa=" & Sa & " " & TypeName(Sa)
Debug.Print ""
Debug.Print ""
Debug.Print "CStr関数を使った処理"
Debug.Print ""
Debug.Print "P=" & P & " " & TypeName(P)
Debug.Print ""
Debug.Print "CStr(P)=" & CStr(P) & " " & TypeName(CStr(P))
Debug.Print ""
Debug.Print "Len(CStr(P))=" & Len(CStr(P))
Debug.Print ""
Debug.Print "IDb=" & IDb & " " & TypeName(IDb)
Debug.Print ""
Debug.Print "Rb=" & Rb & " " & TypeName(Rb)
Debug.Print ""
Debug.Print "Sb=" & Sb & " " & TypeName(Sb)
End Sub
<計算結果>
Str関数で処理をすると、「半角スペース」が付加され結果、文字数が「9文字」になった。
本来「8文字」であるので、文字列からの切り取り数と切り取り位置がずれてしまった。
期待している計算結果は、CStr関数の方になる。
Str関数とCStr関数以外に使用した関数
- Mid関数・・・文字列の一部を切り出すことが出来る
- Len関数・・・文字列の長さ(文字数)を調べることが出来る
データ型を文字列型に変換するStr関数
Str関数の特徴を簡単に説明します。
Str関数もCStr関数もVBAで、数値を文字列に変換するときに使用します。
使い分け的には、
Str関数の場合、正負記号(+と-、プラスの場合は半角スペース)を付加して表示出力します。
Str関数の構文
構文(記述方法)
- Str(数値)
Str関数は数値を文字列に変換する関数ですので、基本、加工対象のデータ型は数値型になります。
Str関数の使用例
Sub Str関数()
MsgBox "Str(101) = " & Str(101) & " ; " & _
TypeName(Str(101)) & vbCrLf & _
"Str(-102) = " & Str(-102) & " ; " & _
TypeName(Str(-102))
End Sub
このように文字列型として出力しますが、正負記号が付加されていることが分かります。
Str関数によって、正の数値に付く「半角スペース」は結構邪魔になるケースが多いです。
取り除く方法を考えておきます。
スペースを取り除く関数として「Trim関数」というのがあります。
Sub Str関数スペース排除()
MsgBox "trim(Str(101)) = " & Trim(Str(101)) & _
" ; " & TypeName(Trim(Str(101))) _
& vbCrLf & "trim(Str(-102)) = " & Trim(Str(-102)) & _
" ; " & TypeName(Trim(Str(-102)))
End Sub
Trim関数を利用することで前後についているスペースを削除することが出来ました。
- ここの説明で出てくるVBAコードの参考にしていただける記事です。
データ型を文字列型に変換するCStr関数
CStr関数の特徴を簡単に説明します。
CStr関数は、Str関数と同様な働きをします。
Str関数との違いとして、
CStr関数は、文字列の先頭に正負記号を付け加えません。シンプルに数値を文字列に変換するのみです。
CStr関数の構文
構文(記述方法)
- CStr(数値)
CStr関数も数値を文字列に変換する関数です。基本、加工対象のデータ型は数値型です。
CStr関数の使用例
Str関数との違いを明確にするため、それぞれの結果を並べて表示させます。
加工対象の数値が正の数であった時に、
CStr関数の場合は、文字列の先頭に半角スペースが付加されることはありません。
Sub CStr関数()
MsgBox " Str(101) =" & Str(101) & " ; " & _
TypeName(Str(101)) & vbCrLf & _
" Str(-102) =" & Str(-102) & " ; " & _
TypeName(Str(-102)) & vbCrLf & _
" CStr(101) =" & CStr(101) & " ; " & _
TypeName(CStr(101)) & vbCrLf & _
"CStr(-102) =" & CStr(-102) & " ; " & _
TypeName(CStr(-102))
End Sub
加工対象の数値が負の数であった場合は、CStr関数とStr関数に違いはありません。
Str関数とCStr関数の知っておくべき違いと使い方のまとめ
数値を文字列型に変換するときに、
Str関数は、文字列の先頭に正負記号を付加する
CStr関数は、数値をそのまま素直に文字列化する。
の違いがあります。
結局、たったそれだけなんだけどね。
軽く思わないで、ひどい目に合わないように注意が必要です。
半角スペースが付加されるということは、「空白文字」が入るということです。
見かけ上同じ数字でも、エクセル上では、全く違う文字となります。
冒頭の例題の他にも、
例えば、検索系の関数で何かある数字を探そうとしても、
その探したい数字の先頭に半角スペースが付いていなければ、一生見つけることは出来ません。
あるいはVBAコードの組み上げ方によっては、エラーストップだらけになります。
見かけ上は、同じ数字どうしなので、エラー原因も気づき難いのが厄介です。
- 【 Str関数 + Trim関数 】の合わせ技を使う
- 【 CStr関数 】でピシッと1発でまとめる
のどちらかで、考えましょう。
- Trim関数についてはこちらの記事になります。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。