VBAで~ 第4回 SheetDetect という関数を作る

第4回(4月21日)の資料

第4回の資料は、内容がかなり多くて、
事前に予習していて、さいごまで出来るかな~と、
だいたい打ち込んでみたのが、前日の夜でした。
資料に書いてあることをさいごまでやると、
カレンダー作成 のほぼ半分は完成します。
この感じだと、最終 第5回で、
自動作成カレンダー 作れるなと確信しました。


今回の芦原先生の資料、
私がやってみても、かたちが出来上るので、
すごくわかりやすく出来てると思います。
が、これ、予習していかないと、かなりきついと思いました。

 

1月~12月 のシートを作ってみよう

こんなプロシージャで、即、1月~12月のシートが作成されます。

Sub sample()
  Dim i
  For i = 1 To 12
    Worksheets.Add after:=Sheets(i)
    ActiveSheet.Name = Str(i) & “月”
  Next
End Sub

 

 

 

微調整 数値を文字列化
変数によく使う、i は数値というものだそうで、
i & “月” だと、
月は文字列なので、数値 & 文字列になってよくないので、
文字列 & 文字列 にするために、Str(i) にするそうです。

 

 

【練習4】セルB27~AF27 に、1~31の日にちを表示。

Cells(27, j + 1) = j  について。
問題の前提が、セルB27~なので、変数 j が1の時、
B列=2列目を指定するには、j (= 1 )+ 1 で 2列目。
変数に関しては、第2回 でさんざんやったのに、
もう忘れてます。

 

Sub sample()
  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 と、説明してくれました。

 

Sub sample()
  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)を応用すればできます。

Sub sample()
  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に用意されてない関数を、
独自に作る(外注する) という部分です。

プロシージャの下に、

Function SheetDetect(SName As String) As Boolean
  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 ループ開始直後に、

    If sheetdetect(Str(i) & “月”) Then
      Worksheets(Str(i) & “月”).Delete
    End If 

の部分を追加します。



練習4、5、6のコードを書く前に、
この関数を作っておけば、
実行時エラー “1004”  にならなかったのでは、
と、復習していたら、疲れたので、続きは次回 で。

 

 

サイトマップ