エクセルで曜日を自動入力するマクロの作り方を紹介【コピペして使えるサンプルVBAを掲載】

Left Caption

疑問がある人

エクセルで曜日を自動入力する方法を教えてほしい!

こんな要望にお応えします。

この記事では、日付の情報から曜日を自動入力するVBAの作り方を3つのサンプル事例を使って詳しくご紹介しています。

エクセルで予定表の管理、カレンダーの編集、日付の入力が必要な申請書の作成といった業務をしている方に役立つ内容になっていますので是非参考にしてください。

 

広告

曜日の自動入力とは

曜日の自動入力とは、「日付の情報から適切な曜日を自動で入力する」ことです。

Right Caption

拒否する人

手動での曜日入力はかなりめんどうだし、記入ミスをしてしまう可能性がある

スケジュール調整を行う上で、曜日の入力を間違ってしまうと「休日に仕事を入れてしまう」ことにも繋がります。曜日の入力は関数やVBAを使って自動化してしまうことがおすすめです。

 

上記の表には、「曜日を自動入力し、土曜は青、日曜は赤にする」VBAが設定されています。年数と月数を入力してボタンをクリックするだけで曜日を自動入力することができます。

 

私の職場では、申請書や打合票といった日付と曜日の記入が必要な書類の作成・チェック業務が多くあります。連日書類の作成、チェック作業を行っていると曜日で書類を管理するようになります。

 

Right Caption

作業する人

この書類は火曜日までに処理をすればいいから来週に処理しよう!これは土曜日に必要な書類だから上司のいる金曜までに処理しよう!

上記のように「曜日を軸にして仕事をする」ようになった場合、曜日の編集が間違ってしまうとスケジュールがズレて大変なことになってしまいます。曜日入力は自動編集にして間違った曜日が曜日が絶対に記入されない設定にすることをおすすめします。

 

曜日を自動入力するサンプル事例

サンプル事例を使って、曜日を自動入力するVBAの設定方法を解説していきます。

 

  • 年間カレンダーの曜日を自動入力
  • 月間カレンダーの曜日を自動入力
  • 1ヶ月分の予定表の曜日を自動入力

上記3つのサンプル事例に導入された曜日を自動入力VBAを自由に扱えるようになれば、いろんなエクセル業務に応用することができるようになるはずです。是非参考にしてみてください。

 

サンプル事例① 年間カレンダーの曜日を自動入力

 

「ユーザーフォームに年数を入力して実行ボタンを押す」だけで年間カレンダーを作成することができます。年数をかえて実行ボタンを押すと、曜日が自動編集されます。

年間カレンダーVBAの導入方法

1.様式の設定

 

2.VBAを起動

3.標準モジュールを作成

 

4.Module1にサンプルVBAを記入

 

5.Module1に記入するサンプルVBA

Sub 年カレンダー年設定()
    Application.ScreenUpdating = False
    Dim Ash As Worksheet
    Dim Bsh As Worksheet
    Set Ash = ThisWorkbook.Worksheets("年間カレンダー")
    Set Bsh = ThisWorkbook.Worksheets("月間カレンダー")
    Dim b As Boolean
    i = UserForm1.TextBox1.Value
    Ash.Cells(1, 1) = i & "年"
    Ash.Cells.Interior.ColorIndex = xlNone
    If (Day(DateSerial(i, 2, 28) + 1)) = 29 Then
    Ash.Cells(34, 6) = "29"
    Else
    Ash.Cells(34, 6).ClearContents
    Ash.Cells(34, 7).ClearContents
    End If
    For j = 1 To 56 Step 5
    tuki = Mo(Ash.Range(Ash.Cells(4, j), Ash.Cells(4, j)))
    For k = 6 To 36
    hizuke = Ash.Cells(k, j)
    On Error Resume Next
    If Ash.Cells(k, j) <> "" Then
    Ash.Cells(k, j + 1) = WeekdayName(Weekday(i & "/" & tuki & "/" & hizuke), True)
    Else
    End If
    Next k
    Next j
    For i = 2 To 57 Step 5
    For j = 6 To 36
    If Ash.Cells(j, i) = "日" Then
    Ash.Range(Ash.Cells(j, i - 1), Ash.Cells(j, i)).Interior.Color = RGB(255, 180, 180)
    ElseIf Ash.Cells(j, i) = "土" Then
    Ash.Range(Ash.Cells(j, i - 1), Ash.Cells(j, i)).Interior.Color = RGB(205, 255, 255)
    Else
    End If
    Next
    Next
End Sub

 

6.ユーザーフォームの作成

 

7.ユーザーフォームオブジェクトの作成

 

