Visual Basic 初級講座 [改訂版]
VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第4回 型変換

2020/2/8

この記事が対象とする製品・バージョン (バージョンの確認方法)

VB2019 Visual Basic 2019 対象です。
VB2017 Visual Basic 2017 対象です。
VB2015 Visual Basic 2015 対象です。
VB2013 Visual Basic 2013 対象です。
VB2012 Visual Basic 2012 対象ですが一部画面が異なる場合があります。
VB2010 Visual Basic 2010 対象ですが一部画面が異なる場合があります。
VB2008 Visual Basic 2008 対象ですが一部画面が異なる場合があります。
VB2005 Visual Basic 2005 対象ですが一部画面が異なる場合があります。
VB.NET 2003 Visual Basic.NET 2003 対象外ですがほとんどの説明があてはまるので参考になります。
VB.NET 2002 Visual Basic.NET (2002) 対象外ですがほとんどの説明があてはまるので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

 

目次

 

1.型変換

1-1.Option Strict

Long型の変数をInteger型の変数に代入する場合などに値の型が変換される「型変換」が発生します。型変換のことを「キャスト」とも呼びます。

型変換の動作は Option Strict の設定によって変わるので先にOption Strictの設定方法を説明します。

 

Option Strictは型を厳密にあつかうかどうかを決めるオプションです。デフォルトではオフになっており、型は厳密には扱われません。

Option Strictはプロジェクトのプロパティでコンパイルページで設定できます。

Option Strictの設定の場所

また、ファイルごとに先頭に Option Strict On または Option Strict Offと記述すれば、そのファイル内ではプロジェクトの設定に優先して記述した設定が有効になります。

 

型を厳密に扱う Option Strict On では、プログラマがやるべき作業がふえて初心者には負担があります。しかし、その見返りに、事前にプログラムがおかしいところを発見しやすいので、バグを防ぐことができます。プロが業務用のシステムを構築する際にはOption Strict Onが基本です。個人で趣味でプログラムしている場合は、どちらでもお好みの方でかまいません。

新規プロジェクトを作成したときの初期状態でOption StrictをOnにするかOffにするかは、 ツールメニューのオプションから Visual Basic の既定値 で設定できます。

■画像:Option Strictの既定値。この設定は、次にプロジェクトを作成する場合に、Option StrictをOnで作成するか、Offで作成するかの設定です。現在のプロジェクトには影響しません。

Option Strict Onで使用したい場合は、ここの設定を変更しておくことで、次回から新規プロジェクトを作成するとはじめからOption Strict Onの状態で開始することができます。

 

1-2.拡大変換と縮小変換

異なる型の変数から値を代入する場合、型変換が発生します。

次の例ではIntegerの値をLongに代入しているので、IntegerからLongへの型変換が発生しています。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim i As Integer = 123
Dim l As Long

l = i

LongはIntegerより表現できる範囲が大きいのでこの変換はまったく問題ありません。

このように、より範囲の大きい型への変換を「拡大変換」(かくだいへんかん)と呼びます。拡大変換は常に成功します。

 

この逆方向の変換を縮小変換と呼びます。

下記は縮小変換の例です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim l As Long = 123
Dim i As Integer

i = l

この例は、LongからIntegerへの変換なので縮小変換です。Option Strict Offの場合、この例はエラーにならず実行でき、実際に実行しても成功します。

型を厳密に扱うOption Strict Onの場合、値が 123 であり、IntegerでもLongでも扱えるので成功しても良いように思いますが、エラーになりそもそも実行できません。

下記の変換は、同じようにLongからIntegerへの縮小変換です。Option Strict Offの場合、プログラムの実行はできますが、変換するときに値が大きすぎてエラーになります。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim l As Long = 123456789012345L
Dim i As Integer

i = l

 

Option Strict Onで縮小変換を実施するには明示的に縮小変換を指示する必要があります。縮小変換を指示するには、この例の場合、Integerへの変換を明示的に行う CInt (読み方:シーイント)を次のように使用します。これで実行できるようになります。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim l As Long = 123
Dim i As Integer

