Excel VBA 事例 演習 基礎問題 part4

はじめに

データ加工は、出勤と退勤が同じ列に入っているものを分離して表形式にまとめることを行う。

集計は、ピボットテーブルを作成するのがもっとも正確で早いのだが、ここでは、リスト形式になっているものを〇〇別、△△別にわけて行う。

問題1

左が元表、三列目に入っている出退勤を右の図のように加工する。それぞれ別シートにはいっている
データ

シートは2枚必要になる。

【入退室履歴シート・元表】

氏名 日付 出退勤時刻
田中 遥 10月3日 08:59
田中 遥 10月3日 19:06
田中 遥 10月4日 10:38
田中 遥 10月4日 22:25
田中 遥 10月5日 09:16
田中 遥 10月5日 20:48
田中 遥 10月6日 08:46
田中 遥 10月6日 19:27
田中 遥 10月7日 09:03
田中 遥 10月7日 21:41
田中 遥 10月11日 10:07
田中 遥 10月11日 20:11
田中 遥 10月12日 10:08
山本 慎二 10月3日 09:35
山本 慎二 10月3日 18:15
山本 慎二 10月4日 18:56

【退勤管理表シート・転記加工用】

氏名 日付 出勤時刻 退勤時刻
田中 遥 2022/10/3    
田中 遥 2022/10/4    
田中 遥 2022/10/5    
田中 遥 2022/10/6    
田中 遥 2022/10/7    
田中 遥 2022/10/11    
田中 遥 2022/10/12    
山本 慎二 2022/10/3    
山本 慎二 2022/10/4    
       
       
       
       
コード

Option Explicit
Option Base 1


Sub main()
    Dim i As Integer, knum As Integer
    Dim namedt As String, datetbl As String
    Dim ktct As Variant
    Dim stime As Date, ttime As Date
    Const standtime As String = "12:00:00"
    
    ktct = Sheets("勤怠管理表").Range("A1").CurrentRegion
    For i = 2 To UBound(ktct)
        namedt = ktct(i, 1)
        datetbl = Format(ktct(i, 2), "m月d日")
        With Sheets("入退室履歴")
            .Range("A1").AutoFilter Field:=1, Criteria1:=namedt
            .Range("A1").AutoFilter Field:=2, Criteria1:=datetbl
            knum = WorksheetFunction.Subtotal(3, .Columns(3)) - 1
            If knum > 0 Then
                stime = WorksheetFunction.Subtotal(5, .Columns(3))
                ttime = WorksheetFunction.Subtotal(4, .Columns(3))
            End If
        End With
        
        With Sheets("勤怠管理表")
            If stime <= standtime Then
                .Cells(i, 3).Value = stime
            Else
                .Cells(i, 3).Value = ""
                .Cells(i, 3).Interior.Color = vbYellow
            End If
            
            If ttime > standtime Then
                .Cells(i, 4).Value = ttime
            Else
                .Cells(i, 4).Value = ""
                .Cells(i, 4).Interior.Color = vbYellow
            End If
        End With
    Next i
    Sheets("入退室履歴").Range("A1").AutoFilter
    ActiveWorkbook.Save
End Sub

コード自体はいままでより多少複雑になっている。

ヴァリアント型のktctに勤怠管理表を入れ、これをもとに、名前と日付をとり、入退室履歴にAutoFilterをつかって条件を絞り込んで、ワークシート関数のSubtotalを用いて欲しいデータをとり、それが0より大きければ、出勤時間と退室時間を設定している。

そして、退勤管理表で基準である12:00時より小さければ出勤、大きければ退勤とし、もし空白ならば、記入ミスということで黄色で示している。

最後に入退室履歴のフィルターを解除してブックを上書き保存して終了である。

Subtotalの3は個数を意味し、5は最小値、4は最大値を意味する。AutoFilterに関してはすでに出てきているので、意味はわかると思うが、わからなければネットで調べればすぐに出てくる。

問題2

 