8.ユーザーフォームコードの作成

 

9.ユーザーフォームに記入するサンプルVAB

Private Sub CommandButton1_Click()
  Call 年カレンダー年設定
  '今回のサンプルでは下記のコードをつかいません
 'Call 年カレンダー月設定
End Sub

 

10.VBAを実行

 

ユーザーフォームに年数を入力し、実行を押すと年間カレンダーが作成されます。

今回は年間カレンダーを作成する部分のVBAの作り方を解説しています。このエクセルカレンダーには「予定を転記するVBA」や「ハイパーリンクVBA」など便利なVBAが設定されています。VBAが設定されたエクセルカレンダーは下記のサイトでダウンロードしてお使いいただけます。

 

<<便利なVBAが設定されたエクセルカレンダーのダウンロードはこちら

 

Left Caption

ガッツポーズの人

気になる方はダウンロードして利用してみてください。

 

サンプル事例② 月間カレンダーの曜日を自動入力

 

 

「ユーザーフォームに年数を入力して実行ボタンを押す」だけで月間カレンダーを作成することができます。年数をかえて実行ボタンを押すと、適切な曜日の場所に適切な日付が入力されます。この月間カレンダーはサンプル事例①で紹介している年間カレンダーとセットでVBAを作り込む必要がります

 

月間カレンダーVBAの導入方法

1.様式の設定

 

2.VBAを起動

 

3.標準モジュールを作成

 

4.Module2にサンプルVBAを記入

 

5.Module2に記入するサンプルVBA

Sub 月カレンダー月設定()
    Application.ScreenUpdating = False
    Dim Ash As Worksheet
    Dim Bsh As Worksheet
    Set Ash = ThisWorkbook.Worksheets("年間カレンダー")
    Set Bsh = ThisWorkbook.Worksheets("月間カレンダー")
    i = UserForm2.TextBox2.Value
    For j = 1 To 12
    Bsh.Cells(42 * j - 41, 1) = i & "年" & j & "月"
    Next
    For i = 0 To 462 Step 42
    For j = 1 To 7
    Bsh.Cells(6 + i, j * 9 - 8) = j
    Bsh.Cells(6 + i, j * 9 - 8).NumberFormatLocal = "0"
    Bsh.Cells(12 + i, j * 9 - 8) = j + 7
    Bsh.Cells(12 + i, j * 9 - 8).NumberFormatLocal = "0"
    Bsh.Cells(18 + i, j * 9 - 8) = j + 14
    Bsh.Cells(18 + i, j * 9 - 8).NumberFormatLocal = "0"
    Bsh.Cells(24 + i, j * 9 - 8) = j + 21
    Bsh.Cells(24 + i, j * 9 - 8).NumberFormatLocal = "0"
    Bsh.Cells(30 + i, j * 9 - 8) = j + 28
    Bsh.Cells(30 + i, j * 9 - 8).NumberFormatLocal = "0"
    Bsh.Cells(36 + i, j * 9 - 8) = j + 35
    Bsh.Cells(36 + i, j * 9 - 8).NumberFormatLocal = "0"
    Next
    Next
    Call 月1
    Call 月2
    Call 月3
    Call 月4
    Call 月5
    Call 月6
    Call 月7
    Call 月8
    Call 月9
    Call 月10
    Call 月11
    Call 月12