i = CInt(l)

CIntを使うということは、プログラマーがこの型変換に責任を持つという意思表示です。たしかにLongからIntegerへの型変換は値が小さければ成功します。何も意思表示しなければVBが「失敗する可能性があるからダメ」という意味でエラーにしますが、CIntで意思表示することにより「プログラマーである俺が大丈夫だとわかっているから言われたとおりに実行しろ」という意味になり、失敗する可能性があってもVBは言われたとおりに実行します。実行した結果、値が大きくて変換できずエラーになる可能性はありますが、その可能性についての責任はプログラマーが負うということになります。

 

  拡大変換(例 Integer → Long) 縮小変換(例 Long → Integer)
Option Strict On OK。必ず成功。 暗黙の変換は×
明示的変換は実行可能。ただし、実行時にエラーになる場合あり。
Option Strict Off OK。必ず成功。 実行可能。ただし、実行時にエラーになる場合あり。

 

1-3.明示的変換

明示的な変換を行う方法は型ごとにだいたい2種類ずつくらいあります。

1種類目はCIntやCLngなど C + 型名のような名前がついてるもので、これらをデータ型変換関数と呼びます。これはVBの機能あり、VBに適した変換を行ってくれます。

2種類目はConvert.ToInt32やConvert.ToInt63など、Convert.ToXxxx という名前がついているものです。これはフレームワークの機能です。

変換後の型 データ型変換関数 フレームワークの機能
Boolean CBool Convert.ToBoolean
Byte CByte Convert.ToByte
Char CChar Convert.ToChar
Date CDate Convert.ToDateTime
Decimal CDec Convert.ToDecimal
Double CDbl Convert.ToDouble
Integer CInt Convert.ToInt32
Long CLng Convert.ToInt64
Object CObj  
SByte CSByte Convert.ToSByte
Short CShort Convert.ToInt16
Single CSng Convert.ToSingle
String CString Convert.ToString
UInteger CUInt Convert.ToUInt32
ULong CULng Convert.ToUInt64
UShort CUShort Convert.ToUInt16

細かい機能の違いはありますが、どちらもほとんど同じです。

VBでプログラムしているのでVB専用のデータ型変換関数(CIntやCLng)を使うのが良いかと思いますが、チームで開発していて、C#になれているメンバーが参加しているのならば C# でも使える Convert系のメソッドの方に統一したほうが混乱が少ないかもしれません。

発展 発展学習  -  C#プログラマーへ。やっていることはキャストです。

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

VBの x = CInt(y) というプログラムは、C#の x = (int)y というプログラムとほぼ等価です。数値の縮小変換の場合は実行時にオーバーフローをチェックするために checked 相当の機能が追加されるなど過保護に面倒を見てくれるのが違いです。

longからintへの変換の場合 x  Convert.ToInt32(y) も最終的には x = (int)y を使って型変換を実行しています。

 

以下は明示的変換の例です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim b1 As Boolean = CBool("True")
Dim b2 As Boolean = Convert.ToBoolean("False")
Dim b3 As Boolean = CBool(1) 'Trueになります。

Dim date1 As Date = CDate("2020/6/27")
Dim date2 As Date = Convert.ToDateTime("May 5, 2025")

Dim i1 As Integer = CInt("123")
Dim i2 As Integer = Convert.ToInt32(456D)
Dim i3 As Integer = CInt(3.1415926)

Dim i4 As Integer = CInt(True) '-1 になります。
Dim i5 As Integer = Convert.ToInt32(True) '1 になります。

Dim i6 As Integer = CInt(Nothing) '0 になります。

Dim l1 As Long = CLng(i1)
Dim dec1 As Decimal = CDec(i1)
Dim double1 As Double = CDbl(i1)

この例の中で i4 と i5 は VBのデータ型変換関数とフレームワークのConvert系機能とで結果が異なるめずらしい例です。

