
sheet1に日計のデータがあり、sheet2に集計(日数や距離など)したいです。
(添付画像を参照して下さい)
この際、担当者ごとに出勤日数を数えたいのですが、
同一人で同じ日のデータが複数あるので、重複させずに日数を数えたいです。
下記のような感じで組んでいるのですが、日数合計の出し方がわかりません。
Dim i As Long, n As Long, d As Long
Dim km As Long
Dim lrow As Long
Dim name As String
Sub total()
lrow = Worksheets("sheet1").Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To lrow
name = Worksheets("sheet1").Cells(i, 12).Value '該当データの担当者名
n = Worksheets("sheet2").Range("B3:B11").Find(what:=name, lookat:=xlWhole).Row 'sheet2の担当者行番号
d = Worksheets("sheet1").Cells(i, 2).Value '該当データの日付
km = Worksheets("sheet1").Cells(i, 11).Value '該当データの距離
'<ここに、sheet2への集計方法を記載したい>
'<特に、担当の”日数”を数える方法がわからない>
Worksheets("sheet2").Cells(n, 4).Value = Worksheets("sheet2").Cells(n, 4).Value + km
'<距離の加算はこんな感じで良いと思います>
Next i
End Sub

No.2ベストアンサー
- 回答日時:
dictionaryを使用した例です。
sheet1のB14の”月末まで”は、説明上のためで、実際にはないと解釈しています。
以下のマクロを標準モジュールに登録してください。
このサイトにアップするとエラーになるので、下記URLにアップしました。
https://ideone.com/Si2qFy
不明点があれば、補足してください。
回答、ありがとうございます。
ご丁寧にコードまで記載して頂き恐縮です。
現在、手元にMac環境しか無いので、明日、ウィンドウズ環境で試してみます。
(MacではDictionaryが使えないようなので)
No.4
- 回答日時:
見えないですが回答が既に付いているようですね。
重複したらこれはスル~して下さい。
距離の合計って日付は関係なく、担当者別に合計したいってならSUMIFS関数でも良かったかなと、眠気と格闘しながらそう感じました。
⇒シート2のB列は先に入力されているのですよね?
あとはシート3を準備しシート1のA・B列をシート3の2行目以下にコピペ、その後シート2のB列をシート3に行列反転して1行目にコピペし2行目以下の重複削除したデータを用い、COUNTIFS関数で日付+担当者で小計を求めた後担当者毎に合計を出す。
と言うのも考えましたけど、初級レベルなジジィが時間かけて思いついたのでお若い方なら直ぐに出来てしまっているかな?
無論月を跨ぐと言う場合には変更が必要でしょうけど。
No.3
- 回答日時:
こんばんは
>この際、担当者ごとに出勤日数を数えたい
ご質問のコードを反故して申し訳ないのです
各日付ごとに担当者が入っているか調べ換算する(日付はソートされている)
担当者に一致する距離を換算
結果を出力
IF分岐だと解り難くなってしまいそうなので1つ1つ分けて
(一例です 改修や他の処理を加えやすいと思います)
Sub test0()
Dim Sht1 As Worksheet, Sht2 As Worksheet
Set Sht1 = Worksheets("sheet1")
Set Sht2 = Worksheets("sheet2")
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dim r As Range
'担当者リストを作成 前準備
For Each r In Range(Sht1.Cells(2, "L"), Sht1.Cells(Rows.Count, "L").End(xlUp))
If Not Dic.exists(r.Value) Then
Dic.Add r.Value, 0#
End If
Next r
'同日範囲取得(纏まっている事が必須)前準備
Dim srtR As Range
Dim stAddress As String
Set srtR = Sht1.Cells(2, "B")
For Each r In Range(srtR, Sht1.Cells(Rows.Count, "B").End(xlUp).Offset(1))
If r.Value <> srtR.Value Then
If stAddress <> "" Then
stAddress = stAddress & "," & Range(srtR, r.Offset(-1)).AddressLocal(0, 0)
Else
stAddress = Range(srtR, r.Offset(-1)).AddressLocal(0, 0)
End If
Set srtR = r
End If
Next r
Dim arr(), k As Variant
Dim i As Integer, n As Long
'出力配列サイズ設定
ReDim arr(Dic.Count, 2)
'担当者リストを基に算出(前処理変数を使って)
For Each k In Dic
'同日処理
For i = 1 To Range(stAddress).Areas.Count
If Application.CountIf(Sht1.Range(stAddress).Areas(i).Offset(, 10), k) > 0 Then
arr(n, 0) = k '担当者を出力配列に
arr(n, 1) = arr(n, 1) + 1 '日数を換算出力配列に
End If
Next
'距離集計
For Each r In Range(Sht1.Cells(2, "B"), Sht1.Cells(Rows.Count, "B").End(xlUp))
If k = r.Offset(, 10).Value Then arr(n, 2) = arr(n, 2) + r.Offset(, 9).Value '距離を積算 出力配列に
Next r
n = n + 1
Next
'結果出力
Sht2.Cells(3, "B").Resize(UBound(arr, 1) + 1, UBound(arr, 2) + 1).Value = arr
End Sub
ご回答、ありがとうございます。
ウィンドウズ環境で希望通りの動作が確認できました!
(Mac環境ではdictionaryが使えないようですが、Winなら動きました)
とはいえ、自分自身ではまだdictionaryの使い方が理解できませんので、
頂いたソースを理解できるよう学習してみようと思います。
この度はありがとうございました!
No.1
- 回答日時:
>lrow = Worksheets("sheet1").Cells(Rows.Count, 2).End(xlUp).Row
シート1のB14には文字が入っているようですが、最終行をそこにして良いのでしょうか?
A14は空白セルのようですが、A列で取得するなら最終行は13行目になりますよね?
何らかの狙いあっての事ですか?
過去質で検索するなら良く見かけるのはDictionary オブジェクトの使用でしょうかね。
このような感じの物です。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) Sheet2からオートフィルターで売上日を抽出した件数をカウントし、その件数をSheet1のセルB1 2 2023/01/12 12:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
多量のSUMIF式を軽くしたい
-
チェックサムの実装方法について
-
【エクセル】測定時間がバラバ...
-
VBA 毎日取得するデータを順番...
-
メモ帳(テキストデータ)をExc...
-
配列でデータが入っている要素...
-
C#でデータのファイル保存と保...
-
VBAで大量データの処理
-
この行は既に別のテーブルに属...
-
複数のブックのデータを集めて...
-
二分探索の平均探索回数
-
FORTRANでのプログラミングです...
-
Excel vbaで、一行ずつコピーし...
-
【USBメモリ】Sequential Writ...
-
Accessで該当データにフラグを...
-
データのアップロードやダウン...
-
家計簿プログラム
-
チェックサムとCRC
-
サムチェックのルール
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
ユーザーフォームのテキストボ...
-
特定のデータの抽出方法を教え...
-
二分探索の平均探索回数
-
EXCELVBAでSQLserverからデータ...
-
Accessで該当データにフラグを...
-
VBA 空白セルを削除ではない方...
-
この行は既に別のテーブルに属...
-
Excel VBAでのオートフィルター...
-
[C言語] コメント文字列を無視...
-
エクセルで2つの時系列のデー...
-
アクセス2000で画像データ...
-
CString型の文字列連結について
-
カンマからスラッシュに
-
VBにおいてフォーム間の変数の...
-
<VB>String→Object
おすすめ情報
ウィンドウズ環境で希望通りの動作が確認できました!
とはいえ、自分自身ではまだdictionaryの使い方が理解できませんので、
頂いたソースを理解できるよう学習してみようと思います。
この度はありがとうございました!