ここからは 中級者向けの VBA 練習問題(配列・文字列処理・ファイル処理)を合計 20問 用意。
すべて 模範解答コードつき なので、すぐ試せます。
配列・Split・Join・Dir・FileSystemObject・正規表現など、実務でよく使う技術を自然に練習できる内容です。
【配列】問題(1〜7)
問1(配列):1〜100 の数字を配列に格納して、合計を求めよ
Sub P1()
Dim arr(1 To 100) As Long
Dim i As Long, total As Long
For i = 1 To 100
arr(i) = i
total = total + arr(i)
Next i
MsgBox total
End Sub
VB問2(配列):A1〜A10 の値を配列に読み込み、逆順に B1〜B10 に出力せよ
Sub P2()
Dim arr(1 To 10) As Variant
Dim i As Long
For i = 1 To 10
arr(i) = Cells(i, "A").Value
Next i
For i = 1 To 10
Cells(i, "B").Value = arr(11 - i)
Next i
End Sub
VB問3(配列):動的配列で「ユーザー入力した数値」を全部格納し、合計を出力
※ キャンセルで終了
Sub P3()
Dim arr() As Double
Dim i As Long, v As Variant
Do
v = InputBox("数値を入力(キャンセルで終了)")
If v = "" Then Exit Do
ReDim Preserve arr(0 To i)
arr(i) = CDbl(v)
i = i + 1
Loop
Dim total As Double
For i = LBound(arr) To UBound(arr)
total = total + arr(i)
Next i
MsgBox "合計=" & total
End Sub
VB問4(配列):文字列配列の中から「長さ5以上の文字列」だけ出力
Sub P4()
Dim arr As Variant
Dim s As Variant
arr = Array("apple", "cat", "banana", "dog", "orange")
For Each s In arr
If Len(s) >= 5 Then Debug.Print s
Next s
End Sub
VB問5(配列):二次元配列(3×3)を作成して九九の一部を格納・出力
Sub P5()
Dim arr(1 To 3, 1 To 3) As Long
Dim r As Long, c As Long
For r = 1 To 3
For c = 1 To 3
arr(r, c) = r * c
Debug.Print arr(r, c);
Next c
Debug.Print
Next r
End Sub
VB問6(配列):配列の最大値・最小値を求めよ
Sub P6()
Dim arr As Variant
arr = Array(10, 35, 2, 99, 17)
Dim maxV As Double, minV As Double
Dim v As Variant
maxV = arr(0): minV = arr(0)
For Each v In arr
If v > maxV Then maxV = v
If v < minV Then minV = v
Next v
MsgBox "max=" & maxV & " min=" & minV
End Sub
VB問7(配列):シートの A1:A10 を読み込んで「空白以外」を配列に詰め直す
(動的配列フィルタ)
Sub P7()
Dim arr() As Variant
Dim i As Long, v As Variant, c As Long
For i = 1 To 10
v = Cells(i, "A").Value
If Trim(v) <> "" Then
ReDim Preserve arr(0 To c)
arr(c) = v
c = c + 1
End If
Next i
For i = 0 To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
VB【文字列処理】問題(8〜14)
問8(文字列):カンマ区切り文字を Split して1行ずつ出力
Sub P8()
Dim s As String: s = "A,B,C,D,E"
Dim arr As Variant
Dim v As Variant
arr = Split(s, ",")
For Each v In arr
Debug.Print v
Next v
End Sub
VB問9(文字列):A列の文字列を Trim → UCase → StrReverse して B列へ
Sub P9()
Dim i As Long, s As String
For i = 1 To 20
s = Trim(Cells(i, "A").Value)
s = UCase(s)
Cells(i, "B").Value = StrReverse(s)
Next i
End Sub
VB問10(文字列):住所文字列から郵便番号(数字7桁)だけ抽出(正規表現)
Sub P10()
Dim reg As Object, m As Object
Set reg = CreateObject("VBScript.Regexp")
reg.Pattern = "\d{7}"
reg.Global = False
Dim s As String: s = "〒1234567 東京都○○区"
If reg.test(s) Then
Set m = reg.Execute(s)(0)
MsgBox "郵便番号=" & m.Value
End If
End Sub
VB問11(文字列):複数スペースを1つにまとめる(正規表現)
Sub P11()
Dim reg As Object
Set reg = CreateObject("VBScript.Regexp")
reg.Pattern = " +"
reg.Global = True
Dim s As String
s = "Tokyo Metropolis Japan"
MsgBox reg.Replace(s, " ")
End Sub
VB問12(文字列):区切った文字列を Join で「/」区切りにして出力
Sub P12()
Dim arr As Variant
arr = Array("2025", "11", "17")
MsgBox Join(arr, "/")
End Sub
VB問13(文字列):A列のメールアドレスから「@より前」を抽出
Sub P13()
Dim i As Long, s As String
For i = 1 To 20
s = Cells(i, "A").Value
If InStr(s, "@") > 0 Then
Cells(i, "B").Value = Left(s, InStr(s, "@") - 1)
End If
Next i
End Sub
VB問14(文字列):文字列の中から数字だけ抽出(ループ処理)
Sub P14()
Dim s As String: s = "a1b23c4d"
Dim i As Long, r As String
For i = 1 To Len(s)
If Mid(s, i, 1) Like "#" Then
r = r & Mid(s, i, 1)
End If
Next i
MsgBox r ' → 1234
End Sub
VB【ファイル処理】問題(15〜20)
問15(ファイル):指定フォルダ内のファイル名を全部出力(Dir 関数)
Sub F15()
Dim path As String, f As String
path = "C:\Test\"
f = Dir(path & "*.*")
Do While f <> ""
Debug.Print f
f = Dir()
Loop
End Sub
VB問16(ファイル):フォルダ内の .txt ファイルだけ一覧表示
Sub F16()
Dim path As String, f As String
path = "C:\Test\"
f = Dir(path & "*.txt")
Do While f <> ""
Debug.Print f
f = Dir()
Loop
End Sub
VB問17(ファイル):テキストファイルを1行ずつ読み込み、Debug.Print
Sub F17()
Dim f As Integer: f = FreeFile
Open "C:\Test\data.txt" For Input As #f
Dim line As String
Do While Not EOF(f)
Line Input #f, line
Debug.Print line
Loop
Close #f
End Sub
VB問18(ファイル):テキストファイルに配列の中身を書き込む
Sub F18()
Dim arr As Variant
arr = Array("Apple", "Banana", "Cherry")
Dim f As Integer: f = FreeFile
Open "C:\Test\out.txt" For Output As #f
Dim v As Variant
For Each v In arr
Print #f, v
Next v
Close #f
End Sub
VB問19(ファイル):FileSystemObject を使ってファイルサイズを取得
Sub F19()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim f As Object
Set f = fso.GetFile("C:\Test\data.txt")
MsgBox "サイズ = " & f.Size & " バイト"
End Sub
VB問20(ファイル):フォルダ内の CSV を全部読み込んで A列に追記
Sub F20()
Dim path As String: path = "C:\Test\"
Dim fn As String
Dim f As Integer
fn = Dir(path & "*.csv")
Dim row As Long: row = 1
Dim line As String
Do While fn <> ""
f = FreeFile
Open path & fn For Input As #f
Do While Not EOF(f)
Line Input #f, line
Cells(row, "A").Value = line
row = row + 1
Loop
Close #f
fn = Dir()
Loop
End Sub
VB
