Str関数とCStr関数 データ型変換方法の知っておくべき違いと使い方

vbastrcstreyecatch

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

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

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

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

「関数リファレンス」を調べる

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

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

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

答えは「エクセルを利用する業務内容で様ざま事情があります。」ということです。

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

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

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

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

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

を扱うことになります。

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

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

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

MEMO

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

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

ですので、

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

ちなみに、

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

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

 

vbastrcstr007a


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

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

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

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

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

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

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

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関数の方になる。

vbastrcstr008a

MEMO

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

Mid関数・・・文字列の一部を切り出すことが出来る

vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出します

Len関数・・・文字列の長さ(文字数)を調べることが出来る

vbaleneyecatch Len関数・LenB関数で文字列の文字数を知る方法。使用例で解説します

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

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

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

使い分け的には、

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

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

vbastrcstr001

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

vbastrcstr002

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

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

Trim関数を併用する

スペースを取り除く関数として「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

vbastrcstr003

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

vbastrcstr004

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

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

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

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

Str関数との違いとして、

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

CStr関数の構文

構文(記述方法)

  • CStr(数値)

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

CStr関数の使用例

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

CStr関数の返し方

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

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

vbastrcstr005

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

vbastrcstr006

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

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

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

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

の違いがあります。

ねこ氏

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

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

じゅんぱ店長

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

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

冒頭の例題の他にも、

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

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

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

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

数値の文字列化

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

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

エクセルVBAの基本を復習しながら学習する

自分もそうですが、VBAコードの組み立てに慣れてくると、

ついついうっかりミスが出てくることがあります。

「分かっているはずが忘れている。」

そういうことも含めて、エクセルVBAの基本を振り返る時にも使える、

基礎から学習のガイダンス的記事も書いていますので、参考にしてください。

基礎知識習得のためのオンライン学習講座の参考記事

Udemy1eyecatch エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。

エクセルVBAの独習を始めるための参考書について

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

今回はここまでです。

最後までご覧いただきありがとうございました。

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

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