Visual Basic

Visual Basic入門

.NETのコンソールアプリを作り、コードと実行結果を確かめながら基礎を一歩ずつ学びましょう。

この講座は.NET 8以降のVisual Basicを対象にしています。

01

Visual Basicとは

Visual Basicは、英語に近いキーワードと.NETの豊富な機能を使えるプログラミング言語です。業務用デスクトップアプリ、既存システムの保守、処理の自動化などで利用されています。この講座で扱うのは、ExcelのVBAではなく.NET上で動くVisual Basicです。

最初に区別しよう
  • Visual Basic .NET:.NET SDKでアプリを作る言語
  • VBA:主にOffice製品のマクロを書く言語
02

実行してみよう

.NET SDKをインストールし、ターミナルで作業用フォルダーを作ります。-lang VBを付けるとVisual Basicのプロジェクトが作成されます。

作成と実行COMMAND
mkdir HelloVisualBasic
cd HelloVisualBasic
dotnet new console -lang VB
dotnet run

Program.vbを次の内容にして、もう一度dotnet runを実行します。

Program.vbVISUAL BASIC
Module Program
    Sub Main(args As String())
        Console.WriteLine("こんにちは、Visual Basic!")
    End Sub
End Module
実行結果OUTPUT
こんにちは、Visual Basic!
動かないとき dotnet --versionでSDKを確認します。ファイルだけでなく、プロジェクトファイル(.vbproj)があるフォルダーで実行してください。
03

基本の書き方

通常は上から順に実行され、文末のセミコロンは不要です。'から行末まではコメントです。大文字と小文字は区別されませんが、エディターが整える表記に揃えると読みやすくなります。

順番とコメントVISUAL BASIC
' 画面へ3行表示する
Console.WriteLine("1番目")
Console.WriteLine(10 + 20)
Console.WriteLine("3番目")
実行結果OUTPUT
1番目
30
3番目

この先の短い例は、Mainの中へ貼り付けて実行します。

04

変数とデータ型

Dim 変数名 As 型 = 値で変数を宣言します。変数の型を明記すると、誤った値の代入を早く発見できます。

主な型VISUAL BASIC
Dim name As String = "Mity"
Dim age As Integer = 20
Dim height As Double = 170.5
Dim isStudent As Boolean = True
Dim price As Decimal = 198.5D

Console.WriteLine($"{name}さんは{age}歳です")
Console.WriteLine($"身長: {height:F1}cm / 学生: {isStudent}")
Console.WriteLine($"価格: {price:F2}円")
実行結果OUTPUT
Mityさんは20歳です
身長: 170.5cm / 学生: True
価格: 198.50円

$"..."は文字列補間です。波かっこの中に変数や式を書けます。金額には10進小数を扱うDecimalが向き、数値の末尾のDはDecimal型を表します。

Option Strict Onを設定しよう Option Strictの既定値はOffです。危険な暗黙変換、遅延バインディング、型を指定しないことによるObject型への推論をコンパイル時に検出するため、.vbprojPropertyGroup<OptionStrict>On</OptionStrict>を追加しましょう。この講座ではOnを前提とし、型変換を明記します。
05

入力と型変換

Console.ReadLine()は文字列を返します。数値へ変換できるかをInteger.TryParseで確かめると、不正な入力でもプログラムが突然終了しません。

年齢を受け取るVISUAL BASIC
Console.Write("年齢を入力してください: ")
Dim input As String = Console.ReadLine()
Dim age As Integer

If Integer.TryParse(input, age) Then
    Console.WriteLine($"来年は{age + 1}歳です")
Else
    Console.WriteLine("整数で入力してください")
End If
実行例OUTPUT
年齢を入力してください: 20
来年は21歳です
06

演算子

種類演算子
計算+ - * / \ Mod ^7 \ 2は3
比較= <> > < >= <=score >= 80
論理AndAlso OrElse Notage >= 18 AndAlso hasTicket
文字列連結&"姓" & "名"
料金計算VISUAL BASIC
Dim price As Integer = 500
Dim count As Integer = 3
Dim subtotal As Integer = price * count
Dim tax As Integer = subtotal * 10 \ 100

Console.WriteLine($"小計: {subtotal}円")
Console.WriteLine($"税込: {subtotal + tax}円")
実行結果OUTPUT
小計: 1500円
税込: 1650円

/は通常の割り算、\は整数除算、Modは余りです。実際の金額計算では業務で定められた端数処理に従います。

07

条件分岐

IfElseIfElseで処理を切り替え、End Ifで閉じます。上から判定し、最初に真になった処理だけを実行します。

点数を判定VISUAL BASIC
Dim score As Integer = 82
Dim result As String

If score >= 80 Then
    result = "合格(よくできました)"
ElseIf score >= 60 Then
    result = "合格"
Else
    result = "再挑戦"
End If

