2
2

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 1 year has passed since last update.

VBA 簡単な学習時間管理ツール

Last updated at Posted at 2022-08-27

学習時間管理ツールについて

なんとなくすぐできそうだったので試しに作ってみました。
スマホのアプリなどは続かなかったので自作したものならカスタマイズできるし愛着でるかなと思ったので。

動作イメージ

Animation5.gif

動作の流れ

  1. 勉強する内容をドロップダウンリストで選択
  2. 勉強開始するときに打刻開始を押す
  3. 終わるときに打刻終了を押す
  4. マスタシートのテーブルに情報がされる
  5. ピボットテーブルを更新
  6. ダッシュボードのグラフに反映

コード

Option Explicit

Sub StartTime()

'テーブルの項目数を取得
Dim N As Long

With Sheets("マスタ").Range("A1").ListObject
    '最終項目を取得
    N = .ListColumns(1).Range.Count
    
    'テーブルはデフォルトで1項目分確保されているので事前に項目があるのかないのかチェック
    If .ListColumns(1).Range(N).Value = "" Then
        .ListColumns(1).Range(N).Value = Date
        .ListColumns(2).Range(N).Value = Sheets("打刻").Range("B3").Value
        .ListColumns(3).Range(N).Value = Format(Time, "hh:mm")
    Else
        '最終項目の値を空白チェック(前の打刻が完了しているかいないかをチェック)
        If .ListColumns(4).Range(N).Value <> "" Then
            '完了していたら最終項目+1に新しく項目を作成
            .ListColumns(1).Range(N + 1).Value = Date
            .ListColumns(2).Range(N + 1).Value = Sheets("打刻").Range("B3").Value
            .ListColumns(3).Range(N + 1).Value = Format(Time, "hh:mm")
        End If
    End If
End With

Range("C12") = "打刻中"

End Sub

Sub EndTime()

'テーブルの項目数を取得
Dim N As Long

With Sheets("マスタ").Range("A1").ListObject
    '最終項目を取得
    N = .ListColumns(1).Range.Count
    '最終項目の値を空白チェック(前の打刻が完了しているかいないかをチェック)
    If .ListColumns(4).Range(N).Value = "" Then
        '空白だったら現在の時間を入れる
        .ListColumns(4).Range(N).Value = Format(Time, "hh:mm")
    End If
End With

Range("C12") = "打刻停止"

ActiveWorkbook.RefreshAll

End Sub

解説

まずは打刻開始の説明

Sub StartTime()

'テーブルの項目数を取得
Dim N As Long

With Sheets("マスタ").Range("A1").ListObject
    '最終項目を取得
    N = .ListColumns(1).Range.Count
    
    'テーブルはデフォルトで1項目分確保されているので事前に項目があるのかないのかチェック
    If .ListColumns(1).Range(N).Value = "" Then
        .ListColumns(1).Range(N).Value = Date
        .ListColumns(2).Range(N).Value = Sheets("打刻").Range("B3").Value
        .ListColumns(3).Range(N).Value = Format(Time, "hh:mm")
    Else
        '最終項目の値を空白チェック(前の打刻が完了しているかいないかをチェック)
        If .ListColumns(4).Range(N).Value <> "" Then
            '完了していたら最終項目+1に新しく項目を作成
            .ListColumns(1).Range(N + 1).Value = Date
            .ListColumns(2).Range(N + 1).Value = Sheets("打刻").Range("B3").Value
            .ListColumns(3).Range(N + 1).Value = Format(Time, "hh:mm")
        End If
    End If
End With

Range("C12") = "打刻中"

End Sub

まず、テーブルの最終項目を取得しています。
ただ、テーブルは空でも一項目文確保されているようで、空の場合と項目が一つの場合で挙動がかぶってしまったので、一列目の一項目目が空白かどうかチェックしています。
空白なら項目数は0で空白ではないなら項目数が1なのでそこで条件分岐をさせてます。

そして最終項目の打刻が完了しているかをIF文でチェック。
打刻が完了していないのに打刻開始が押せないように。
打刻が開始できたら、
1列目に今日の日付
2列目に選択した学習内容
3列目に今の時間
を転記します。

転記が終わったら
image.png
状態の部分を打刻中に変更し、打刻開始の処理は終了。

次に打刻終了についての解説

Sub EndTime()

'テーブルの項目数を取得
Dim N As Long

With Sheets("マスタ").Range("A1").ListObject
    '最終項目を取得
    N = .ListColumns(1).Range.Count
    '最終項目の値を空白チェック(前の打刻が完了しているかいないかをチェック)
    If .ListColumns(4).Range(N).Value = "" Then
        '空白だったら現在の時間を入れる
        .ListColumns(4).Range(N).Value = Format(Time, "hh:mm")
    End If
End With

Range("C12") = "打刻停止"

ActiveWorkbook.RefreshAll

End Sub

同じく最終項目を取得後、打刻が完了しているかしていないかをチェックし、完了していなかったら現在の時刻を4列目に入れる。

入れ終わったら状態を打刻停止に変更。
ピボットテーブルは更新をしないと反映されないです。
4つあるのですべて更新で対応。

疑問

なぜか学習開始時間-学習終了時間をVBAで計算しようとしたらエラーになったのでテーブルに計算式を入れる形で学習時間を出力させました。

image.png

マスタシートについて

表示形式はシート全体に時刻をセットしておくと見やすいです。

image.png

テーブルはこのような形式で作成しています。

image.png

ダッシュボードについて

image.png

好みでピボットテーブルを作成していろんな見せ方をできればいいと思いますが、試しに作ったのでこのくらいです。
直近の目標も出しておくといいかもしれません。
ピボットテーブルは一つのピボットテーブルで作成したり、コピペしてピボットテーブルを増やしてピボットグラフを作成すると、全部のグラフが連動してしまうので、それはそれで良し悪しありますが今回はグラフの軸が学習項目の場合と日付の場合で縦棒と横棒を作っているので、連動されると実装できなくなるのですべてを切り離しています。

やり方は空白セルを選択し、Alt+D+Pでピポットのウィザードを出します。
image.png
レポートの種類でピポットグラフレポートを選択し、次へを押します。

image.png

テーブル名を入力し、次へを押す。

image.png

ここがポイントで、いいえを押すと連携しない独立したものを作成できます。
いいえを押します。

image.png

どちらでも好きな方を選択して完了を押す。

ピボットグラフを作成としているので、ピポットテーブルとピボットグラフが1つづつ作成されました。

グラフをダッシュボードの方に移動させて、ピポットテーブルに値を振り分けていきます。

image.png

例えば棒グラフの作成ではこのような形でデータを挿入

image.png

値が個数になっているのでこのままだと勉強した回数のグラフになってしまうので、値の学習時間のプルダウンで値フィールドの設定から合計に変更します。

image.png

image.png

OKを押す
グラフの方を確認しに行くと勝手に棒グラフができている

image.png

グラフの変更はデザイン→グラフの種類の変更から行い、必要なグラフを作成してダッシュボードをカスタマイズしてください。
メインはVBAコードなのでその他の説明は割愛

終わり

テーブルのメソッドあまり使い慣れていなかったのであえて使いました。
すこし勉強になりました!

せっかく自作したのでこれを使って自己管理していきたいなと思いました!
最近麻雀をやりはじめてはまってしまったので、麻雀の勉強時間も打刻しようと思います(笑)

2
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?