Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7050 / 13644 ツリー ←次へ | 前へ→

【41472】別のシートに合計を当てはめたいのです・・・ みなみ 06/8/11(金) 13:56 質問[未読]
【41476】Re:別のシートに合計を当てはめたいので... 飛ばない豚 06/8/11(金) 15:05 回答[未読]
【41482】ありがとうございます。できればVBAで書... みなみ 06/8/11(金) 20:23 質問[未読]
【41483】Re:別のシートに合計を当てはめたいのです... かみちゃん 06/8/11(金) 21:06 回答[未読]
【41487】Re:別のシートに合計を当てはめたいのです... みなみ 06/8/12(土) 1:35 お礼[未読]
【41485】Re:別のシートに合計を当てはめたいのです... Kein 06/8/12(土) 0:46 回答[未読]
【41490】Re:別のシートに合計を当てはめたいのです... みなみ 06/8/12(土) 2:34 お礼[未読]

【41472】別のシートに合計を当てはめたいのです・...
質問  みなみ  - 06/8/11(金) 13:56 -

引用なし
パスワード
   皆様こんにちは。
ずっとしたいなと思っていた事がありました。

"シート1"でA列を日付、B列を時間1、C列を時間2として、その月の労働時間を入力します。

  A  B   C   
1 2  8:30 10:30  
2 2 11:40 11:55  
3 3 22:00 0:40  
4 4 13:20 13:50
5 4 14:00 14:30 
6 4 18:00 18:50 
7 6 10:00 13:50
8 6 14:00 15:50 
9 7 11:00 13:50    

一行ごとにDateDiff("n", Range("c1"), Range("b1")) 
などで分を計算する事はできるんですが、
forを使って各日付ごとの時間の合計を、
下記のようなA列に日付を書いた同一ブックの"シート2"のB列に入力していきたいのです。

  A  B      
1 1日 
2 2日 
3 3日 
4 4日 
5 5日 
6 6日 
7 7日 
8 8日  
9 9日  


いろいろ考えましたが、うまくいきません。
こんな簡単な事自分で考えろ!って言われてしまうかも知れませんが・・・。
どなたかご教授頂けませんでしょうか。

よろしくお願い致します。

【41476】Re:別のシートに合計を当てはめたいので...
回答  飛ばない豚  - 06/8/11(金) 15:05 -

引用なし
パスワード
   ▼みなみ さん:
こんにちは。

Sheet2のA列の値を1,2,3,・・・・・とし、
書式にて1日,2日,3日,・・・・・とします。

B1に式
=SUMIF(Sheet1!$A$1:$A$9,"="&A2,Sheet1!$C$1:$C$9)
-SUMIF(Sheet1!$A$1:$A$9,"="&A2,Sheet1!$B$1:$B$9)
+IF(Sheet1!B2>Sheet1!C2,1,0)

を入れ、下にフィルしていきます。
(見難いので、3行にしましたが、1行で入れます)

これで出ると思いますが、いかがですか?

Sheet1のB列、C列が時刻のみのデータ(日付なし)の前提です。
また、
Sheet1!$A$1:$A$9
Sheet1!$B$1:$B$9
Sheet1!$C$1:$C$9
は、データに応じて適宜変更してください。

ちょっと重くなるけど
Sheet1!C:C
等でも大丈夫です。


VBではありませんが、参考までに。

【41482】ありがとうございます。できればVBAで...
質問  みなみ  - 06/8/11(金) 20:23 -

引用なし
パスワード
   飛ばない豚 さん

こんばんは。早々にレス頂きまして、本当にありがとうございます。

こんなに洗練はされていませんが、私も似た方法で計算しているんです。

勝手言って申し訳ありませんが、VBAでの方法を教えて頂けませんでしょうか。

【41483】Re:別のシートに合計を当てはめたいので...
回答  かみちゃん E-MAIL  - 06/8/11(金) 21:06 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>各日付ごとの時間の合計を、
>下記のようなA列に日付を書いた同一ブックの"シート2"のB列に入力していきたい

私も、似たような日別集計を以下のようなコードでしています。

