第4回(4月21日)の資料
第4回の資料は、内容がかなり多くて、
事前に予習していて、さいごまで出来るかな~と、
だいたい打ち込んでみたのが、前日の夜でした。
資料に書いてあることをさいごまでやると、
カレンダー作成 のほぼ半分は完成します。
この感じだと、最終 第5回で、
自動作成カレンダー 作れるなと確信しました。
今回の芦原先生の資料、
私がやってみても、かたちが出来上るので、
すごくわかりやすく出来てると思います。
が、これ、予習していかないと、かなりきついと思いました。
1月~12月 のシートを作ってみよう
こんなプロシージャで、即、1月~12月のシートが作成されます。
Dim i
For i = 1 To 12
Worksheets.Add after:=Sheets(i)
ActiveSheet.Name = Str(i) & “月”
Next
End Sub
i & “月” だと、
月は文字列なので、数値 & 文字列になってよくないので、
文字列 & 文字列 にするために、Str(i) にするそうです。
【練習4】セルB27~AF27 に、1~31の日にちを表示。
Cells(27, j + 1) = j について。
問題の前提が、セルB27~なので、変数 j が1の時、
B列=2列目を指定するには、j (= 1 )+ 1 で 2列目。
変数に関しては、第2回 でさんざんやったのに、
もう忘れてます。
Dim i
Dim j
For i = 1 To 12
Worksheets.Add after:=Sheets(i)
ActiveSheet.Name = Str(i) & “月”
For j = 1 To 31
Cells(27, j + 1) = j
Next
Next
End Sub
実行すると、エラーメッセージが出てしまいます。
仕方ないので、終了 をクリックしてから、
いったんVisual Basic を閉じて、sheet1 以外を削除、
Visual Basic を起動して、実行してました。
【練習5】日にちが入る列幅を狭くする。
練習4 を実行すると、1,2,3・・・31までの日にちが入ります。
デフォルトの列幅 8.11 だと、31までの数字には広過ぎる、
というか、これではカレンダーにした場合、
見にくいと思います。
次のコードを追加すると書いてありました。Columns(“B:AF”).ColumnWidth = 3
さいしょ、セルB27~セルAF27かなと思ったのですが、
B列~AF列の列幅を、3に変更するので、
B:AF と、説明してくれました。
Dim i
Dim j
For i = 1 To 12
Worksheets.Add after:=Sheets(i)
Columns(“B:AF”).ColumnWidth = 3
ActiveSheet.Name = Str(i) & “月”
For j = 1 To 31
Cells(27, j + 1) = j
Next
Next
End Sub
ここでも、実行すると、さっきと同じメッセージが出ます。
もう、慣れてきたので、終了 をクリック、
Visual Basic を閉じて、sheet1 以外を削除、
Visual Basic を起動して、実行。
実行すると、列幅が3 になって、見やすくなります。
【練習6】月の最終日が31日、30日、28日の場合
これは、第3回の続き で書いた、
練習(番外1)と、練習(番外2)を応用すればできます。
Dim i
Dim j
Dim saishuubi
For i = 1 To 12
Worksheets.Add after:=Sheets(i)
Columns(“B:AF”).ColumnWidth = 3
ActiveSheet.Name = Str(i) & “月”
Select Case i
Case 1, 3, 5, 7, 8, 10, 12
saishuubi = 31
Case 4, 6, 9, 11
saishuubi = 30
Case 2
saishuubi = 28
End Select
For j = 1 To 31
Cells(27, j + 1) = j
Next
Next
End Sub
などを、少しずつ書き足していくのですが、
実行(動作確認)するたびに、毎回、
実行時エラー “1004”表示が出ます。
動作確認ごとに、元のSheet1 以外の、
1月~12月のシートを削除しないと、エラー表示が出るみたいで、
そのたびに12このシートを削除してます。
第4回の目玉 VBA に用意されてない関数
実行時エラー “1004” の表示を出したくないので、
1月~12月のシートが存在する場合、
動作確認前に削除してくれる関数を1こ作っておく。
名前はなんでもいいけど、
参考サイトでは、SheetDetect となっていたので、
今回は、この名前を使ったそうです。
シートの存在をチェックしてからシートを作成・削除・コピーする
https://xl.hisholy.net/excelvba/sheetdetect/
関数は、独自につくることができます。
第4回の目玉が、このVBAに用意されてない関数を、
独自に作る(外注する) という部分です。
プロシージャの下に、
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
If sht.Name = SName Then
SheetDetect = True
Exit Function
End If
Next
End Function
を書き足します。
SheetDetect
SName
だけは、さいしょから大文字で打ち込まないと、
小文字のままです(下の画像)。
このあと、プロシージャの、For ループ開始直後に、
Worksheets(Str(i) & “月”).Delete
End If
の部分を追加します。
練習4、5、6のコードを書く前に、
この関数を作っておけば、
実行時エラー “1004” にならなかったのでは、
と、復習していたら、疲れたので、続きは次回 で。