Str関数とCStr関数 データ型変換の知るべき違いと使い方

vbastrcstreyecatch

エクセルVBAのデータ型変換関数で、Str関数とCStr関数の使い方とその違いについて説明します。

それは戻り値に違いがあります。
使い方の違いでその後のコードの進行に影響が出ることがあり、なおざりにできません。

こんにちは、じゅんぱ店長(@junpa33)です。

今回は、文字列操作に関連してVBA関数の「Str関数とCStr関数」の使い方についてです。

Str関数とCStr関数の知っておくべき違いと使い方

vbastrcstrp009

Str関数とCStr関数は、数値を文字列型(String)に変換するために利用する関数となります。

「数値を文字列で表示する必要がそんなにある?」

答えは「エクセルを利用する業務内容で様々な状況だ出てきます。」ということです。

例えば数値を文字列型にしないといけない時とは

例えば自身のエクセル利用環境の中でお話すると・・・

第一義的には、エクセルの仕様上の都合によってです。

雑誌書籍の数値データの桁数は、

  • 書籍コード(ISBN)13桁
  • 雑誌の場合は18桁

を扱うことになります。

これらの数値データは文字列型の扱で行うことになります。

そしてさらに、この大きな桁の数値の中には「商品固有識別番号」や「価格データ」が含まれています。

これらのデータを取り出すときにも、この数値を文字列の扱いとする必要が出てきます。

注意ポイント

エクセルが数値として扱えるのは15桁までです。

デフォルトだと、表示されるのは11桁までで、それ以上の桁数ですと指数表示になります。(表示設定が「標準」の場合)

ですので、雑誌コードは初めから文字として(1,024文字まで)しか扱うことできません。

ちなみに、

セルの表示桁数の限界と表示(数値と文字列)の四則(足し算)の関係はこのような感じです。

  • 16桁以上の数値は計算することは出来ません。
  • 文字列で表示していても、エクセルが自動で判断し計算をしてしまいます。③+④(数値と文字列)、④+⑤(文字列と文字列)は計算されます。
  • ⑦の文字列表示した先頭半角スペースの数値文字列も、スペースをないこととして計算してしまいます。④+⑦
vbastrcstr007a

では、どういうことになるかというと、

実務エクセル的には、加工したいデータを変数化します。

ある処理では文字列型に変換して、文字列としての処理を行います。

またほかの処理では、その数値を、数値データとして四則計算などを行います。

その場合の、その数値のデータ型は敢えて数値型に変換しなくとも、

エクセルが自動的に「この数値のこの文字列は、数値型として計算できる。」

と判断して四則計算してくれるということです。

Str関数とCStr関数の知っておくべき違い

違いを解説
  • Str関数の場合、正負記号(+と-、プラスの場合は半角スペース)が先頭につきます。
  • CStr関数は、シンプルに数値を文字列に変換します。
変数の設定内容
  • 「P」・・・加工する数値(データ型は数値型)
  • 「IDa」「IDb」・・・Pの中に含まれるID番号(データ型は文字列型)
  • 「Ra」「Rb」・・・Pの中に含まれる価格情報(データ型は数値型)
  • 「Sa」「Sb」・・・複数個(2個)のときの価格
VBA
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関数の方になる。

vbastrcstr008a

参考記事

Str関数とCStr関数以外に使用した関数

  • Mid関数・・・文字列の一部を切り出すことが出来る
vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出す
  • Len関数・・・文字列の長さ(文字数)を調べることが出来る
vbaleneyecatch Len関数・LenB関数で文字列の文字数を調べる

データ型を文字列型に変換するStr関数

vbastrcstrp010

Str関数の特徴を簡単に説明します。

Str関数もCStr関数もVBAで、数値を文字列に変換するときに使用します。

使い分け的には、

Str関数の場合、正負記号(+と-、プラスの場合は半角スペース)を付加して表示出力します。

Str関数の構文

構文(記述方法)

  • Str(数値)

Str関数は数値を文字列に変換する関数ですので、基本、加工対象のデータ型は数値型になります。

Str関数の使用例

Str関数
VBA
Sub Str関数()
        MsgBox "Str(101)  = " & Str(101) & " ;  " & _
            TypeName(Str(101)) & vbCrLf & _
            "Str(-102) = " & Str(-102) & " ;  " & _
            TypeName(Str(-102))
End Sub
vbastrcstr001

このように文字列型として出力しますが、正負記号が付加されていることが分かります。

vbastrcstr002

Str関数によって、正の数値に付く「半角スペース」は結構邪魔になるケースが多いです。

取り除く方法を考えておきます。

Trim関数を併用

スペースを取り除く関数として「Trim関数」というのがあります。

VBA
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
vbastrcstr003

Trim関数を利用することで前後についているスペースを削除することが出来ました。

vbastrcstr004

参考記事

  • ここの説明で出てくるVBAコードの参考にしていただける記事です。
vbatrimeyecatch Trim・RTrim・LTrim関数の利用 余分なスペースを取り除く

データ型を文字列型に変換するCStr関数

vbastrcstrp011

CStr関数の特徴を簡単に説明します。

CStr関数は、Str関数と同様な働きをします。

Str関数との違いとして、

CStr関数は、文字列の先頭に正負記号を付け加えません。シンプルに数値を文字列に変換するのみです。

CStr関数の構文

構文(記述方法)

  • CStr(数値)

CStr関数も数値を文字列に変換する関数です。基本、加工対象のデータ型は数値型です。

CStr関数の使用例

Str関数との違いを明確にするため、それぞれの結果を並べて表示させます。

CStr関数

加工対象の数値が正の数であった時に、

CStr関数の場合は、文字列の先頭に半角スペースが付加されることはありません。

VBA
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
vbastrcstr005

加工対象の数値が負の数であった場合は、CStr関数とStr関数に違いはありません。

vbastrcstr006

Str関数とCStr関数の知っておくべき違いと使い方のまとめ

vbastrcstrp012

数値を文字列型に変換するときに、

Str関数は、文字列の先頭に正負記号を付加する

CStr関数は、数値をそのまま素直に文字列化する。

の違いがあります。

ねこ氏
ねこ氏

結局、たったそれだけなんだけどね。

じゅんぱ店長
じゅんぱ店長

軽く思わないで、ひどい目に合わないように注意が必要です。

半角スペースが付加されるということは、「空白文字」が入るということです。

見かけ上同じ数字でも、エクセル上では、全く違う文字となります。

冒頭の例題の他にも、

例えば、検索系の関数で何かある数字を探そうとしても、

その探したい数字の先頭に半角スペースが付いていなければ、一生見つけることは出来ません。

あるいはVBAコードの組み上げ方によっては、エラーストップだらけになります。

見かけ上は、同じ数字どうしなので、エラー原因も気づき難いのが厄介です。

数値の文字列化
  • 【 Str関数 + Trim関数 】の合わせ技を使う
  • 【 CStr関数 】でピシッと1発でまとめる

のどちらかで、考えましょう。

参考記事

  • Trim関数についてはこちらの記事になります。
vbatrimeyecatch Trim・RTrim・LTrim関数の利用 余分なスペースを取り除く

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min