Excel VBA事始め その3 ワークブックの作成

閃いた人のイラスト
©いらすとや.

今回は、VBAマクロの書かれたワークブックブックとは別のワークブックを作成し、そこにワークシートを作ってホニャララして保存、というよくある処理の超簡易版。
今回はワークシートは3枚作成して20x20程度のセルを処理する。セルにはVBAマクロ実行開始からの時間(秒)を記入する。ただ、最近の高速なPCだと一瞬で処理が終わってしまうので途中でsleep()でワザと遅延するようにした。sleep()を使うために1行目を記入。

Excel VBA その3 1
ワークシート内で行う処理は、格子模様に塗りつぶして基準時間からの経過時間を値として埋める。今回は、2x2マスを1つの単位として考えて処理することにした。

Excel VBA その3 2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal mlsc As Long)

Sub test()
    Application.DisplayAlerts = False '警告無効化

    Dim zTime As Single
    Dim wbTest As Workbook
    Dim wsTmp As Worksheet
    Dim i As Long, j As Long, k As Long

    zTime = Timer '基準となる時間

    Set wbTest = Workbooks.Add '新しいワークブック追加

    For i = 1 To 3
        With wbTest.Worksheets.Add(after:=wbTest.Worksheets(Worksheets.Count))
            .Name = "Test" & i
            For j = 2 To 20 Step 2      '行側
                For k = 2 To 20 Step 2  '列側
                    With .Cells(j, k)
                        .Interior.ColorIndex = 6
                        .Value = Timer - zTime  '現在と基準の差分
                    End With
                    With .Cells(j + 1, k + 1) '1行下&1列右のセル
                        .Interior.ColorIndex = 6
                        .Value = Timer - zTime  '現在と基準の差分
                    End With

                    Sleep 1 '1ミリ(1000分の1)秒停止

                Next
            Next
            .Cells(1, 1).Value = Timer - zTime '現在と基準の差分
        End With
    Next

    For Each wsTmp In wbTest.Worksheets 'ワークブック内の各シートに於いて
        With wsTmp
            .Activate '次のセルの選択のためにはワークシートをアクティブにする必要あり
            .Cells(1, 1).Select '各ワークシートのA1セルを選択 (今回の例では不要だが古いマナー的に)
            If Not .Name Like "Test*" Then
                .Delete 'ワークシートの削除 削除の後にはそのワークシートに対する操作を書くのはNG
            End If
        End With
    Next

    With wbTest
        .Sheets(1).Activate '先頭のシートを選択 (古いマナーとして)
        .SaveAs _
        Filename:=ThisWorkbook.Path & "\Test" & Format(Time, "hhmmss") & ".xlsx", _
        FileFormat:=xlWorkbookDefault, _
        Password:="password", _
        WriteResPassword:="", _
        ReadOnlyRecommended:=False, _
        CreateBackup:=False
        .Close 'ワークブックを閉じる
    End With
End Sub

Workbooks.Add   新規ワークブックの作成
Worksheets.Add   新規ワークシートの作成

ワークブック型の変数を作って新しく作るワークブックをセットする。
dim 変数名 As Workbook
set 変数名 = Workbooks.Add

ワークシート型の変数を作って新しく作るワークシートをセットする。
dim 変数名 As Worksheet
set 変数名 = ワークブック.Worksheets.Add
単に.Addだけだとワークブックの先頭に新しいシートを作成されてしまうので Worksheets.Add after:=指定ワークシート とすることで指定ワークシートの後に新しいワークシートが作成される。Set文などで指定するときは(after:=指定ワークシート)のように括弧付きにする。afterの代わりにbeforeなど。
実際には指定ワークシートというのが不定なことが多いので after:=Worksheets(Worksheets.Count) とすることでワークシート数を数えてその後にワークシートを作成する(既存のワークシートの末尾に新しいワークシートを追加される)。

Excel VBA その3 3
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal mlsc As Long)

Sub test()
    Application.DisplayAlerts = False '警告無効化

    Dim zTime As Single
    Dim wsTmp As Worksheet
    Dim i As Long, j As Long, k As Long

    zTime = Timer '基準となる時間

    With Workbooks.Add '新しいワークブック追加
        For i = 1 To 3
            With .Worksheets.Add(after:=.Worksheets(Worksheets.Count))
                .Name = "Test" & i
                For j = 2 To 20 Step 2      '行側
                    For k = 2 To 20 Step 2  '列側
                        With .Cells(j, k)
                            .Interior.ColorIndex = 6
                            .Value = Timer - zTime  '現在と基準の差分
                        End With
                        With .Cells(j + 1, k + 1) '1行下&1列右のセル
                            .Interior.ColorIndex = 6
                            .Value = Timer - zTime  '現在と基準の差分
                        End With

                        Sleep 1 '1ミリ(1000分の1)秒停止

                    Next
                Next
                .Cells(1, 1).Value = Timer - zTime '現在と基準の差分
            End With
        Next

        For Each wsTmp In .Worksheets 'ワークブック内の各シートに於いて
            With wsTmp
                .Activate '次のセルの選択のためにはワークシートをアクティブにする必要あり
                .Cells(1, 1).Select '各ワークシートのA1セルを選択 (今回の例では不要だが古いマナー的に)
                If Not .Name Like "Test*" Then
                    .Delete 'ワークシートの削除 削除の後にはそのワークシートに対する操作を書くのはNG
                End If
            End With
        Next

        .Sheets(1).Activate '先頭のシートを選択 (古いマナーとして)
        .SaveAs _
        Filename:=ThisWorkbook.Path & "\Test" & Format(Time, "hhmmss") & ".xlsx", _
        FileFormat:=xlWorkbookDefault, _
        Password:="password", _
        WriteResPassword:="", _
        ReadOnlyRecommended:=False, _
        CreateBackup:=False
        .Close 'ワークブックを閉じる
    End With
End Sub

先程はWorkbook型の変数を使ったが、今回は使わない。処理内容は同じで違うのはほぼその部分の書き方だけ。

With Workbooks.Add
    処理
    .SaveAs ホニャララ 'ファイル保存
    .Close  'ワークシートを閉じる
End With

2つの書き方で、どちらが読みやすいかは人それぞれだろうけど、「がとらぼ」の中の人は前者のような書き方の方が好きかな(まどろっこしいけど)。

Excel VBA その3 4
実行するとワークブックが出力される。
そのファイルを開く。ファイル名は「Test」+「実行時の時分秒」.xlsxで、ファイル保護パスワードは「password」。

Excel VBA その3 5
ワークシートが3つ存在し、それぞれにセルの処理を行い、セルにはVBAマクロの実行開始からの経過時間(秒)が入っている。

「がとらぼ」の中の人はアタマが悪くてリファレンスで関数の引数とか見ても全然理解しないタイプで、実際に関数が使われている例を見る方がアタマに入りやすいので、今後も使い方の例を挙げる形で予定しています。プログラムの本職の人などからすると全然スタンス違うかもだけど、本職の人はリファレンス見たらわかるでしょうし。ガチでプログラムをやりたいというのではないけどExcelで仕事をラクになんとかしたいという人向けに使えそうなのを残していく感じで。