End Sub
Sub 月1()
    Application.ScreenUpdating = False
    Dim Ash As Worksheet
    Dim Bsh As Worksheet
    Set Ash = ThisWorkbook.Worksheets("年間カレンダー")
    Set Bsh = ThisWorkbook.Worksheets("月間カレンダー")
    If Ash.Cells(6, 2) = "火" Then
    For j = 1 To 7
    Bsh.Cells(6, j * 9 - 8) = Bsh.Cells(6, j * 9 - 8) - 1
    Bsh.Cells(12, j * 9 - 8) = Bsh.Cells(12, j * 9 - 8) - 1
    Bsh.Cells(18, j * 9 - 8) = Bsh.Cells(18, j * 9 - 8) - 1
    Bsh.Cells(24, j * 9 - 8) = Bsh.Cells(24, j * 9 - 8) - 1
    Bsh.Cells(30, j * 9 - 8) = Bsh.Cells(30, j * 9 - 8) - 1
    Bsh.Cells(36, j * 9 - 8) = Bsh.Cells(36, j * 9 - 8) - 1
    Next
    ElseIf Ash.Cells(6, 2) = "水" Then
    For j = 1 To 7
    Bsh.Cells(6, j * 9 - 8) = Bsh.Cells(6, j * 9 - 8) - 2
    Bsh.Cells(12, j * 9 - 8) = Bsh.Cells(12, j * 9 - 8) - 2
    Bsh.Cells(18, j * 9 - 8) = Bsh.Cells(18, j * 9 - 8) - 2
    Bsh.Cells(24, j * 9 - 8) = Bsh.Cells(24, j * 9 - 8) - 2
    Bsh.Cells(30, j * 9 - 8) = Bsh.Cells(30, j * 9 - 8) - 2
    Bsh.Cells(36, j * 9 - 8) = Bsh.Cells(36, j * 9 - 8) - 2
    Next
    ElseIf Ash.Cells(6, 2) = "木" Then
    For j = 1 To 7
    Bsh.Cells(6, j * 9 - 8) = Bsh.Cells(6, j * 9 - 8) - 3
    Bsh.Cells(12, j * 9 - 8) = Bsh.Cells(12, j * 9 - 8) - 3
    Bsh.Cells(18, j * 9 - 8) = Bsh.Cells(18, j * 9 - 8) - 3
    Bsh.Cells(24, j * 9 - 8) = Bsh.Cells(24, j * 9 - 8) - 3
    Bsh.Cells(30, j * 9 - 8) = Bsh.Cells(30, j * 9 - 8) - 3
    Bsh.Cells(36, j * 9 - 8) = Bsh.Cells(36, j * 9 - 8) - 3
    Next
    ElseIf Ash.Cells(6, 2) = "金" Then
    For j = 1 To 7
    Bsh.Cells(6, j * 9 - 8) = Bsh.Cells(6, j * 9 - 8) - 4
    Bsh.Cells(12, j * 9 - 8) = Bsh.Cells(12, j * 9 - 8) - 4
    Bsh.Cells(18, j * 9 - 8) = Bsh.Cells(18, j * 9 - 8) - 4
    Bsh.Cells(24, j * 9 - 8) = Bsh.Cells(24, j * 9 - 8) - 4
    Bsh.Cells(30, j * 9 - 8) = Bsh.Cells(30, j * 9 - 8) - 4
    Bsh.Cells(36, j * 9 - 8) = Bsh.Cells(36, j * 9 - 8) - 4
    Next
    ElseIf Ash.Cells(6, 2) = "土" Then
    For j = 1 To 7
    Bsh.Cells(6, j * 9 - 8) = Bsh.Cells(6, j * 9 - 8) - 5
    Bsh.Cells(12, j * 9 - 8) = Bsh.Cells(12, j * 9 - 8) - 5
    Bsh.Cells(18, j * 9 - 8) = Bsh.Cells(18, j * 9 - 8) - 5
    Bsh.Cells(24, j * 9 - 8) = Bsh.Cells(24, j * 9 - 8) - 5
    Bsh.Cells(30, j * 9 - 8) = Bsh.Cells(30, j * 9 - 8) - 5
    Bsh.Cells(36, j * 9 - 8) = Bsh.Cells(36, j * 9 - 8) - 5
    Next
    ElseIf Ash.Cells(6, 2) = "日" Then
    For j = 1 To 7
    Bsh.Cells(6, j * 9 - 8) = Bsh.Cells(6, j * 9 - 8) - 6
    Bsh.Cells(12, j * 9 - 8) = Bsh.Cells(12, j * 9 - 8) - 6
    Bsh.Cells(18, j * 9 - 8) = Bsh.Cells(18, j * 9 - 8) - 6
    Bsh.Cells(24, j * 9 - 8) = Bsh.Cells(24, j * 9 - 8) - 6
    Bsh.Cells(30, j * 9 - 8) = Bsh.Cells(30, j * 9 - 8) - 6
    Bsh.Cells(36, j * 9 - 8) = Bsh.Cells(36, j * 9 - 8) - 6
    Next
    Else
    End If
    For j = 1 To 7
    If Bsh.Cells(6, j * 9 - 8) <= 0 Then Bsh.Cells(6, j * 9 - 8).ClearContents Else End If Next For j = 1 To 7 If Bsh.Cells(30, j * 9 - 8) > 31 Then
    Bsh.Cells(30, j * 9 - 8).ClearContents
    Else
    End If
    Next
    For j = 1 To 7
    If Bsh.Cells(36, j * 9 - 8) > 31 Then
    Bsh.Cells(36, j * 9 - 8).ClearContents
    Else
    End If
    Next
End Sub

Sub月1()というVBAは、「年間カレンダーの1月の情報を元に月間カレンダーの1月分の編集をしている」ということです。2月から12月まで同じようなVBAの設定が必要ですが、今回は省略させていただきます。

 

6.ユーザーフォームの作成

 

