如果一列中的日期相同,则将另一列中的值相加

时间:2018-03-26 12:06:18

标签: excel vba excel-vba

我在VBA上相当新,而且我目前正在尝试重新编写一个现有的宏,这个宏将工作日的工作时间总计为本周的工作日。

我需要一个宏,它将工作时间总计一天而不是每周一次。每位员工每天有两个条目。然后,将此总数复制并粘贴到不同的列中。

我无法使用数据透视表,因为此宏每周将在不同的电子表格中使用。我也没有参考表。这将应用于每周通过电子邮件发送的电子表格,因此它会不断变化。

基本上......如果B列中的日期相同,我需要C列中的小时总和,然后将该Sum粘贴到新列(D很好)。

以下是此时原始报告的内容:

R.layout.spinner_row.xml

现有的宏是:

  A               B         C
Joe Smith  --  03/26/2018 -- 3.65
Joe Smith  --  03/26/2018 -- 4.46
Joe Smith  --  03/27/2018 --  5.45
Joe Smith  --  03/27/2018 --  2.93

2 个答案:

答案 0 :(得分:0)

  

我无法使用数据透视表,因为此宏将用于其他宏   电子表格每周一次。

嗯,这不是一个原因。您可以随时运行数据透视表的更改源。

  

这将应用于每周通过电子邮件发送的电子表格

但至少保留了工作簿的布局? 最简单的方法是使用公式:

=SUMIFS(C:C, A:A, A2, B:B, B2)

将其粘贴到D2并向下拖动。您也可以将公式放到A:C中,它只引用源文件中的正确值,如:

=[WorkbookFromEmail.xlsx]Sheet1!A2

然后将其向左拖动到C并向下拖动到您认为需要的行数等等。然后,您只能在“数据/编辑链接”中更改链接文件的名称。 到目前为止,您不需要VBA。但是,如果您发现手动作业太麻烦,您可以制作一些宏来刷新指向其他工作簿的链接。然而,这是不同的故事。 或者,您可以始终使用相同的名称保存源文件,例如BookFromMail.xlsx,然后使用公式打开主文件并刷新它。

答案 1 :(得分:0)

这是一种全代码方式。您必须调整代码以找到您想要阅读的范围,并找出要写入的位置。

Sub SumEeDays()

    Dim vaValues As Variant
    Dim i As Long
    Dim dc As Scripting.Dictionary
    Dim sKey As String

    'set a reference to the MS Scripting Runtime
    'then you wont get an error on this line
    Set dc = New Scripting.Dictionary

    'Make a 2d array of the values you want process
    vaValues = Sheet1.Range("a1").CurrentRegion.Value

    'loop through the 2d array
    For i = LBound(vaValues, 1) To UBound(vaValues, 1)
        'create a unique key to keep track of ee name and date
        sKey = vaValues(i, 1) & "||" & vaValues(i, 2)

        If dc.Exists(sKey) Then
            'If the key already exists, add the hours to what's there
            dc.Item(sKey) = dc.Item(sKey) + vaValues(i, 3)
        Else
            'If the key doesn't exist, create it and add the hours
            dc.Add sKey, vaValues(i, 3)
        End If
    Next i

    'Loop through the dictionary of unique name/dates
    For i = 1 To dc.Count
        With Sheet1.Range("J1")
            'Keys returns an array and Split splits it on "||"
            'The 0th element of the array is the name
            'The 1st element is the date
            .Offset(i - 1, 0).Value = Split(dc.Keys(i - 1), "||")(0)
            .Offset(i - 1, 1).Value = Split(dc.Keys(i - 1), "||")(1)
            .Offset(i - 1, 2).Value = dc.Items(i - 1)
        End With
    Next i

End Sub