メモ メモ  -  型推論するので As 型名は 不要ですが、つけたほうがわかりやすいので書いています。
VB2008以上では、型推論機能があるため、宣言時に値を代入する場合は、As 型名 を省略できます。上記の例ではすべての As 型名 を省略しても結果は同じです。

でも、やはり、As 型名 を書いておいたほうが、ぱっと見て何型かわかりやすいので記述しています。実際のプロの現場でも型推論できる場合でもAs 型名を省略せずに書くことはめずらしくありません。今後もこの初級講座では型推論できる場合でもAs 型名を書く場合があります。

 

1-4.CType

CType(読み方:CType = シータイプ)は汎用のデータ型変換関数で、使用するときに型を指定することで、これ1つでCIntやCLngなど他のデータ型変換関数の役割を担えます。

CTypeを使う際には、変換する型を自分で指定します。次のように使用します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim st1 As String = "123"
Dim i1 As Integer

i1 = CType(st1, Integer)

Dim i2 As Integer = 456
Dim st2 As String

st2 = CType(i2, String)

IntegerやStringなどの基本型はCIntやCStrなどの専用のデータ型変換関数があるので、あえてCTypeを使う必要はありません。

複合型の場合は、専用のデータ型変換関数がないので明示的な型変換が必要な場合はCTypeを使用します。

 

1-5.Visual Studioの支援

明示的変換が必要でエラーにある場合、Visual Studioが修正方法を提案してくれるので、プログラマーはクリックするだけで済みます。

問題がある箇所には赤い波線が表示されるので、この上でマウスカーソルをホバーさせます。少し待つと「不足しているキャストを挿入」というVisual Studioからの提案が表示されるので、クリックするとその通りになります。

この例では CType が提案されていますが、CStrでもOKです。

 

1-6.情報の欠落

縮小変換は情報が欠落する場合があります。

たとえば、小数から整数への変換は小数部が失われます。明示的な型変換でも暗黙的な型変換でもこの動作は同じです。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim d1 As Double = 2.5
Dim i1 As Integer = CInt(d1) '2 になります。

Dim d2 As Double = 3.5
Dim i2 As Integer = CInt(d2) '4 になります。

このとき、四捨五入ではなく銀行丸めが行われます。

発展 発展学習  -  四捨五入

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

四捨五入したい場合は下記のようにします。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim d1 As Double = 2.5

'四捨五入されて 3 になります。
Dim i1 As Integer = CInt(Math.Round(d1, MidpointRounding.AwayFromZero))

文字列型から文字方への変換では、2文字目移行が切り捨てられます。

 

2.文字列型との変換

2-1.ToString - 文字列型への変換

文字列型(String)はとてもよく使う型で、他の型との変換も多いため、特別扱いされています。

すべての型に ToString (読み方:ToString = トゥーストリング)という操作(メソッド)があり、これを使うことで値を文字列で表現することができます。すべての型でこれが可能な点がポイントです。文字列型に変換するには ToStringだけ覚えていれば良いのです。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim b1 As Boolean = True
Dim s1 As String = b1.ToString()

Dim date1 As Date = #6/27/2024#
Dim s2 As String = date1.ToString() '"2024/06/27 0:00:00" (OSの設定により結果は異なります。)

Dim i1 As Integer = 123456
Dim s3 As String = i1.ToString() '"123456"

Dim d1 As Decimal = 1234.56789D
Dim s4 As String = d1.ToString() '"1234.56789"

ToStringはリテラルから直接呼び出すこともできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim s1 As String = True.ToString()
Dim s2 As String = #6/27/2024#.ToString()
Dim s3 As String = 123456.ToString()
Dim s4 As String = 1234.56789D.ToString()

ただ、True.ToString() と書くならば、はじめから "True" と書いたほうが早くてわかりやすいので、このような使い方は勉強以外では意味がないでしょう。

 

