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

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) とすることでワークシート数を数えてその後にワークシートを作成する(既存のワークシートの末尾に新しいワークシートを追加される)。

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つの書き方で、どちらが読みやすいかは人それぞれだろうけど、「がとらぼ」の中の人は前者のような書き方の方が好きかな(まどろっこしいけど)。
実行するとワークブックが出力される。
そのファイルを開く。ファイル名は「Test」+「実行時の時分秒」.xlsxで、ファイル保護パスワードは「password」。
ワークシートが3つ存在し、それぞれにセルの処理を行い、セルにはVBAマクロの実行開始からの経過時間(秒)が入っている。
「がとらぼ」の中の人はアタマが悪くてリファレンスで関数の引数とか見ても全然理解しないタイプで、実際に関数が使われている例を見る方がアタマに入りやすいので、今後も使い方の例を挙げる形で予定しています。プログラムの本職の人などからすると全然スタンス違うかもだけど、本職の人はリファレンス見たらわかるでしょうし。ガチでプログラムをやりたいというのではないけどExcelで仕事をラクになんとかしたいという人向けに使えそうなのを残していく感じで。

販売価格: 11,682 円
(2022年08月08日 6:00時点の参考価格)

販売価格: 29,502 円
(2022年08月08日 6:00時点の参考価格)