左が元表。このリスト形式のデータをクロス集計する。
データ

シートは2枚必要になる。

【契約一覧・元表】

契約日 年度 四半期 営業担当 支店 契約金額
2022/10/1 2022 3Q 中村 花子 日本橋支店 46,990,000
2022/10/4 2022 3Q 松本 琢磨 押上支店 88,970,000
2022/10/9 2022 3Q 渡部 太郎 新小岩支店 84,160,000
2022/10/13 2022 3Q 清水 ほのか 日本橋支店 56,920,000
2022/10/14 2022 3Q 丸山 大和 新小岩支店 30,690,000
2022/10/19 2022 3Q 藤原 悠太 新小岩支店 74,470,000
2022/10/21 2022 3Q 森 彩夏 秋葉原支店 78,660,000
2022/10/25 2022 3Q 菊地 鈴 秋葉原支店 76,870,000
2022/10/30 2022 3Q 千葉 陸斗 蔵前支店 86,430,000
2022/11/1 2022 3Q 佐藤 悠 京橋支店 77,960,000
2022/11/4 2022 3Q 武田 太一 押上支店 34,310,000
2022/11/6 2022 3Q 岩崎 拓磨 京橋支店 103,030,000
2022/11/11 2022 3Q 中村 花子 秋葉原支店 58,460,000
2022/11/15 2022 3Q 松本 琢磨 蔵前支店 36,990,000
2022/11/16 2022 3Q 渡部 太郎 京橋支店 39,980,000
2022/11/17 2022 3Q 清水 ほのか 日本橋支店 91,630,000
2022/11/18 2022 3Q 丸山 大和 日本橋支店 52,220,000
2022/11/23 2022 3Q 藤原 悠太 秋葉原支店 35,220,000
2022/11/28 2022 3Q 森 彩夏 日本橋支店 85,120,000
2022/11/30 2022 3Q 菊地 鈴 秋葉原支店 47,020,000
2022/12/5 2022 3Q 千葉 陸斗 秋葉原支店 30,600,000
2022/12/9 2022 3Q 佐藤 悠 日本橋支店 71,730,000
2022/12/10 2022 3Q 武田 太一 秋葉原支店 113,120,000
2022/12/13 2022 3Q 岩崎 拓磨 日本橋支店 60,580,000
2022/12/16 2022 3Q 中村 花子 蔵前支店 113,130,000
2022/12/21 2022 3Q 松本 琢磨 新小岩支店 98,840,000
2022/12/22 2022 3Q 渡部 太郎 秋葉原支店 73,530,000
2022/12/25 2022 3Q 清水 ほのか 秋葉原支店 42,490,000
2022/12/29 2022 3Q 丸山 大和 日本橋支店 42,240,000
2022/12/30 2022 3Q 藤原 悠太 日本橋支店 46,360,000
2023/1/3 2022 4Q 森 彩夏 京橋支店 50,920,000
2023/1/5 2022 4Q 菊地 鈴 日本橋支店 64,830,000
2023/1/8 2022 4Q 千葉 陸斗 秋葉原支店 93,440,000
2023/1/9 2022 4Q 佐藤 悠 新小岩支店 69,680,000
2023/1/12 2022 4Q 武田 太一 秋葉原支店 102,120,000
2023/1/14 2022 4Q 岩崎 拓磨 押上支店 34,930,000
2023/1/18 2022 4Q 中村 花子 京橋支店 69,170,000
2023/1/21 2022 4Q 松本 琢磨 京橋支店 87,610,000
2023/1/24 2022 4Q 渡部 太郎 押上支店 64,230,000
2023/1/25 2022 4Q 清水 ほのか 押上支店 38,750,000
2023/1/30 2022 4Q 丸山 大和 日本橋支店 105,070,000
2023/2/4 2022 4Q 藤原 悠太 蔵前支店 73,280,000
2023/2/9 2022 4Q 森 彩夏 京橋支店 44,510,000
2023/2/10 2022 4Q 菊地 鈴 京橋支店 100,070,000
2023/2/11 2022 4Q 千葉 陸斗 蔵前支店 105,990,000
2023/2/14 2022 4Q 佐藤 悠 秋葉原支店 51,270,000
2023/2/18 2022 4Q 武田 太一 秋葉原支店 111,420,000
2023/2/21 2022 4Q 岩崎 拓磨 蔵前支店 51,440,000
2023/2/23 2022 4Q 中村 花子 京橋支店 43,870,000
2023/2/26 2022 4Q 松本 琢磨 秋葉原支店 83,320,000
2023/2/28 2022 4Q 渡部 太郎 京橋支店 68,150,000
2023/3/5 2022 4Q 清水 ほのか 秋葉原支店 39,180,000
2023/3/8 2022 4Q 丸山 大和 秋葉原支店 40,910,000
2023/3/12 2022 4Q 藤原 悠太 京橋支店 84,140,000
2023/3/13 2022 4Q 森 彩夏 蔵前支店 111,640,000
2023/3/18 2022 4Q 菊地 鈴 日本橋支店 116,840,000
2023/3/21 2022 4Q 千葉 陸斗 秋葉原支店 48,500,000
2023/3/24 2022 4Q 佐藤 悠 日本橋支店 82,300,000
2023/3/27 2022 4Q 武田 太一 秋葉原支店 113,770,000
2023/3/31 2022 4Q 岩崎 拓磨 日本橋支店 117,790,000
2023/4/3 2023 1Q 中村 花子 日本橋支店 114,420,000
2023/4/5 2023 1Q 松本 琢磨 秋葉原支店 87,410,000
2023/4/6 2023 1Q 渡部 太郎 秋葉原支店 100,570,000
2023/4/7 2023 1Q 清水 ほのか 日本橋支店 110,020,000
2023/4/9 2023 1Q 丸山 大和 秋葉原支店 93,020,000
2023/4/12 2023 1Q 藤原 悠太 秋葉原支店 89,580,000
2023/4/17 2023 1Q 森 彩夏 京橋支店 35,620,000
2023/4/22 2023 1Q 菊地 鈴 日本橋支店 74,330,000
2023/4/24 2023 1Q 千葉 陸斗 京橋支店 91,840,000
2023/4/26 2023 1Q 佐藤 悠 秋葉原支店 87,410,000
2023/4/28 2023 1Q 武田 太一 京橋支店 34,520,000
2023/5/3 2023 1Q 岩崎 拓磨 秋葉原支店 38,620,000
2023/5/4 2023 1Q 中村 花子 日本橋支店 49,490,000
2023/5/6 2023 1Q 松本 琢磨 秋葉原支店 94,960,000
2023/5/11 2023 1Q 渡部 太郎 日本橋支店 53,530,000
2023/5/12 2023 1Q 清水 ほのか 新小岩支店 83,150,000
2023/5/14 2023 1Q 丸山 大和 日本橋支店 105,940,000
2023/5/18 2023 1Q 藤原 悠太 押上支店 34,140,000
2023/5/22 2023 1Q 森 彩夏 京橋支店 101,130,000
2023/5/26 2023 1Q 菊地 鈴 蔵前支店 46,610,000
2023/5/29 2023 1Q 千葉 陸斗 秋葉原支店 89,300,000
2023/5/31 2023 1Q 佐藤 悠 秋葉原支店 107,510,000
2023/6/2 2023 1Q 武田 太一 秋葉原支店 64,270,000
2023/6/3 2023 1Q 岩崎 拓磨 日本橋支店 79,080,000
2023/6/8 2023 1Q 中村 花子 新小岩支店 41,680,000
2023/6/12 2023 1Q 松本 琢磨 日本橋支店 119,700,000
2023/6/14 2023 1Q 渡部 太郎 日本橋支店 43,800,000
2023/6/18 2023 1Q 清水 ほのか 京橋支店 105,880,000
2023/6/23 2023 1Q 丸山 大和 日本橋支店 106,600,000
2023/6/28 2023 1Q 藤原 悠太 日本橋支店 62,050,000
2023/7/3 2023 2Q 森 彩夏 日本橋支店 51,000,000
2023/7/8 2023 2Q 菊地 鈴 秋葉原支店 48,840,000
2023/7/13 2023 2Q 千葉 陸斗 新小岩支店 92,630,000
2023/7/15 2023 2Q 佐藤 悠 秋葉原支店 45,350,000
2023/7/16 2023 2Q 武田 太一 日本橋支店 68,890,000
2023/7/21 2023 2Q 岩崎 拓磨 日本橋支店 57,050,000
2023/7/25 2023 2Q 中村 花子 日本橋支店 66,980,000
2023/7/29 2023 2Q 松本 琢磨 日本橋支店 113,460,000
2023/8/3 2023 2Q 渡部 太郎 日本橋支店 51,610,000
2023/8/4 2023 2Q 清水 ほのか 秋葉原支店 66,590,000
2023/8/9 2023 2Q 丸山 大和 京橋支店 77,030,000
2023/8/10 2023 2Q 藤原 悠太 秋葉原支店 83,980,000
2023/8/14 2023 2Q 森 彩夏 新小岩支店 70,160,000
2023/8/18 2023 2Q 菊地 鈴 押上支店 100,070,000
2023/8/23 2023 2Q 千葉 陸斗 日本橋支店 108,310,000
2023/8/28 2023 2Q 佐藤 悠 日本橋支店 68,310,000
2023/9/1 2023 2Q 武田 太一 日本橋支店 78,210,000
2023/9/6 2023 2Q 岩崎 拓磨 秋葉原支店 43,040,000
2023/9/8 2023 2Q 中村 花子 京橋支店 112,930,000
2023/9/9 2023 2Q 松本 琢磨 押上支店 61,250,000
2023/9/14 2023 2Q 渡部 太郎 日本橋支店 38,360,000
2023/9/18 2023 2Q 清水 ほのか 秋葉原支店 72,330,000
2023/9/21 2023 2Q 丸山 大和 日本橋支店 109,970,000
2023/9/24 2023 2Q 藤原 悠太 日本橋支店 70,050,000
2023/9/28 2023 2Q 森 彩夏 秋葉原支店 92,900,000
2023/10/3 2023 3Q 菊地 鈴 秋葉原支店 117,000,000
2023/10/6 2023 3Q 千葉 陸斗 京橋支店 73,400,000
2023/10/10 2023 3Q 佐藤 悠 京橋支店 42,740,000
2023/10/11 2023 3Q 武田 太一 京橋支店 112,520,000
2023/10/15 2023 3Q 岩崎 拓磨 秋葉原支店 102,640,000
2023/10/19 2023 3Q 中村 花子 京橋支店 112,010,000
2023/10/24 2023 3Q 松本 琢磨 日本橋支店 82,610,000
2023/10/25 2023 3Q 渡部 太郎 秋葉原支店 50,400,000
2023/10/26 2023 3Q 清水 ほのか 蔵前支店 37,930,000
2023/10/31 2023 3Q 丸山 大和 秋葉原支店 115,350,000
2023/11/5 2023 3Q 藤原 悠太 日本橋支店 90,130,000
2023/11/8 2023 3Q 森 彩夏 日本橋支店 81,040,000
2023/11/11 2023 3Q 菊地 鈴 押上支店 71,570,000
2023/11/13 2023 3Q 千葉 陸斗 日本橋支店 53,590,000
2023/11/14 2023 3Q 佐藤 悠 京橋支店 96,570,000
2023/11/19 2023 3Q 武田 太一 押上支店 73,920,000
2023/11/21 2023 3Q 岩崎 拓磨 蔵前支店 93,240,000
2023/11/24 2023 3Q 中村 花子 秋葉原支店 70,420,000
2023/11/25 2023 3Q 松本 琢磨 新小岩支店 71,210,000
2023/11/27 2023 3Q 渡部 太郎 秋葉原支店 55,820,000
2023/11/30 2023 3Q 清水 ほのか 日本橋支店 53,690,000
2023/12/3 2023 3Q 丸山 大和 押上支店 61,230,000
2023/12/5 2023 3Q 藤原 悠太 新小岩支店 46,490,000
2023/12/6 2023 3Q 森 彩夏 日本橋支店 79,490,000
2023/12/8 2023 3Q 菊地 鈴 押上支店 54,030,000
2023/12/10 2023 3Q 千葉 陸斗 京橋支店 85,760,000
2023/12/14 2023 3Q 佐藤 悠 京橋支店 58,530,000
2023/12/18 2023 3Q 武田 太一 日本橋支店 115,370,000
2023/12/22 2023 3Q 岩崎 拓磨 京橋支店 105,040,000
2023/12/23 2023 3Q 中村 花子 日本橋支店 86,420,000
2023/12/26 2023 3Q 松本 琢磨 新小岩支店 111,660,000
2023/12/31 2023 3Q 渡部 太郎 押上支店 45,830,000
2024/1/5 2023 4Q 清水 ほのか 日本橋支店 111,300,000
2024/1/9 2023 4Q 丸山 大和 日本橋支店 41,490,000
2024/1/12 2023 4Q 藤原 悠太 新小岩支店 95,120,000
2024/1/17 2023 4Q 森 彩夏 秋葉原支店 59,500,000
2024/1/20 2023 4Q 菊地 鈴 秋葉原支店 89,960,000
2024/1/21 2023 4Q 千葉 陸斗 押上支店 115,180,000
2024/1/25 2023 4Q 佐藤 悠 秋葉原支店 61,030,000
2024/1/29 2023 4Q 武田 太一 日本橋支店 56,810,000
2024/1/31 2023 4Q 岩崎 拓磨 秋葉原支店 65,120,000
2024/2/3 2023 4Q 中村 花子 京橋支店 50,250,000
2024/2/4 2023 4Q 松本 琢磨 秋葉原支店 96,320,000
2024/2/6 2023 4Q 渡部 太郎 押上支店 44,750,000
2024/2/10 2023 4Q 清水 ほのか 新小岩支店 43,580,000
2024/2/13 2023 4Q 丸山 大和 日本橋支店 34,460,000
2024/2/16 2023 4Q 藤原 悠太 京橋支店 41,200,000
2024/2/20 2023 4Q 森 彩夏 日本橋支店 67,580,000
2024/2/22 2023 4Q 菊地 鈴 秋葉原支店 109,090,000
2024/2/24 2023 4Q 千葉 陸斗 秋葉原支店 51,430,000
2024/2/29 2023 4Q 佐藤 悠 日本橋支店 116,240,000
2024/3/2 2023 4Q 武田 太一 日本橋支店 82,490,000
2024/3/7 2023 4Q 岩崎 拓磨 日本橋支店 62,270,000
2024/3/10 2023 4Q 中村 花子 京橋支店 42,970,000
2024/3/15 2023 4Q 松本 琢磨 京橋支店 77,460,000
2024/3/17 2023 4Q 渡部 太郎 日本橋支店 99,720,000
2024/3/21 2023 4Q 清水 ほのか 京橋支店 98,310,000
2024/3/25 2023 4Q 丸山 大和 秋葉原支店 89,380,000
2024/3/26 2023 4Q 藤原 悠太 京橋支店 79,140,000
2024/3/29 2023 4Q 森 彩夏 秋葉原支店 88,800,000
2024/4/2 2024 1Q 菊地 鈴 京橋支店 66,140,000
2024/4/6 2024 1Q 千葉 陸斗 京橋支店 57,450,000
2024/4/8 2024 1Q 佐藤 悠 秋葉原支店 93,490,000
2024/4/11 2024 1Q 武田 太一 秋葉原支店 31,850,000
2024/4/14 2024 1Q 岩崎 拓磨 日本橋支店 80,330,000
2024/4/16 2024 1Q 中村 花子 京橋支店 36,510,000
2024/4/20 2024 1Q 松本 琢磨 蔵前支店 79,440,000
2024/4/24 2024 1Q 渡部 太郎 京橋支店 50,800,000
2024/4/25 2024 1Q 清水 ほのか 京橋支店 88,460,000
2024/4/26 2024 1Q 丸山 大和 京橋支店 42,730,000
2024/4/27 2024 1Q 藤原 悠太 京橋支店 31,480,000
2024/4/28 2024 1Q 森 彩夏 押上支店 43,890,000
2024/4/29 2024 1Q 菊地 鈴 日本橋支店 78,380,000
2024/4/30 2024 1Q 千葉 陸斗 日本橋支店 116,890,000
2024/5/1 2024 1Q 佐藤 悠 日本橋支店 78,840,000
2024/5/2 2024 1Q 武田 太一 秋葉原支店 82,920,000
2024/5/3 2024 1Q 岩崎 拓磨 押上支店 52,650,000

