Visual Basic 初級講座 [改訂版] |
Visual Basic 中学校 > 初級講座[改訂版] >
2020/2/8
この記事が対象とする製品・バージョン
Visual Basic 2019 | ◎ | 対象です。 | |
Visual Basic 2017 | ◎ | 対象です。 | |
Visual Basic 2015 | ◎ | 対象です。 | |
Visual Basic 2013 | ◎ | 対象です。 | |
Visual Basic 2012 | ○ | 対象ですが一部画面が異なる場合があります。 | |
Visual Basic 2010 | ○ | 対象ですが一部画面が異なる場合があります。 | |
Visual Basic 2008 | ○ | 対象ですが一部画面が異なる場合があります。 | |
Visual Basic 2005 | ○ | 対象ですが一部画面が異なる場合があります。 | |
Visual Basic.NET 2003 | △ | 対象外ですがほとんどの説明があてはまるので参考になります。 | |
Visual Basic.NET (2002) | △ | 対象外ですがほとんどの説明があてはまるので参考になります。 | |
Visual Basic 6.0 | × | 対象外です。 |
目次
Long型の変数をInteger型の変数に代入する場合などに値の型が変換される「型変換」が発生します。型変換のことを「キャスト」とも呼びます。
型変換の動作は 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の状態で開始することができます。
異なる型の変数から値を代入する場合、型変換が発生します。
次の例ではIntegerの値をLongに代入しているので、IntegerからLongへの型変換が発生しています。
Dim i As
Integer = 123 Dim l As Long l = i |
LongはIntegerより表現できる範囲が大きいのでこの変換はまったく問題ありません。
このように、より範囲の大きい型への変換を「拡大変換」(かくだいへんかん)と呼びます。拡大変換は常に成功します。
この逆方向の変換を縮小変換と呼びます。
下記は縮小変換の例です。
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の場合、プログラムの実行はできますが、変換するときに値が大きすぎてエラーになります。
Dim l As
Long = 123456789012345L Dim i As Integer i = l |
Option Strict Onで縮小変換を実施するには明示的に縮小変換を指示する必要があります。縮小変換を指示するには、この例の場合、Integerへの変換を明示的に行う CInt (読み方:シーイント)を次のように使用します。これで実行できるようになります。
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。必ず成功。 | 実行可能。ただし、実行時にエラーになる場合あり。 |
明示的な変換を行う方法は型ごとにだいたい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系のメソッドの方に統一したほうが混乱が少ないかもしれません。
発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 VBの x = CInt(y) というプログラムは、C#の x = (int)y というプログラムとほぼ等価です。数値の縮小変換の場合は実行時にオーバーフローをチェックするために checked 相当の機能が追加されるなど過保護に面倒を見てくれるのが違いです。 longからintへの変換の場合 x Convert.ToInt32(y) も最終的には x = (int)y を使って型変換を実行しています。 |
以下は明示的変換の例です。
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系機能とで結果が異なるめずらしい例です。
VB2008以上では、型推論機能があるため、宣言時に値を代入する場合は、As 型名 を省略できます。上記の例ではすべての As 型名
を省略しても結果は同じです。
でも、やはり、As 型名 を書いておいたほうが、ぱっと見て何型かわかりやすいので記述しています。実際のプロの現場でも型推論できる場合でもAs 型名を省略せずに書くことはめずらしくありません。今後もこの初級講座では型推論できる場合でもAs 型名を書く場合があります。 |
CType(読み方:CType = シータイプ)は汎用のデータ型変換関数で、使用するときに型を指定することで、これ1つでCIntやCLngなど他のデータ型変換関数の役割を担えます。
CTypeを使う際には、変換する型を自分で指定します。次のように使用します。
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を使用します。
明示的変換が必要でエラーにある場合、Visual Studioが修正方法を提案してくれるので、プログラマーはクリックするだけで済みます。
問題がある箇所には赤い波線が表示されるので、この上でマウスカーソルをホバーさせます。少し待つと「不足しているキャストを挿入」というVisual Studioからの提案が表示されるので、クリックするとその通りになります。
この例では CType が提案されていますが、CStrでもOKです。
縮小変換は情報が欠落する場合があります。
たとえば、小数から整数への変換は小数部が失われます。明示的な型変換でも暗黙的な型変換でもこの動作は同じです。
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 になります。 |
このとき、四捨五入ではなく銀行丸めが行われます。
発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 四捨五入したい場合は下記のようにします。
|
文字列型から文字方への変換では、2文字目移行が切り捨てられます。
文字列型(String)はとてもよく使う型で、他の型との変換も多いため、特別扱いされています。
すべての型に ToString (読み方:ToString = トゥーストリング)という操作(メソッド)があり、これを使うことで値を文字列で表現することができます。すべての型でこれが可能な点がポイントです。文字列型に変換するには ToStringだけ覚えていれば良いのです。
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はリテラルから直接呼び出すこともできます。
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" と書いたほうが早くてわかりやすいので、このような使い方は勉強以外では意味がないでしょう。
博士のワンポイントレッスン 「混乱してきた?」
|
オブジェクト型と文字列型以外のすべての基本型には Parse (読み方:Parse = パース)という操作(メソッド)があり、これを使うことで、文字列から対象の型に変換することもできます。
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") |
文字列から数値や日付に変換する場合、文化によって結果が異なります。
たとえば、ドイツなどいくつかの地域では小数点は , (カンマ)です。
そのため次の変換を実行した結果は、文化が日本なのか、ドイツなのかで変わります。
Dim i As Decimal = CDec("123,456") |
VBなどの.NETでは既定ではOSの設定で文化を判断します。
Windowsでは、コントロールパネルの地域と言語の設定です。
日本の設定になっているWindowsでこれを実行すると結果は12万3456になります。途中にある , は桁区切りの記号と判断され結果には影響しません。
ドイツではどうなのか、コントロールパネルを変更して試すこともできますが、プログラムに1行追加すると、ドイツの文化(カルチャー)で実行してくれます。
下記プログラムでの文化の変更は、このプログラム内だけに効果があります。Windowsの設定が変わってしまうようなことはありません。
'現在の文化をドイツ(ドイツ語)に変更。 My.Application.ChangeCulture("de-DE") '結果は 123 と小数点以下の .456 になります。 Dim i As Decimal = CDec("123,456") |
日付の変換は文化の影響がもっとも気になるところだと思います。
入門講座第6回 文字・数値・日付のあつかい で紹介していますので参考にしてください。
■の部分にあてはまるものを選択してください。