我在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
答案 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