【集計・加工用】

▼契約件数          
  2022/3Q 2022/4Q 2023/1Q 2023/2Q 合計
日本橋支店         0
京橋支店         0
秋葉原支店         0
蔵前支店         0
押上支店         0
新小岩支店         0
合計 0 0 0 0 0
           
▼契約金額         (百万円)
  2022/3Q 2022/4Q 2023/1Q 2023/2Q 合計
日本橋支店         0
京橋支店         0
秋葉原支店         0
蔵前支店         0
押上支店         0
新小岩支店         0
合計 0 0 0 0 0

表のなかに入っている0はワークシート関数のSUMをあらかじめ入れてある。

コード

Option Explicit
Option Base 1
Sub main()
    Dim cll As Range
    Dim stn As String, nnd As String, shk As String
    Dim ary As Variant
    Dim kyk As Integer, kym As Integer

    For Each cll In Sheets("集計").Range("B3:E8")
        With Sheets("集計")
            stn = .Cells(cll.Row, 1).Value
            nnd = .Cells(2, cll.Column).Value
            ary = Split(nnd, "/")
            nnd = ary(0)
            shk = ary(1)
        End With
        With Sheets("契約一覧")
            .Range("A1").AutoFilter Field:=5, Criteria1:=stn
            .Range("A1").AutoFilter Field:=2, Criteria1:=nnd
            .Range("A1").AutoFilter Field:=3, Criteria1:=shk
            kyk = WorksheetFunction.Subtotal(3, .Columns(1)) - 1
            kym = WorksheetFunction.Subtotal(9, .Columns(6)) / 1000000
            cll.Value = kyk
            cll.Offset(10, 0).Value = kym
            .Range("A1").AutoFilter
        End With
    Next cll
    ActiveWorkbook.Save
End Sub

回す数は契約件数と契約金額で一緒なので、契約件数で代表させている。

stn(支店)とnnd(年度)を取り、nndをバリアント型のaryへsplitで年度と四半期に分けて入れている。

契約一覧に入り、AutoFilter、Subtotalで絞り込みと集計データをとり、kyk(契約件数)と、offsetを10にすることにより、Kym(契約金額)と2つのCll(セル)に同時に入れている。(Kymを1000000で割っているのは金額が大きいためである)

後はフィルターの解除と上書き保存だけである。

サイトご利用方法

次のページ・前のページを利用するよりも、グローバルメニュー(ヘッダー部分にある項目)・サブメニュー記事の項目をクリックしていただければ、その項目の全体像が一目でみることができ、クリックすればそのサイトへ飛びます。

google、yahoo、Bingなどで検索する場合、検索ワードは先頭に、孤立じじい、と入力しその後に、グローバルメニュー・サブメニュー記事のどれかひとつの項目を入力すると、その検索サイトが上位表示されます。