疑問がある人
こんな要望にお応えします。
この記事では、日付の情報から曜日を自動入力するVBAの作り方を3つのサンプル事例を使って詳しくご紹介しています。
エクセルで予定表の管理、カレンダーの編集、日付の入力が必要な申請書の作成といった業務をしている方に役立つ内容になっていますので是非参考にしてください。
目次
曜日の自動入力とは
曜日の自動入力とは、「日付の情報から適切な曜日を自動で入力する」ことです。
拒否する人
スケジュール調整を行う上で、曜日の入力を間違ってしまうと「休日に仕事を入れてしまう」ことにも繋がります。曜日の入力は関数やVBAを使って自動化してしまうことがおすすめです。
上記の表には、「曜日を自動入力し、土曜は青、日曜は赤にする」VBAが設定されています。年数と月数を入力してボタンをクリックするだけで曜日を自動入力することができます。
私の職場では、申請書や打合票といった日付と曜日の記入が必要な書類の作成・チェック業務が多くあります。連日書類の作成、チェック作業を行っていると曜日で書類を管理するようになります。
作業する人
上記のように「曜日を軸にして仕事をする」ようになった場合、曜日の編集が間違ってしまうとスケジュールがズレて大変なことになってしまいます。曜日入力は自動編集にして間違った曜日が曜日が絶対に記入されない設定にすることをおすすめします。
曜日を自動入力するサンプル事例
サンプル事例を使って、曜日を自動入力する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が設定されたエクセルカレンダーのダウンロードはこちら
ガッツポーズの人
サンプル事例② 月間カレンダーの曜日を自動入力
「ユーザーフォームに年数を入力して実行ボタンを押す」だけで月間カレンダーを作成することができます。年数をかえて実行ボタンを押すと、適切な曜日の場所に適切な日付が入力されます。この月間カレンダーはサンプル事例①で紹介している年間カレンダーとセットで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で便利なチェック表を作り方法を詳しくご紹介しています。仕事では、工事監督業というものがあり、いろんな業務を並行して同時に進めなければなりません。ほとんどの業務が期限が決まっているので進捗管理がとても重要になります。「この業務は明日までに終わらせなければいけないから優先させて、あの業務はいつまでに終わらせよう」と頭の中で考えていると、「業務のやり忘れ」が生じてしまいます。そんな「... チェック表をエクセルで作成する方法【クリックするだけでチェック処理できるマク... - mamemametochan.com |
曜日の入力は関数ではなくVBAの設定がおすすめ
曜日の入力は手入力や関数を利用する方法ではなく、VBAを使った自動入力する方法がおすすめです。
なぜなら、手入力や関数を使った入力では曜日の記入漏れや記入ミスが発生する可能性が高いからです。
関数を使って曜日の入力を自動化しているエクセルファイルをよく見かけますが、関数が壊されたり日付を入力するセルの場所が変更になったときすぐに使えなくなってしまいます。VBAを設定すれば関数を壊される心配がなく、一度設定してしまえばずっと使い続けることができます。
VBAでは、「土曜、日曜の背景色を変更する。定休日の曜日の背景色を変更する。」など、曜日の編集+αの条件を自由に付け加えることができます。便利に、効率よく曜日の設定を行うのであれば、VBAの利用をおすすめします。
VBA初心者が効率化マクロを導入する方法
VBAなんて扱ったことないけどエクセル作業を自動化するマクロを導入したい!
このような問題を抱えながら日々のエクセル業務をこなしている方がおおくいらっしゃるのではないでしょうか。
こんな問題を解決する方法がこちら
- マクロの開発を外注に依頼する
- マクロが設定されたエクセルファイルをダウンロードする
- 参考書やネットでVBAスキルを身に付ける
VBAの勉強を始める前は上記の方法で効率化マクロを導入していました。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
毎日のルーティーン作業にうんざりしている、だれでもできる単純作業に時間を費やしている、という方はあなたに合った方法でVBAを導入しちゃいましょう。
マクロの開発を外注に依頼する
マクロの開発を外注に依頼する導入方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんなエクセル作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」
こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。
ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。
疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』ですぐにエクセル作業を自動化することができます。
たとえば、
A4用紙に写真を貼り付けてコメントを入力する作業を自動化したい!という場合、
『写真を貼り付けるマクロ』が設定されたエクセルファイルをダウンロードすれば問題解決です。
実際に、『写真を貼り付けるマクロ』をダウンロードして使っている様子がこちら
ガッツポーズの人
『マクロが設定されたエクセルファイルをダウンロード』する導入方法は、
VBA初心者でもマクロを導入できる、費用が安い、
というメリットがあります。
しかし
VBAに関する情報が多く公開されているとはいえ、ネット上で想定するマクロは見つけることが難しい
というデメリットもあります。
ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『写真を貼り付けるマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。
ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい処理を実現するコードを書くだけ
です。
【VBA 写真を貼る】、【VBA PDF出力】、のようにネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。