7.ユーザーフォームオブジェクトの作成

 

8.ユーザーフォームコードの作成

 

9.ユーザーフォームに記入するサンプルVAB

Private Sub CommandButton2_Click()
  Call 月カレンダー年設定
  Call 月カレンダー月設定
End Sub

 

10.VBAの実行

 

サンプル事例③ 1ヶ月分の予定表の曜日を自動入力

 

AI1セルの年数と月数を入力し「日付変更ボタン」を押すだけで予定表の日付、曜日を編集することができます。末日が30日または31日、うるう年に対応しているので日付と曜日の編集をする必要は一切ありません。

 

予定表VBAの導入方法

1.様式の設定

 

 

2.VBAを起動

 

 

3.標準モジュールを作成

 

 

4.ModuleにサンプルVBAを記入

 

5.サンプルVBA

Sub 日付()
For i = 1 To 31
Cells(3, i + 3) = i
Next
If Month(Cells(1, 35)) = "2" Then
GoTo L1
ElseIf Month(Cells(1, 35)) = "1" Or Month(Cells(1, 35)) = "3" Or Month(Cells(1, 35)) = "5" Or Month(Cells(1, 35)) = "7" Or Month(Cells(1, 35)) = "8" Or Month(Cells(1, 35)) = "10" Or Month(Cells(1, 35)) = "12" Then
For i = 4 To 34
Cells(4, i) = WeekdayName(Weekday(Year(Cells(1, 35)) & "/" & Month(Cells(1, 35)) & "/" & Cells(3, i)), True)
Next
Else
For i = 4 To 33
Cells(4, i) = WeekdayName(Weekday(Year(Cells(1, 35)) & "/" & Month(Cells(1, 35)) & "/" & Cells(3, i)), True)
Next
Cells(3, 34).ClearContents
Cells(4, 34).ClearContents
End If
L1:
If Month(Cells(1, 35)) = "2" And (Day(DateSerial(Year(Cells(1, 35)), 2, 28) + 1)) = 29 Then
Range(Cells(3, 33), Cells(4, 34)).ClearContents
For i = 4 To 32
Cells(4, i) = WeekdayName(Weekday(Year(Cells(1, 35)) & "/" & Month(Cells(1, 35)) & "/" & Cells(3, i)), True)
Next
ElseIf Month(Cells(1, 35)) = "2" And (Day(DateSerial(Year(Cells(1, 35)), 2, 28) + 1)) <> 29 Then
Range(Cells(3, 32), Cells(4, 34)).ClearContents
For i = 4 To 31
Cells(4, i) = WeekdayName(Weekday(Year(Cells(1, 35)) & "/" & Month(Cells(1, 35)) & "/" & Cells(3, i)), True)
Next
Else
End If
For i = 4 To 34
If Cells(4, i) = "土" Then
Cells(4, i).Font.Color = RGB(0, 176, 250)
ElseIf Cells(4, i) = "日" Then
Cells(4, i).Font.Color = RGB(255, 0, 0)
Else
Cells(4, i).Font.Color = RGB(0, 0, 0)
End If
Next
Range(Cells(3, 4), Cells(4, 34)).HorizontalAlignment = xlCenter
End Sub

 

6.ボタンの作成

7.ボタンにマクロを登録

8.VBAを実行

下記の記事ではサンプル事例③で紹介している予定表をチェック表として利用する方法について詳しく解説しています。曜日を自動編集するVBAの他に以下のようなVBAが設定されています。

 

  • クリックすると背景色を変更するVBA
  • 締め切り期日が近づくと項目の背景色が変化するVBA
  • チェック欄をクリックするとテキストが入力されるVBA

 

チェック操作を自動化し、本来のチェック業務に専念できるVBAが設定されています。チェック作業の多い方は是非参考にしてみてください。

 

 

曜日の入力は関数ではなくVBAの設定がおすすめ

曜日の入力は手入力や関数を利用する方法ではなく、VBAを使った自動入力する方法がおすすめです。

なぜなら、手入力や関数を使った入力では曜日の記入漏れや記入ミスが発生する可能性が高いからです。

関数を使って曜日の入力を自動化しているエクセルファイルをよく見かけますが、関数が壊されたり日付を入力するセルの場所が変更になったときすぐに使えなくなってしまいます。VBAを設定すれば関数を壊される心配がなく、一度設定してしまえばずっと使い続けることができます。

VBAでは、「土曜、日曜の背景色を変更する。定休日の曜日の背景色を変更する。」など、曜日の編集+αの条件を自由に付け加えることができます。便利に、効率よく曜日の設定を行うのであれば、VBAの利用をおすすめします。