Excelは煩雑な作業を自動で実行するツールを作ることができます。
そして、「ひとり」で「今すぐ」業務を効率化できるツールがVBAです。
今回は名簿データを元にブックを複製する「分身の術マクロ」の作成を解説したいと思います。
まずはどんなマクロかご覧ください
※「新型コロナウィルス感染症軽傷者等の健康観察票(厚生労働省 様式7引用)」を元に名簿からデータを健康観察票へ代入、複製してそれぞれ自動的に保存するようなマクロを作成しました。
1.どんな方法で動いているの?
必要なファイル
➀「健康観察票」:複製したいExcelでテンプレート用ファイル
➁「名簿」:名簿を複製したいファイルに代入するデータ用ファイル
分身の流れ
▼データファイル「名簿」を開き、<分身の術>マクロを起動する
⬇
▼「名簿」のデータを1行ずつ記憶していく
⬇
▼テンプレートファイル「健康観察票」にデータを代入する
⬇
▼氏名を加え、名前を付けて保存をする
⬇
▼以上を「名簿」にあるデータ分だけ自動的に繰り返す
2.「分身の術」コード一覧
Sub 分身の術()
'➀変数を宣言する
Dim name, address, tel, email, room As String
Dim manage As Long
Dim day As Date
Dim lastrow
Dim ws, list
'➁最終行を取得する
lastrow = Cells(Rows.Count, 1).End(xlUp).Row
'➂For分で繰り返し処理を始める
For i = 2 To lastrow
'➃テンプレート用ファイル「健康観察票」を開く
Workbooks.Open Filename:=ThisWorkbook.Path & "\健康観察票.xlsx"
'➄「健康観察票」と「名簿」のブックを変数に格納する
Set ws = Worksheets("健康観察票")
Set list = Workbooks("名簿").Worksheets("名簿")
'➅データ用ファイル「名簿」にあるデータを変数に格納する
manage = list.Cells(i, 1).Value '管理番号
room = list.Cells(i, 2).Value '部屋番号
address = list.Cells(i, 3).Value '住所
tel = list.Cells(i, 4).Value '電話番号
email = list.Cells(i, 5).Value 'E mail
name = list.Cells(i, 6).Value '氏名
day = list.Cells(i, 7).Value '療養開始日
'➆「健康観察票」にデータを代入する
With ws
.Range("D4") = manage
.Range("G4") = room
.Range("K4") = address
.Range("R4") = tel
.Range("V4") = email
.Range("D5") = name
.Range("I5") = day
End With
ws.Activate
'➇氏名を加えて、名前を付けて保存する
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\健康観察票(" & name & ") .xls"
ActiveWorkbook.Close
'➈Forに戻り最終行まで繰り返し処理する
Next i
End Sub
3.コードの説明
➀変数を宣言する
'➀変数を宣言する
Dim name, address, tel, email, room As String '氏名、住所、電話番号、メール、部屋番号
Dim manage As Long '管理番号
Dim day As Date '日時
Dim lastrow '最終行
Dim ws, list 'ワークシート
まずは、変数を宣言して数値や文字を入れる箱を作ります。
➁最終行を取得する
'➁最終行を取得する
lastrow = Cells(Rows.Count, 1).End(xlUp).Row
データ用ファイル(名簿)の最終行を取得する。
➂For分で繰り返し処理を始める
➂For分で繰り返し処理を始める
For i = 2 To lastrow
このとき、カウントの開始値はデータ用ファイルのデータ開始行、終了値は最終行にしています。
➃テンプレート用ファイル「健康観察票」を開く
'➃テンプレート用ファイル「健康観察票」を開く
Workbooks.Open Filename:=ThisWorkbook.Path & "\健康観察票.xlsx"
ファイルを開く方法は絶対パスと相対パスがあるが、今回は相対パスで開く方法にしています。
よって、同じフォルダ内に2つのファイルが存在する必要があります。
➄「健康観察票」と「名簿」のブックを変数に格納する
➄「健康観察票」と「名簿」のブックを変数に格納する
Set ws = Worksheets("健康観察票")
Set list = Workbooks("名簿").Worksheets("名簿")
オブジェクトを変数にいれる時はSetを名乗る必要があります。
➅データ用ファイル「名簿」にあるデータを変数に格納する
'➅データ用ファイル「名簿」にあるデータを変数に格納する
manage = list.Cells(i, 1).Value '管理番号
room = list.Cells(i, 2).Value '部屋番号
address = list.Cells(i, 3).Value '住所
tel = list.Cells(i, 4).Value '電話番号
email = list.Cells(i, 5).Value 'E mail
name = list.Cells(i, 6).Value '氏名
day = list.Cells(i, 7).Value '療養開始日
データ用ファイルにあるデータを変数に格納する際にセルの番地を示すためにCellsを使用します。
➆「健康観察票」にデータを代入する
'➆「健康観察票」にデータを代入する
With ws
.Range("D4") = manage
.Range("G4") = room
.Range("K4") = address
.Range("R4") = tel
.Range("V4") = email
.Range("D5") = name
.Range("I5") = day
End With
テンプレート用ファイルのセルに先ほどの変数を代入させる作業をしています。
また、RangeとCellsの使い分けなども必要になってきます。
➇氏名を加えて、名前を付けて保存する
'➇氏名を加えて、名前を付けて保存する
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\健康観察票(" & name & ") .xls"
ActiveWorkbook.SaveAs Filename:=保存先と名前
で保存することができます。
しかし、保存先は絶対パスと相対パスのどちらかで指定する必要があり、詳細は関連記事を参照ください。
➈Forに戻り最終行まで繰り返し処理する
Next で再びFor文の先頭に戻り繰り返し処理を行います。
4.応用できること
- 名簿データから領収書テンプレートへ自動入力する
- 保存したらバックアップファイルを自動生成する
など、ボタン1つでデータの自動入力からファイルの生成まで応用が利きます!!
5.さいごに
皆さんいかがだったでしょうか?
少し難しいかもしれませんが、「分身の術」を作れると中級マクロは簡単に作れると思います。
「こんなの出来ないよ…」と思った方でも、学習すれば出来ます!
Udemyや当ブログの記事を参考にぜひチャレンジして頂けると嬉しいです。
コメント