1
Sub Add_sumf()
Dim i As Integer
i = 3
Dim cellDate As Integer
cellDate = 0
Dim cellDate1 As Date
cellDate1 = TimeValue("00:00:00")
Dim total    As Integer
total = 0
Dim j As Integer
j = 2
Dim k As Integer
k = 2
Set aa = Workbooks("Book3").Worksheets(1)
Set bb = Workbooks("Final_result").Worksheets(1)
Do While bb.Cells(1, k).Value <> ""

    For Each y In bb.Range("A:A")
    On Error GoTo Label

    If UCase(bb.Cells(j, "A").Value) <> "" Then


     cellDate1 = WorksheetFunction.SumIfs(aa.Range("F:F"), aa.Range("B:B"), UCase(bb.Cells(1, k).Value), aa.Range("G:G"), UCase(bb.Cells(j, "A").Value))                         
    bb.Cells(j, k).Value = TimeValue(cellDate1)

    cellDate1 = TimeValue("00:00:00")
    bb.Cells(j, k).NumberFormat = "[h]:mm:ss"

    On Error GoTo Label

    j = j + 1
    Else
    Exit For
    End If
    Next
    j = 2
    k = k + 1
 Loop
Label:
    'MsgBox Err.Description
    Exit Sub


End Sub

上記のコードを使用して、他の 2 つの列の値に基づいて期間を追加していますが、結果として常に 00:00:00 を取得します。

以下のコードを使用すると、答えが得られますが、遅すぎます

Sub add_it_time()
Dim i As Integer
i = 3
Dim cellDate As Integer
cellDate = 0
Dim cellDate1 As Date
cellDate1 = TimeValue("00:00:00")
Dim total    As Integer
total = 0
Dim j As Integer
j = 2
Dim k As Integer
k = 2
Set aa = Workbooks("Book3").Worksheets(1)
Set bb = Workbooks("Final_result").Worksheets(1)
Do While bb.Cells(1, k).Value <> ""
 'MsgBox bb.Cells(1, k).Value
    For Each y In bb.Range("A:A")
    On Error GoTo Label
   ' MsgBox UCase(bb.Cells(j, "A").Value)
    If UCase(bb.Cells(j, "A").Value) <> "" Then

        For Each x In aa.Range("F:F")
        On Error Resume Next
        If UCase(aa.Cells(i, "B").Value) = UCase(bb.Cells(j, "A").Value) Then
       ' MsgBox aa.Cells(i, "F").Text
       ' total = total + Int(get_Second(aa.Cells(i, "F").Text))
        If UCase(aa.Cells(i, "G").Value) = UCase(bb.Cells(1, k).Value) Then
         'MsgBox aa.Cells(i, "F").Text
        cellDate1 = cellDate1 + TimeValue(aa.Cells(i, "F").Value)
        End If
        End If
        i = i + 1
        Next
        i = 3
        On Error GoTo Label
         bb.Cells(j, k).NumberFormat = "h:mm:ss"
        bb.Cells(j, k).Value = WorksheetFunction.Text(cellDate1, "[hh]:mm:ss")
        total = 0
        cellDate1 = 0
    j = j + 1
    Else
    Exit For
    End If
    Next
    j = 2
    k = k + 1
 Loop
Label:
    'MsgBox Err.Description
    Exit Sub
End Sub

日付を含むソース列は一般的な形式です VBA マクロは初めてです

4

1 に答える 1

3

更新されたソリューション:

OP とのチャットでの議論の後、純粋な数式ソリューションで問題ないと判断されました。以下は、のシートで開始する数式/アクションA1です。

  1. 行 Aは結果のテーブル ヘッダーになりA1ます。Agent Name / Release CodeB1Release CodeRemove Duplicates
  2. 簡単さと有効性のために、次の名前付き範囲を定義しました (初期データは静的ではないため)。 - これにより、ヘッダーを除くAgentNames=OFFSET('Agent State'!$B$2,0,0,COUNTA('Agent State'!$B:$B)-1,1)初期シートの名前の範囲が返されます。およびシフトされた範囲として。TimeInStateData=OFFSET(AgentNames,0,4)ReleaseCodes=OFFSET(AgentNames,0,5)AgentNames
  3. Aでは、一意である必要がある名前のリストを取得する必要があるため、一意の名前の数より少なくないA数のセルを列で選択します-使用したサンプルの場合、その式を入力します:の代わりに+ +を押します通常- これにより、マルチセル ARRAY式が定義され、中かっこで囲まれます (ただし、手動で入力しないでください!)。A2:A51=IFERROR(INDEX(AgentNames,SMALL(IF(MATCH(AgentNames,AgentNames,0)=ROW(INDIRECT("1:"&ROWS(AgentNames))),MATCH(AgentNames,AgentNames,0),""),ROW(INDIRECT("1:"&ROWS(AgentNames))))),"")CTRLSHIFTENTERENTER{}
  4. B2: =IF(OR($A2="",SUMPRODUCT(--($A2=AgentNames),--(B$1=ReleaseCodes),TIMEVALUE(TimeInStateData))=0),"",SUMPRODUCT(--($A2=AgentNames),--(B$1=ReleaseCodes),TIMEVALUE(TimeInStateData)))- 通常の数式。空の名前またはゼロ時間に対して空の値を返します。
  5. 数式をB2テーブル全体にコピーします。

備考:

  • 時間値の合計の結果の範囲は、次のようにフォーマットする必要がありますTime
  • 将来、名前のリストを拡張する必要がある場合は、新しい範囲に対して手順 3 を繰り返しますが、数式を下にドラッグしないでください。これにより、You cannot change part of an arrayエラーが発生します。

サンプル ファイル: https://www.dropbox.com/s/qudyx1v2fup6sh/AgentsTimeSUM.xls

最初の答え:

おそらくそれは単純すぎて明白ですが、一見すると、なぜそのコード行があるのか​​ わかりません。

cellDate1 = TimeValue("00:00:00")

あなたの直後SUMIFScellDate1 = WorksheetFunction.SumIfs(aa.Range("F:F"), ...

にゼロを割り当てた最初のものを削除してみてくださいcellDate1

于 2013-03-02T07:32:54.113 に答える