Visual Basic サンプル集 |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
If を使用した条件判断
2023/1/15
→ C# のサンプルに切り替える → Python のサンプルに切り替える
目次
- 変数 value の値が 5 なら、処理を実行する
- 変数 value の値が "こんにちは" なら、処理を実行する
- 変数 value の値が True なら、処理を実行する
- 関数のような条件判断(If演算子)
- 条件が成立していないなら、別の処理を実行する。(Else)
- If の処理は書かないで、Elseの処理だけ書く
- 複数の条件に応じてそれぞれ別の処理を実行する (ElseIf)
- 変数 value の値が 5 ではないなら、処理を実行する
- 条件を反転させる (Not)
- x = 5 で かつ y = 8 なら、処理を実行する (AndAlso)
- x = 5 か または y = 8 なら、処理を実行する (OrElse)
- x が 5 でなく、8 でもないなら、処理を実行する
- x が 5以上なら、処理を実行する (>=)
- x が 5より大きいなら、処理を実行する (>)
- x が 5以下なら、処理を実行する (<=)
- x が 5より小さいなら、処理を実行する (<)
- x が 5 ~ 12 の間なら、処理を実行する
- x と y が同じインスタンスなら、処理を実行する(Is)
- Listの要素が同じなら、処理を実行する
- 文字列に "A" を含むなら、処理を実行する
- 文字列が "ベルギー" か "オランダ" か "ルクセンブルグ" なら、処理を実行する
- 文字列が "徳川家康" か "徳川家光" なら、処理を実行する(Likeと正規表現)
- 文字列が 0文字(=空文字)なら、処理を実行する
- 文字列が Nothing か 0文字(=空文字)なら、処理を実行する
- 文字列が Nothing か 0文字(=空文字)か、スペースのみなら、処理を実行する
- 文字列が "france" なら大文字でも小文字でも、処理を実行する
- 文字列が "リンゴ" なら ひらがな でも カタカナ でも、処理を実行する
- 変数が Nothing なら、処理を実行する
- 変数が Nothing ではないなら、処理を実行する
- 変数が指定した型なら、処理を実行する (TypeOf ... Is ...)
- 変数が指定した型なら、型変換して、処理を実行する
- 変数が指定した型で、プロパティも一致すれば、処理を実行する
- 変数が指定した型でなければ、処理を実行する
- 条件判断と同時に変数に代入する
変数 value の値が 5 なら、処理を実行する
Dim value As Integer = 5
If value = 5 Then
Debug.WriteLine("valueは5です。") '←これが表示されます。
End If
これでもできます。
Dim value As Integer = 5
If value = 5 Then Debug.WriteLine("valueは5です。") '←これが表示されます。
変数 value の値が "こんにちは" なら、処理を実行する
Dim value As String = "こんにちは"
If value = "こんにちは" Then
Debug.WriteLine("valueは「こんにちは」です。") '←これが表示されます。
End If
変数 value の値が True なら、処理を実行する
Dim value As Boolean = True
If value Then
Debug.WriteLine("valueはTrueです。") '←これが表示されます。
End If
メモ:If value = True Thenと書いても同じです。
関数のような条件判断(If演算子)
Dim value As Integer = 5
Dim result As String = If(value = 5, "Fiveです。", "Fiveではありません。")
Debug.WriteLine(result)
条件が成立していないなら、別の処理を実行する。(Else)
Dim value As Integer = 123
If value = 5 Then
Debug.WriteLine("valueは5です。")
Else
Debug.WriteLine("valueは5ではありません。") '←これが表示されます。
End If
If の処理は書かないで、Elseの処理だけ書く
Dim value As Integer = 123
If value = 5 Then
'何もしません。このコメントを記述する必要はありません。
Else
Debug.WriteLine("valueは5ではありません。") '←これが表示されます。
End If
複数の条件に応じてそれぞれ別の処理を実行する (ElseIf)
Dim value As Integer = 66
If value = 5 Then
Debug.WriteLine("valueは5です。")
ElseIf value > 10 Then
Debug.WriteLine("valueは10より大きいです。") '←これが表示されます。
ElseIf value > 50 Then
' 10より大きい場合、1つの上のElseIfが実行されるので、このElseIfの処理はvalueの値に関係なく絶対に実行されません。
Debug.WriteLine("valueは50より大きいです。")
Else
Debug.WriteLine("valueは 5 ではないし、10より大きくもないです。")
End If
メモ:ElseIf を使う場合、If よりも Select Caseの方が適しているかもしれません。
変数 value の値が 5 ではないなら、処理を実行する
Dim value As Integer = 123
If value <> 5 Then
Debug.WriteLine("valueは5ではありません。") '←これが表示されます。
End If
条件を反転させる (Not)
条件式に Not を付けると結果が判定します。次の例は、OSがLinuxでなければ処理を実行します。
If Not System.OperatingSystem.IsLinux() Then
Debug.WriteLine("実行環境はLinuxではありません。") '←これが出力されます。
End If
メモ:この例では、If System.OperatingSystem.IsLinux() = False Then と書いても同じです。
x = 5 で かつ y = 8 なら、処理を実行する (AndAlso)
Dim x As Integer = 5
Dim y As Integer = 8
If x = 5 AndAlso y = 8 Then
Debug.WriteLine("x は 5 で かつ y は 8 です。") '←これが表示されます。
End If
メモ:Andも同じような機能ですがショートサーキットではない(つまり、常に両方の条件を評価するので)使用しないように気を付けてください。
x = 5 か または y = 8 なら、処理を実行する (OrElse)
Dim x As Integer = 123
Dim y As Integer = 8
If x = 5 OrElse y = 8 Then
Debug.WriteLine("x が 5 か または y が 8 か またはその両方です。") '←これが表示されます。
End If
メモ:Orも同じような機能ですがショートサーキットではない(つまり、常に両方の条件を評価するので)使用しないように気を付けてください。
x が 5 でなく、8 でもないなら、処理を実行する
Dim x As Integer = 123
If x <> 5 AndAlso x <> 8 Then
Debug.WriteLine("x が 5 ではないし、8 でもありません。") '←これが表示されます。
End If
これでもできます。
Dim x As Integer = 123
If Not (x = 5 OrElse x = 8) Then
Debug.WriteLine("x が 5 ではないし、8 でもありません。") '←これが表示されます。
End If
x が 5以上なら、処理を実行する (>=)
Dim x As Integer = 78
If x >= 5 Then
Debug.WriteLine("x は 5 以上です。") '←これが表示されます。
End If
メモ:「以上」にはその数を含みます。たとえば、5以上の一番小さい数は5です。
x が 5より大きいなら、処理を実行する (>)
Dim x As Integer = 78
If x > 5 Then
Debug.WriteLine("x は 5 より大きいです。") '←これが表示されます。
End If
メモ:「より大きい」にはその数を含みません。たとえば、5より大きい一番小さな整数は6です。
x が 5以下なら、処理を実行する (<=)
Dim x As Integer = -45
If x <= 5 Then
Debug.WriteLine("x は 5 以下です。") '←これが表示されます。
End If
メモ:「以下」にはその数を含みます。たとえば、5以下の一番大きい数は5です。
x が 5より小さいなら、処理を実行する (<)
Dim x As Integer = -45
If x < 5 Then
Debug.WriteLine("x は 5 より小さいです。") '←これが表示されます。
End If
メモ:「より小さい」にはその数を含みません。たとえば、5より小さい一番大きな整数は4です。
x が 5 ~ 12 の間なら、処理を実行する
Dim x As Integer = 12
If x >= 5 AndAlso x <= 12 Then
Debug.WriteLine("x は 5 ~ 12 の間です。") '←これが表示されます。
End If
x と y が同じインスタンスなら、処理を実行する (Is)
Dim x As New List(Of Integer)({1, 2, 3})
Dim y As New List(Of Integer)({1, 2, 3})
Dim z = x
If x Is y Then
'これは表示されません。 x と y は内容が同じでも別のインスタンスです。
Debug.WriteLine("x と y は同じインスタンスです。")
End If
If x Is z Then
'これが表示されます。
Debug.WriteLine("x と z は同じインスタンスです。")
End If
Listの要素が同じなら、処理を実行する
Dim x As New List(Of Integer)({1, 2, 3})
Dim y As New List(Of Integer)({1, 2, 3})
Dim z = x
If x.SequenceEqual(y) Then
'これは表示されます。
Debug.WriteLine("x と y の要素は同じです。")
End If
If x.SequenceEqual(z) Then
'これも表示されます。
Debug.WriteLine("x と z の要素は同じです。")
End If
メモ:SequecneEqual での比較では、要素の順序も一致している必要があります。
文字列に "A" を含むなら、処理を実行する
Dim value As String = "ITALIA"
If value.Contains("A") Then
Debug.WriteLine("ITALIA には A が含まれています。") '←これが表示されます。
End If
文字列が "ベルギー" か "オランダ" か "ルクセンブルグ" なら、処理を実行する
Dim value As String = "オランダ"
If value = "ベルギー" OrElse value = "オランダ" OrElse value = "ルクセンブルグ" Then
Debug.WriteLine("ベネルクスです。") '←これが表示されます。
End If
これでもできます。
Dim value As String = "オランダ"
If {"ベルギー", "オランダ", "ルクセンブルグ"}.Contains(value) Then
Debug.WriteLine("ベネルクスです。") '←これが表示されます。
End If
これでもできます。If ではないですが。
Dim value As String = "オランダ"
Select Case value
Case "ベルギー", "オランダ", "ルクセンブルグ"
Debug.WriteLine("ベネルクスです。") '←これが表示されます。
End Select
文字列が "徳川家康" か "徳川家光" なら、処理を実行する(Likeと正規表現)
Dim value As String = "徳川家光"
If value Like "徳川家[康光]" Then
Debug.WriteLine("徳川家康または徳川家光です。") '←これが表示されます。
End If
メモ:Likeのパターンマッチングは独自の構文です。正規表現ではありません。→ Like 演算子
これでもできます。
Dim value As String = "徳川家光"
If System.Text.RegularExpressions.Regex.IsMatch(value, "^徳川家[康光]$") Then
Debug.WriteLine("徳川家康または徳川家光です。") '←これが表示されます。
End If
メモ:Regexクラスは正規表現でのパターンマッチングを行います。
文字列が 0文字(=空文字)なら、処理を実行する
Dim value As String = "" ' 長さ 0 の文字列。「空文字」とも呼びます。
If String.Equals(value, "") Then
Debug.WriteLine("文字列は空文字です。") '←これが表示されます。
End If
メモ:value が Nothing のときはメッセージを表示しません。 If value = "" Then と記述すると Nothing のときもメッセージが表示されます。
文字列が Nothing か 0文字(=空文字)なら、処理を実行する
Dim value As String = ""
'Dim value As String = Nothing '← Nothing で試したい場合
If String.IsNullOrEmpty(value) Then
'これが表示されます。
Debug.WriteLine("文字列はNothingか空文字です。")
End If
If Not String.IsNullOrEmpty(value) Then
'この例ではこれは表示されません。 value は空文字だからです。
Debug.WriteLine("文字列には何か1文字以上あります。※スペースも1文字とみなします。")
End If
メモ:String.IsNullOrEmpty は C# でも共通なので、この例は一般的に理解されやすくお勧めです。
これでもできます。
Dim value As String = ""
'Dim value As String = Nothing '← Nothing で試したい場合
If value = "" Then
'これが表示されます。
Debug.WriteLine("文字列はNothingか空文字です。")
End If
If value <> "" Then
'この例ではこれは表示されません。 value は空文字だからです。
Debug.WriteLine("文字列には何か1文字以上あります。※スペースも1文字とみなします。")
End If
メモ:value = "" は value が空文字またはNothingのときにTrueになります。 value <> "" はその逆です。
メモ:この例は一見直感的ですが、Nothingの判定がC#や他の言語と異なっているので、一般的にはわかりにくいかもしれません。
これでもできます。
Dim value As String = ""
'Dim value As String = Nothing '← Nothing で試したい場合
If Len(value) = 0 Then
'これが表示されます。
Debug.WriteLine("文字列はNothingか空文字です。")
End If
If Len(value) > 0 Then
'この例ではこれは表示されません。 value は空文字だからです。
Debug.WriteLine("文字列には何か1文字以上あります。※スペースも1文字とみなします。")
End If
メモ:Lenを使うこの方法は20世紀から続く伝統的な方法で、意味も理解しやすいので私の好みです。
文字列が null か 0文字(=空文字)か、スペースのみなら、処理を実行する
Dim value As String = " " '3つのスペース
If String.IsNullOrWhiteSpace(value) Then
Debug.WriteLine("文字列はNothingか空文字か1つ以上のスペースです。") '←これが表示されます。
End If
文字列が "france" なら大文字でも小文字でも、処理を実行する
Dim value As String = "frANCE"
If value.Equals("France", StringComparison.OrdinalIgnoreCase) Then
Debug.WriteLine("大文字小文字を無視すると文字列は France と等価です。")
End If
メモ:この例では、ドイツ語のエスツェット "ß" は "ss" と等しいとはみなされません(ドイツ人は日常生活でこれを等しいと認識しているようです)。このような言語文化的な同一性への対応は文字種によって異なります。.NETのグローバリゼーション機能でこのような比較ができるものもありますし、できないものもあります。
ドイツ語のエスツェット (ß) と ss を等しいとみなすような比較は下記でできます。IgnoreNonSpaceがポイントです。
Dim value As String = "Fleiß"
Dim gc = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace)
If gc.Equals(value, "Fleiss") Then
Debug.WriteLine("言語特性を考慮すると Fleiß と Fleiss は等価です。")
End If
文字列が "リンゴ" なら ひらがな でも カタカナ でも、処理を実行する
Dim value As String = "リんゴ"
If Umayadia.Kana.KanaConverter.ToKatakana(value) = "リンゴ" Then
Debug.WriteLine("ひらがな・カタカナを無視すると文字列は リンゴ と等価です。")
End If
メモ:この例を実行するには、NuGetで Kana.NET をインストールする必要があります。→ NuGetでパッケージをインストールする方法
メモ:ひらがなとカタカナを変換したり比較したりできる.NETの標準的な機能はありません。
これでもできますが、悪い例です。注意喚起のためあえて掲載します。StrConvはWindowsでしか動作しないうえ、Unicodeの文字で正常に扱えない文字があるからです。「𩸽」などいわゆるサロゲートペアを使用する文字や、多くの絵文字が文字列に含まれている場合、想定通りに動作しません。
#If NETCOREAPP Then
'.NET CoreでShift_JISなど追加のエンコーディングを扱うために必要です。
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
#End If
Dim value As String = "リんゴ"
'これは悪い例です。StrConv を使わないことを強く推奨します。
If StrConv(value, vbKatakana) = "リンゴ" Then
Debug.WriteLine("ひらがな・カタカナを無視すると文字列は リンゴ と等価です。")
End If
メモ:value が "𩸽" の場合、If StrConv(value, vbKatakana) = "𩸽" Then は 期待に反して False になります。StrConv は「𩸽」を正しく変換できないからです。
変数が Nothing なら、処理を実行する
Dim value As String = Nothing
If value Is Nothing Then
Debug.WriteLine("value は Nothing です。") '←これが表示されます。
End If
メモ:If IsNothing(value) Then でもできますが、速度が遅く、使うメリットがないのでお勧めはしません。
変数が Nothing ではないなら、処理を実行する
Dim value As String = "OK!"
If value IsNot Nothing Then
Debug.WriteLine("value は Nothing ではありません。") '←これが表示されます。
End If
メモ:If Not IsNothing(value) Then でもできますが、速度が遅く、使うメリットがないのでお勧めはしません。
変数が指定した型なら、処理を実行する (TypeOf ... Is ...)
この例は、変数 value の値が Date 型であるなら処理を実行します。(メモ参照)
Dim value As Object = Date.Now
If TypeOf value Is Date Then
Debug.WriteLine("value は Date型 と互換性があります。") '←これが表示されます。
End If
メモ:TypeOF ... Is ... は厳密に型が一致していなくても互換性がある型であれば True を返します。たとえば、基底クラスや実装するインターフェースの型 は True と判断します。わかりやすい例では TypeOf value is Object は value が Nothing でなければ常に True です。
メモ:もし、TypeOf で判定しようとしている変数がAs Integer や As Dateなどで宣言されている場合、BC30021「 'TypeOf ... Is' の左には参照型を持つオペランドが必要ですが、このオペランドの値型は 'Integer' です。」のようなエラーになります。Integerとわかっているのに、IfでIntegerかどうか判断しようとしていることになるので無意味ですが、勉強用のサンプルなどでこのようなプログラムを書いてしまうことがあります。
参考:変数 value の値が Date 型であるか厳密に判断するには GetType を使用して比較します。
Dim value As Object = Date.Now
If TypeOf value Is Object Then
' このメッセージは表示されます。TypeOf ... Is ... は 互換性がある型を True と判断するからです。
Debug.WriteLine("value は Object型 と互換性があります。")
End If
If value?.GetType() Is GetType(Object) Then
' このメッセージは表示されません。GetType と Is を組み合わせた比較は厳密に判断するからです。
Debug.WriteLine("value は Object型 です。")
End If
If TypeOf value Is Date Then
' このメッセージは表示されます。
Debug.WriteLine("value は Date型 と互換性があります。")
End If
If value?.GetType() Is GetType(Date) Then
' このメッセージは表示されます。
Debug.WriteLine("value は Date型 です。")
End If
変数が指定した型なら、型変換して、処理を実行する
この例は、変数 value が Date 型であるならメッセージを出力します。(メモ参照)
Dim value As Object = Date.Now
If TypeOf value Is Date Then
Dim dt As Date = CType(value, Date)
Debug.WriteLine($"value は {dt.Month}月{dt.Day}日です。") '←これが表示されます。
End If
メモ:TypeOF ... Is ... は厳密に型が一致していなくても互換性がある型であれば True を返します。たとえば、基底クラスや実装するインターフェースの型 は True と判断します。わかりやすい例では TypeOf value is Object は value が Nothing でなければ常に True です。
変数が指定した型で、プロパティも一致すれば、処理を実行する
この例は、変数 value が Date 型でDayプロパティが1、Hourプロパティが12以上ならばメッセージを出力します。
Dim value As Object = New Date(2024, 2, 1, 15, 0, 0)
If TypeOf value Is Date Then
Dim dt As Date = CType(value, Date)
If dt.Day = 1 AndAlso dt.Hour >= 12 Then
'これが出力されます。valueはDayが1でHourが15だからです。
Debug.WriteLine("月の初めの日の午後ですね。")
End If
End If
変数が指定した型でなければ、処理を実行する
この例は、変数 value の値が Date 型と互換性がなければ処理を実行します。
Dim value As Object = "OK!"
If Not (TypeOf value Is Date) Then
Debug.WriteLine("value は Date型 と互換性がありません。") '←これが表示されます。
End If
メモ:この例は 変数が Nothing の場合にもメッセージを出力します。
この例は、上記とほぼ同じですが、変数がNothingの場合はメッセージを出力しない点で異なります。
Dim value As Object = "OK!"
If TypeOf value IsNot Date Then
Debug.WriteLine("value は Date型 と互換性がありません。") '←これが表示されます。
End If
メモ:この例は 変数が Nothing の場合はメッセージを出力しません。
条件判断と同時に変数に代入する
この例は、1~6のランダムな数値を生成し、数値によってメッセージを変えます。メッセージには生成された数値を含みます。
Dim i As Integer
Dim assign = Function(ByRef v As Integer, value As Integer)
v = value
Return value
End Function
If assign(i, Random.Shared.Next(1, 7)) >= 4 Then
Debug.WriteLine($"高い数 {i} が生成されました。")
Else
Debug.WriteLine($"低い数 {i} が生成されました。")
End If
メモ:C#の代入演算子 = は代入した値を返しますが、VBの代入演算子 = は何も値を返さないので、VBでは代入と条件判断を組み合わせて記述することができません。この例では、代入を実行し、代入した値を返す関数を 変数 assign で定義することでC#の代入演算子を同じことを実現しています。しかし、この方式はサンプルを見てわかるように少しトリッキーです。ここまでして代入と条件判断を組み合わせる必要はないはずなので、このサンプルは参考程度にご活用ください。