Sub Macro1()
 Dim LastCell As Range
 Dim c As Range
 '日別集計用の変数31要素
 Dim vntData(31) As Long
 
 Sheets("Sheet1").Activate
 Set LastCell = Cells(Cells.Rows.Count, 1).End(xlUp)
 For Each c In Range("A1", LastCell)
  '24時をまたがる場合の経過時間の集計
  If c.Offset(, 1).Value >= c.Offset(, 2).Value Then
   vntData(Val(c.Value) - 1) = vntData(Val(c.Value) - 1) + DateDiff("n", c.Offset(, 1).Value, TimeSerial(24, 0, 0))
   vntData(Val(c.Value) - 1) = vntData(Val(c.Value) - 1) + DateDiff("n", TimeSerial(0, 0, 0), c.Offset(, 2).Value)
  Else
   vntData(Val(c.Value) - 1) = vntData(Val(c.Value) - 1) + DateDiff("n", c.Offset(, 1).Value, c.Offset(, 2).Value)
  End If
 Next
 Sheets("Sheet2").Range("B1").Resize(UBound(vntData)).Value = Application.Transpose(vntData)
 MsgBox "集計完了"
End Sub

【41485】Re:別のシートに合計を当てはめたいので...
回答  Kein  - 06/8/12(土) 0:46 -

引用なし
パスワード
   提示されているサンプルデータでテストした限りでは、
以下のようなコードでうまくいきましたが・・。

Sub MyDayJob_TotalTime()
  Dim Sh As Worksheet
  Dim MyR As Range, C As Range
  Dim Dy1 As Date, Dy2 As Date, MyD As Date
  Dim GetT As Long, Mt As Long
  Dim GetD As String
  Dim SetD As Variant
 
  Set Sh = Worksheets("Sheet2")
  With Application
   .ScreenUpdating = False
   .DisplayAlerts = False
  End With
  With Worksheets("Sheet1")
   .Rows(1).Insert xlShiftDown
   .Range("A1:D1").Value = _
   Array("DAY", "TIME1", "TIME2", "TOTAL")
   Set MyR = .Range("A2", .Range("A65536").End(xlUp)) _
   .Offset(, 3)
   For Each C In MyR
     Dy1 = C.Offset(, -2).Value: Dy2 = C.Offset(, -1).Value
     If Dy1 < Dy2 Then
      GetT = DateDiff("n", Dy1, Dy2)
      If GetT >= 60 Then
        Mt = GetT Mod 60
        If Mt = 0 Then
         C.Value = Format(GetT / 60, "00") & ":00"
        Else
         C.Value = Format(GetT \ 60, "00") & ":" & Mt
        End If
      Else
        C.Value = "00:" & GetT
      End If
     Else
      MyD = TimeValue("23:59:59") - Dy1 + Dy2 + _
      TimeValue("00:00:01")
      C.Value = Format(MyD, "hh:mm")
     End If
   Next
   .Range("A1").Subtotal 1, xlSum, Array(4)
   Set MyR = .Range("D2", .Range("D65536") _
   .End(xlUp).Offset(-1)).SpecialCells(3, 1)
   For Each C In MyR
     GetD = Val(C.Offset(, -3).Value) & "日"
     SetD = Application.Match(GetD, Sh.Range("A:A"), 0)
     If Not IsError(SetD) Then
      Sh.Cells(SetD, 2).Value = Format(C.Value, "hh:mm")
     End If
   Next
   .Cells.RemoveSubtotal
   .Rows(1).Delete xlShiftUp
  End With
  With Application
   .ScreenUpdating = True
   .DisplayAlerts = True
  End With
  Sh.Activate: Set MyR = Nothing: Set Sh = Nothing
End Sub

【41487】Re:別のシートに合計を当てはめたいので...
お礼  みなみ  - 06/8/12(土) 1:35 -

引用なし
パスワード
   ▼かみちゃん さん:

こんばんは。みなみです。
2時間程、無い頭で考えてやっと理解できました。

こう書けば出来るんですね。
勉強になりました。
本当にありがとうございました。

【41490】Re:別のシートに合計を当てはめたいので...
お礼  みなみ  - 06/8/12(土) 2:34 -

引用なし
パスワード
   ▼Kein さん:

こんばんは。みなみです。

一コマずつ送りながら魅させて頂いていますが、すごいコードですね。
まだまだ全体を把握するのに時間が掛かります・・・。
勉強させて頂きますね。

ありがとうございました。

7050 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free