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

#VBAを組んでみた。

#やってみたこと
１か月間記載した作業時間を別のbookに記録する

Microsoft 365 バージョン:2004　ビルド：12730.20250　利用
#事前準備
今回はbookを2つ使用しています
１か月の作業時間を記録したbook、2つ目は1年分を記録するbookです
それぞれのbookで何を書くのかを簡単にまとめました

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

###シート[作業時間]
下図のように入力しておきます
![スクリーンショット (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/f88deb8d-986e-cd61-b6ce-dae658d17972.png)
　・A列に日付
　・B1には月間に`=SUM(B3:B33)`と入力し１か月の作業時間を出力
　・B3～B33に作業時間をする　　　　　　　　　　　　
を入力しています

###シート[貼り付け用]
A列に日付を入れておきます

<details><summary>今回は使用させてしていませんが…</summary>
実際に使用しているものは、この記事に載せた2つのbookとは別に今日の作業時間を記載したbookが存在します
そのため、 **シート[作業時間]** には下図のようなワークシート関数を入力しています[^1]
<img width="958" alt="入力前.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/1dafd256-93de-b8af-a344-379b7d6decfe.png">
入力をするとこのように出力されます
<img width="958" alt="入力後.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/f29f1b91-01c2-5ceb-0c2c-ecc6f29c7aed.png">
　・今月を出力する
　・１か月の合計を出力する
　・今日の日付を探し作業時間を写す
を取得しています
 **シート[貼り付け用]** はシート[作業時間]のA:Bを張り付けておきます
</details>


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

ワークシート関数を使用します[^1]
[年間作業時間]のシートに下図のように入力します
<img width="960" alt="スクリーンショット (33).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/838e0bd0-497b-db02-704f-794ac0838150.png">
入力をするとこのように表示されます
<img width="960" alt="スクリーンショット (34).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/e14c10ce-f2ca-c982-6e92-0cedf75834ae.png">
　・1年間の作業を取得
　・別シートの値を取得
　　Inderect関数で別シートからデータを取得しています
をおこなっています

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

```vb
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 & "月"


'###１か月分の作業時間をコピー年間の作業時間に張り付ける##
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

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

End Sub

```

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

まとめるためのbookを開き
<img width="960" alt="スクリーンショット (34).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/c14a1f5c-ff31-a209-4d1e-389ea0afd2d0.png">

シート名を指定し追加、貼り付けを行う
![スクリーンショット (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/8d550cb2-b877-1d5f-1be7-c47fa91a2730.png)

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

毎月保存をしていくと、
１か月分づつシートが増えていきます
その結果このようにまとめることもできます
<img width="959" alt="作業結果.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/e6e39319-e19b-4871-1356-bd3a65f5b6c6.png">






使用した関数は以下の通りです
###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 変数](https://qiita.com/yukina24/items/84625e931748a21c09a9#dim-%E5%A4%89%E6%95%B0%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B)
[Copy コピー](https://qiita.com/yukina24/items/84625e931748a21c09a9#copy-%E3%82%B3%E3%83%94%E3%83%BC)
[Selection.PasteSpecial 貼り付け](https://qiita.com/yukina24/items/84625e931748a21c09a9#selectionpastespecial-%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91)

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

別のシートを選択するときに初めは
`Range("A1").Select
Worksheets("年間作業時間").Range("A1").Select`
で移動できると思っていましたが
SelectはそのセルのあるワークシートがActiveになっていることが前提であるようです

また、今回もコピーと貼り付けを多く使っていたので次回は新しいことができればと思います
[^1]: ワークシート関数とはExcelで一般的に使用する関数のことを指します
[^2]: 標準モジュールの開き方については[VBAを組んでみた。新しいbookに保存するの巻](https://qiita.com/yukina24/items/84625e931748a21c09a9#vba%E3%81%AE%E6%A8%99%E6%BA%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E9%96%8B%E3%81%8F)を参照してください