Excel VBA | 中級者向け VBA 練習問題(配列 / 文字列 / ファイル処理)

VBA
スポンサーリンク

ここからは 中級者向けの VBA 練習問題(配列・文字列処理・ファイル処理)を合計 20問 用意。
すべて 模範解答コードつき なので、すぐ試せます。

配列・Split・Join・Dir・FileSystemObject・正規表現など、実務でよく使う技術を自然に練習できる内容です。


  1. 【配列】問題(1〜7)
    1. 問1(配列):1〜100 の数字を配列に格納して、合計を求めよ
    2. 問2(配列):A1〜A10 の値を配列に読み込み、逆順に B1〜B10 に出力せよ
    3. 問3(配列):動的配列で「ユーザー入力した数値」を全部格納し、合計を出力
    4. 問4(配列):文字列配列の中から「長さ5以上の文字列」だけ出力
    5. 問5(配列):二次元配列(3×3)を作成して九九の一部を格納・出力
    6. 問6(配列):配列の最大値・最小値を求めよ
    7. 問7(配列):シートの A1:A10 を読み込んで「空白以外」を配列に詰め直す
  2. 【文字列処理】問題(8〜14)
    1. 問8(文字列):カンマ区切り文字を Split して1行ずつ出力
    2. 問9(文字列):A列の文字列を Trim → UCase → StrReverse して B列へ
    3. 問10(文字列):住所文字列から郵便番号(数字7桁)だけ抽出(正規表現)
    4. 問11(文字列):複数スペースを1つにまとめる(正規表現)
    5. 問12(文字列):区切った文字列を Join で「/」区切りにして出力
    6. 問13(文字列):A列のメールアドレスから「@より前」を抽出
    7. 問14(文字列):文字列の中から数字だけ抽出(ループ処理)
  3. 【ファイル処理】問題(15〜20)
    1. 問15(ファイル):指定フォルダ内のファイル名を全部出力(Dir 関数)
    2. 問16(ファイル):フォルダ内の .txt ファイルだけ一覧表示
    3. 問17(ファイル):テキストファイルを1行ずつ読み込み、Debug.Print
    4. 問18(ファイル):テキストファイルに配列の中身を書き込む
    5. 問19(ファイル):FileSystemObject を使ってファイルサイズを取得
    6. 問20(ファイル):フォルダ内の CSV を全部読み込んで A列に追記

【配列】問題(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

タイトルとURLをコピーしました