VBAを組んでみた。1か月分の作業時間を集計するの巻


VBAを組んでみた。

やってみたこと

1か月間記載した作業時間を別のbookに記録する

Microsoft 365 バージョン:2004 ビルド:12730.20250 利用

事前準備

今回はbookを2つ使用しています
1か月の作業時間を記録したbook、2つ目は1年分を記録するbookです
それぞれのbookで何を書くのかを簡単にまとめました

月ごとに記録するbook

今回はこのbook名を[作業時間]とします
このbookの[sheet1]の名前を[作業時間]に変更します
[sheet2]の名前を[貼り付け用]に変更します

シート[作業時間]

下図のように入力しておきます

 ・A列に日付
 ・B1には月間に=SUM(B3:B33)と入力し1か月の作業時間を出力
 ・B3~B33に作業時間をする            
を入力しています

シート[貼り付け用]

A列に日付を入れておきます

今回は使用させてしていませんが…
実際に使用しているものは、この記事に載せた2つのbookとは別に今日の作業時間を記載したbookが存在します
そのため、 シート[作業時間] には下図のようなワークシート関数を入力しています1

入力をするとこのように出力されます

 ・今月を出力する
 ・1か月の合計を出力する
 ・今日の日付を探し作業時間を写す
を取得しています
シート[貼り付け用] はシート[作業時間]のA:Bを張り付けておきます

1年分を記録するbook

今回はこのbook名を[2020作業時間]とします
このbookの[sheet1]を[年間作業時間]に変更します

ワークシート関数を使用します1
[年間作業時間]のシートに下図のように入力します

入力をするとこのように表示されます

 ・1年間の作業を取得
 ・別シートの値を取得
  Inderect関数で別シートからデータを取得しています
をおこなっています

VBAのコード

標準モジュールに書いていきます2
このコードはどのbookに入力しても動かすことができると思います

Sub getuzime()
'###必要なファイルを開く########################
Dim kadohyo As String

 kadohyo = "C:\test\作業時間.xlsx"

 Workbooks.Open kadohyo
Dim failename As String
failename = Year(Now) & "年間作業時間.xlsx"
Dim filepath As String
filepath = "C:\test\" & failename
Workbooks.Open filepath

'###シート名を指定し追加#######
Dim ws As Worksheet
Dim mon As Integer
 mon = Month(Now)

Set ws = Worksheets.Add(After:=Sheets(Worksheets.Count))
ws.Name = mon & "月"


'###1か月分の作業時間をコピー年間の作業時間に張り付ける##
Workbooks("作業時間.xlsx").Sheets("作業時間").Range("A:B").Copy
Workbooks(failename).Sheets(ws.Name).Range("A1").PasteSpecial Paste:=xlPasteFormats
Workbooks(failename).Sheets(ws.Name).Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Range("A1").Activate

Worksheets(ws.Name).Move After:=Worksheets("年間作業時間")
Range("A1").Activate

Workbooks(failename).Close savechanges:=True

'###1か月分のシートをきれいにする################
Workbooks("作業時間.xlsx").Sheets("貼り付け用").Range("A:B").Copy
Workbooks("作業時間.xlsx").Sheets("作業時間").Range("A1").PasteSpecial Paste:=xlPasteAll

End Sub

解説

今回は、1か月分の作業時間を別のbookに保存しました
おおまかな流れとして

まとめるためのbookを開き

シート名を指定し追加、貼り付けを行う

1か月分のbookをきれいのする工程を行いました

毎月保存をしていくと、
1か月分づつシートが増えていきます
その結果このようにまとめることもできます

使用した関数は以下の通りです

Worksheets.Add シートの追加

Worksheets.Add ~()
Addの後は省略が可能です

意味
1 Addのすぐ後を省略 今選択しているシート(Activeのシート)の前にシートを追加する
2 Before 今選択しているシートの前にシートを追加する
3 After 今選択しているシートの後にシートを追加する
4 ()を省略 シートを1つ追加する
5 (Worksheets.Count) シートを指定した数追加する

Worksheets(移動する前のシート).Move After:=Worksheets(移動した後のシート) シートの移動

今回はシートだけを選択して移動を行いましたが、おそらくセルを選択して移動も可能だと思います

その場合、
Worksheets()Range().Move After:=Worksheets()Range()
と入力します

Dim、Copy、Selection.PasteSpecialは下記に記述してます
Dim 変数
Copy コピー
Selection.PasteSpecial 貼り付け

今回の反省とまとめ

初めて作成した時は全てドキュメント内に作成を行おうとしていました
ドキュメント内のexcel、ドキュメント内のexcel→ローカルにあるExcelへリンク付けを行うと、ドキュメントの有効化や警告のポップが上がるためうまく選択されませんでした

別のシートを選択するときに初めは
Range("A1").Select
Worksheets("年間作業時間").Range("A1").Select

で移動できると思っていましたが
SelectはそのセルのあるワークシートがActiveになっていることが前提であるようです

また、今回もコピーと貼り付けを多く使っていたので次回は新しいことができればと思います


  1. ワークシート関数とはExcelで一般的に使用する関数のことを指します 

  2. 標準モジュールの開き方についてはVBAを組んでみた。新しいbookに保存するの巻を参照してください