VBA練習 シフト表から月ごとの依頼票を作成する

ド素人のVBA練習風景です。
「こんなレベル低いとこで悩んでる人もいるんだなー」
と思ってもらって、皆さんの自信に繋げていただければ幸いでございます(笑)
※ VBA…マイクロソフトのOffice製品上で動作するプログラミング言語
毎月作成する業務量想定票の作成を自動化する。
昨日は宿直で一日会社にいたのですが、せっかく環境がバッチリなのでなにか一つVBAで自動化してやろうと取り組んでました。幸い仕事も入ってこなかったこともあって、どうにか一つできあがりましたので、業務情報を除いた上で公開します。
…社外へのファイル送信にビビって、完成したコードを手打ちでプライベートPCに移植したのは内緒です。ついでにシフト表までまるっと作り直してたりして…
シフト表から想定業務量をコピペするだけの単純作業
現在、社内のデータメンテナンス業務を、別会社に委託しているのですが、派遣社員という形で常駐してもらっているので、毎月シフト表が送られてきます。
こんな感じ↓

(名前についてのご指摘は受け入れられません)
ここの再下段の想定時間の数字をコピーして、月間の業務量想定票を作る、という単純な作業が毎月あるのです。
はっきり言って手動でも大して手間はかからない(むしろ今回のマクロ作成の作業時間を考えたら、元取るのに10年くらいかかりそう(笑))代物なのですが、まあ今回は練習ということで、塵も積もればの塵にするつもりで、自動化するVBAを書いてみました。
あと、このブログのネタのため、っていう面も87%くらいありますw
(下準備)二つのファイルを同じフォルダに保存する
業務量想定票↓

まずは、委託先から提出してもらったシフト表と、業務量想定票作成用のファイルを同じフォルダに保存します。

VBAの動作
業務量想定ファイルを開くと、まずは入力用シートになっています。

VBAの動作手順としては、
①入力シートより、作成する想定票の年月を読み取る
②ー1 読み取った年月のシートが既にあれば、その旨のメッセージを返して、マクロ終了
②-2 読み取った年月のシートがなければ、雛形シートをコピーする
③コピーしたシートの名前を、読み取った年月に変更する
④コピーしたシートのB11セルを、読み取った年月に変更する

⑤フォルダ内に、入力シートで指定した年月のシフト表があるかを確認する。
⑥-1 無かった場合→メッセージを表示して、作成したシートを削除する
⑥-2 あった場合→シフト表最下段の総時間を読み取り、

業務量想定票のC13セルに貼り付けする

という手順で動きます。
作成したVBAコード
VBAコードはこちら
Sub 委託業務想定票作成()
Dim y As Long
Dim m As Long
Dim ym As String
Dim ws As Worksheet, flag As Boolean
Dim sh As String
y = Worksheets("入力シート").Range("B3").Value
m = Worksheets("入力シート").Range("B4").Value
ym = y & "." & m
sh = "シフト表" & ym & ".xlsx"
For Each ws In Worksheets
If ws.Name = y & "年" & m & "月" Then flag = True
Next ws
If flag = True Then
MsgBox "その年月のシートは既に存在します。削除するか、年月を変更してください。"
Else
Worksheets("雛形").Copy after:=Worksheets("雛形")
Worksheets(3).Name = y & "年" & m & "月"
Worksheets(3).Range("B11").Value = y & "年" & m & "月"
If Dir(ThisWorkbook.Path & "\" & sh) <> "" Then
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & sh
Windows(sh).Activate
Range("J36").Copy
Windows("月間業務量想定票.xlsm").Activate
Range("C13").PasteSpecial (xlPasteValues)
Workbooks(sh).Close
Else
MsgBox "指定された年月のシフト表「" & sh & "」がありません。受領するか、ファイル名を確認・修正してください。"
Application.DisplayAlerts = False
Worksheets(y & "年" & m & "月").Delete
Application.DisplayAlerts = True
Worksheets("入力シート").Activate
End If
End If
End Subたったこれだけのコードを打つのに、昨日半日かかってしまいました(笑)
なんせ一個やることを増やすたびにいちいち検索してたので。
でもまあ、それなりに動くものができたので、自分としては満足しております。
ちなみにこれ、ローカルフォルダに保存するとちゃんと動くんですが、クラウド上だと上手く動かないんですよねー。なぜかは今のところわかってません。
どうもファイルパスが悪さしているような気はするんですが…上手く動くようになったら追記します。
とりあえずこれから、社内の手作業が残っているところを片っ端から自動化してやろうと思っているので、ネタには困らない見込みです。他のアプリケーションを操作する機能なんかも、いずれ使えるようになれたらいいなー、と思ってます。
ではまた。
タイマムシンのオススメ本はこちら








