🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

579閲覧

【VBA】週番号が同じ日付のデータを抜き出し、計算を行う。

JuguarSugar

総合スコア83

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2021/03/08 01:50

お世話になります。

現在業務用のVBAファイルを作成しておりまして、全社員の毎日の勤怠データがシステムから1つのCSVファイルとして
下図のような形で出力されるようになっています。

A[1]   B[2]   C[3]     D[4]  E[5]     F[6]     G[7]
社員番号 氏名    年月日    曜日   実働時間数  普通労働時間 週番号
1    テスト社員  20210315  (月)   7:00   6:00   12
1    テスト社員  20210316  (火)   8:00   6:00   12
1    テスト社員  20210317  (水)   8:00   8:00   12
1    テスト社員  20210318  (木)   8:00   8:00   12
1    テスト社員  20210319  (金)   8:00   8:00   12
1    テスト社員  20210320  (土)   8:00   8:00   12

この中で
社員番号が同じ かつ 週番号が同じ かつ 週の実働時間数の合計が40時間を超えている週の
実働時間数と普通労働時間数の差異分の時間の合計を出したいと考えています。
図の中ですと月曜日に1時間分の差異が出て火曜日に2時間分の差異が出ているため、
「3:00」という値を出したいと考えています。

VBA初心者でインターネットから色々調べてみたのですがこのような応用の仕方が見つからず困っております。
お手数おかけいたしますがご助力いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

多分こんな雰囲気でやったら出来ると思います。

VBA

1 Dim shainNo, WeekNo, jdTime, ftTime, saiTime 2 3 jdTime = WorksheetFunction.SumIfs(Columns(5), Columns(1), shainNo, Columns(7), WeekNo) 4 ftTime = WorksheetFunction.SumIfs(Columns(6), Columns(1), shainNo, Columns(7), WeekNo) 5 saiTime = jdTime - ftTime 6

ただし、Excelのバージョンが古すぎるとSUMIFSが使えないかもしれないです。


<追記>
ピボットテーブルを作るアプローチを試してみました。

VBA

1Sub MakePivot() 2 3 Dim wb As Workbook 4 Set wb = Workbooks.Open(Environ("userprofile") & "\Documents\data.csv") 5 6 Dim ws As Worksheet 7 Set ws = wb.Worksheets("data") 8 9 Dim lo As ListObject 10 Set lo = ws.ListObjects.Add(xlSrcRange, ws.UsedRange.Resize(, ws.UsedRange.Columns.Count + 1), , xlYes) 11 12 With lo.ListColumns(lo.ListColumns.Count) 13 .Range(1) = "差異時間" 14 .DataBodyRange.NumberFormatLocal = "[h]:mm" 15 .DataBodyRange.Formula2R1C1 = "=[@実働時間数]-[@普通労働時間]" 16 End With 17 18 wb.PivotCaches.Create(xlDatabase, ws.UsedRange).CreatePivotTable ws.Cells(1, lo.ListColumns.Count + 2) 19 20 Dim pt As PivotTable 21 Set pt = ws.PivotTables(1) 22 With pt.PivotFields("週番号") 23 .Orientation = xlRowField 24 .Position = 1 25 End With 26 With pt.PivotFields("社員番号") 27 .Orientation = xlRowField 28 .Position = 2 29 End With 30 With pt 31 .AddDataField .PivotFields("実働時間数"), "合計 / 実働時間数", xlSum 32 .AddDataField .PivotFields("普通労働時間"), "合計 / 普通労働時間", xlSum 33 .AddDataField .PivotFields("差異時間"), "合計 / 差異時間", xlSum 34 .DataBodyRange.NumberFormatLocal = "[h]:mm" 35 End With 36 37End Sub

投稿2021/03/08 02:25

編集2021/03/08 11:07
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JuguarSugar

2021/03/08 02:46

ご回答いただきありがとうございます! SUMIFS関数を使うことは考え付いておりませんでした。 いただいた回答を元に再度考えてみます。
jinoji

2021/03/08 02:58

要件次第ですけど、VBAにこだわらず、社員一覧にSUMIFS関数を仕込んだ算出用Excelファイルを用意しておいて、CSVを参照させる、なんて手もあるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問