2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-14

#VBAを組んでみた。

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

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

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

###シート[作業時間]
下図のように入力しておきます
スクリーンショット (38).png
 ・A列に日付
 ・B1には月間に=SUM(B3:B33)と入力し1か月の作業時間を出力
 ・B3~B33に作業時間をする            
を入力しています

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

今回は使用させてしていませんが… 実際に使用しているものは、この記事に載せた2つのbookとは別に今日の作業時間を記載したbookが存在します そのため、 **シート[作業時間]** には下図のようなワークシート関数を入力しています[^1] 入力前.png 入力をするとこのように出力されます 入力後.png  ・今月を出力する  ・1か月の合計を出力する  ・今日の日付を探し作業時間を写す を取得しています **シート[貼り付け用]** はシート[作業時間]のA:Bを張り付けておきます

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

ワークシート関数を使用します1
[年間作業時間]のシートに下図のように入力します
スクリーンショット (33).png
入力をするとこのように表示されます
スクリーンショット (34).png
 ・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を開き
スクリーンショット (34).png

シート名を指定し追加、貼り付けを行う
スクリーンショット (42).png

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

毎月保存をしていくと、
1か月分づつシートが増えていきます
その結果このようにまとめることもできます
作業結果.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 変数
Copy コピー
Selection.PasteSpecial 貼り付け

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

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

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

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

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?