Console.WriteLine(result)
実行結果OUTPUT
合格(よくできました)
08

繰り返し

回数や範囲が決まる処理にはFor、条件が真の間続ける処理にはWhileを使います。

ForVISUAL BASIC
For number As Integer = 1 To 3
    Console.WriteLine($"{number}回目")
Next
実行結果OUTPUT
1回目
2回目
3回目
WhileVISUAL BASIC
Dim count As Integer = 3
While count > 0
    Console.WriteLine(count)
    count -= 1
End While
Console.WriteLine("スタート")
無限ループ count -= 1のような更新を忘れると終了しません。Exit ForExit Whileで途中終了できます。
09

配列とList

配列は要素数が固定、List(Of T)は後から追加・削除できます。どちらも位置は0から数えます。

複数の値VISUAL BASIC
Dim colors() As String = {"赤", "青", "緑"}
Dim fruits As New List(Of String) From {"りんご", "みかん"}
fruits.Add("ぶどう")

Console.WriteLine(colors(0))
For Each fruit As String In fruits
    Console.WriteLine(fruit)
Next
実行結果OUTPUT
赤
りんご
みかん
ぶどう

キーと値を扱うときはDictionary(Of String, Integer)を使います。存在しないキーはTryGetValueで確認すると安全です。

範囲外に注意 3要素で使える位置は0、1、2です。colors(3)IndexOutOfRangeExceptionになります。
10

SubとFunction

Subは値を返さない処理、Functionは計算結果などを返す処理です。次の関数はMainと同じModuleの中、Mainの外へ書きます。

合計を返す関数VISUAL BASIC
Function CalculateTotal(price As Integer, count As Integer) As Integer
    Return price * count
End Function

' Mainの中から呼び出す
Dim total As Integer = CalculateTotal(500, 3)
Console.WriteLine($"合計: {total}円")
実行結果OUTPUT
合計: 1500円
よい関数の目安
  • 名前から役割が分かる
  • 一つの処理に一つの役割を持たせる
  • 表示と計算を分ける
  • 入力と戻り値の型を明記する
11

例外処理

想定できる失敗はTryCatchで処理します。ただし、変換には可能ならTryParseのような例外を使わない方法を選びます。

0による割り算へ対応VISUAL BASIC
Try
    Dim answer As Integer = 10 \ 0
    Console.WriteLine(answer)
Catch ex As DivideByZeroException
    Console.WriteLine("0では割れません")
Finally
    Console.WriteLine("計算を終了します")
End Try
実行結果OUTPUT
0では割れません
計算を終了します

詳しくは例外処理とテストで学びます。

12

ファイルの読み書き

File.WriteAllTextFile.ReadAllTextで小さなテキストを保存できます。

保存して読むVISUAL BASIC
Dim path As String = "memo.txt"
File.WriteAllText(path, "Visual Basicを学習中")
Dim text As String = File.ReadAllText(path)
Console.WriteLine(text)
実行結果OUTPUT
Visual Basicを学習中

詳しくはファイルとJSONで、パスやCSVも含めて学びます。

13

クラスとオブジェクト

クラスは関係するデータと処理をまとめた独自の型です。次のProductProgramとは別のProduct.vbへ書けます。

Product.vbVISUAL BASIC
Public Class Product
    Public Property Name As String
    Public Property Price As Integer

    Public Sub New(name As String, price As Integer)
        Me.Name = name
        Me.Price = price
    End Sub

    Public Function Total(count As Integer) As Integer
        Return Price * count
    End Function
End Class
Mainから使うVISUAL BASIC
Dim book As New Product("VB入門", 2000)
Console.WriteLine(book.Name)
Console.WriteLine(book.Total(2))
実行結果OUTPUT
VB入門
4000

詳しくはクラスとオブジェクトで、プロパティや継承、インターフェースを学びます。

PRACTICE

練習問題:買い物の合計

商品名、単価、個数を入力し、合計を表示するプログラムを作ってください。単価と個数はInteger.TryParseで確認し、単価は0以上、個数は1以上だけを受け付けます。

解答例コードを見る
考え方の一例VISUAL BASIC
Console.Write("商品名: ")
Dim name As String = Console.ReadLine()
Console.Write("単価: ")
Dim priceText As String = Console.ReadLine()
Console.Write("個数: ")
Dim countText As String = Console.ReadLine()

Dim price As Integer
Dim count As Integer
If Integer.TryParse(priceText, price) AndAlso
   Integer.TryParse(countText, count) AndAlso
   price >= 0 AndAlso count >= 1 Then
    Console.WriteLine($"{name}: {price * count}円")
Else
    Console.WriteLine("単価は0以上、個数は1以上の整数で入力してください")
End If

入力例が「ノート」「180」「3」なら、実行結果はノート: 540円です。

NEXT

次に学ぶこと

本編を動かせたら、次のページで小さなプログラムを保守しやすくする知識を身につけましょう。