博士のワンポイントレッスン 「混乱してきた?」
V太 V太:ちょとまて、ちょとまて!CIntとかとConvert.ToInt32の2種類だけでも混乱してきていたのに、今度は ToString ってこれどうやって使い分ければいいんですか?
B子 B子:うーん。私も混乱してきたわ。ToStringとCStrは何が違うのかしら?
V太 博士:まずは、VBの機能とフレームワークの機能とで同じような機能があるから紛らわしいのぉ。Visual Studioで入力するときに青い字になるのはVBの機能なんじゃ。

Dim st As String = CStr(1234)
B子 確かに、Convert.ToString はどこも青い字にならないわ。違う色はなるけど。
Dim st As String = Convert.ToString(1234)
V太 フレームワークはVB以外にもC#やF#やPythonなど他の言語からも使用できるので、型変換のような基本的な機能はどうしてもVBにもあるし、フレームワークにもあるという二刀流になってしまうのじゃ。
V太 それから、文字列は特別扱いされおって、他の型→文字列型 の変換と 文字列型→他の型 への変換に特別な方法が用意されておる。
それが、ToString とこの後説明する Parse じゃ。
V太 うーん。事情はわかったけど。もうちょっと簡単にできないものなのか。


博士 別に覚える必要はないのじゃ。いつでもこのページに戻ってきて確認すれば済むだけの話。それから、さっき説明したようにVisual Studioの支援機能も使用できるぞ。型変換で困ったらとりあえず暗黙の変換にして、Visual Studioが何を提案してくるのか見てみるというのも手じゃ。

 

2-2.Parse - 文字列型からの変換

オブジェクト型と文字列型以外のすべての基本型には Parse (読み方:Parse = パース)という操作(メソッド)があり、これを使うことで、文字列から対象の型に変換することもできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim bln As Boolean = Boolean.Parse("False")
Dim b As Byte = Byte.Parse("56")
Dim c As Char = Char.Parse("A")
Dim day As Date = Date.Parse("2025/6/27")
Dim dec As Decimal = Decimal.Parse("12345")
Dim dbl As Double = Double.Parse("456.123")
Dim i As Integer = Integer.Parse("2345")
Dim lng As Long = Long.Parse("987654")
Dim sht As Short = Short.Parse("51")
Dim sng As Single = Single.Parse("1.2345")

 

3.文化(カルチャー)による違い

文字列から数値や日付に変換する場合、文化によって結果が異なります。

たとえば、ドイツなどいくつかの地域では小数点は , (カンマ)です。

そのため次の変換を実行した結果は、文化が日本なのか、ドイツなのかで変わります。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Dim i As Decimal = CDec("123,456")

VBなどの.NETでは既定ではOSの設定で文化を判断します。

Windowsでは、コントロールパネルの地域と言語の設定です。

日本の設定になっているWindowsでこれを実行すると結果は12万3456になります。途中にある , は桁区切りの記号と判断され結果には影響しません。

 

ドイツではどうなのか、コントロールパネルを変更して試すこともできますが、プログラムに1行追加すると、ドイツの文化(カルチャー)で実行してくれます。

下記プログラムでの文化の変更は、このプログラム内だけに効果があります。Windowsの設定が変わってしまうようなことはありません。

 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'現在の文化をドイツ(ドイツ語)に変更。
My.Application.ChangeCulture("de-DE")

'結果は 123 と小数点以下の .456 になります。
Dim i As Decimal = CDec("123,456")

 

日付の変換は文化の影響がもっとも気になるところだと思います。

入門講座第6回 文字・数値・日付のあつかい で紹介していますので参考にしてください。

 

4.練習問題

■の部分にあてはまるものを選択してください。

問1.Dim i As Integer = ■("123")
String.Parse
Convert.ToInt16
Convert.ToString
CInt
問2.Dim d As Decimal = ■(123.456)
Convert.ToDecimal
Decimal.Parse
CType
CDbl
問3.Dim st As String = i.■
Parse
ToString
CStr
問4.Dim i As Integer = CType(value, ■)
Integer
CInt
String
Object
問5.Dim value As Long = ■.Parse(source)
Convert
Long
CLng
CType