【发布时间】:2019-06-14 21:00:57
【问题描述】:
我有一个包含以下列的表格
日期、员工姓名、任务编号、小时数、当月日期
每一行包含所有列的信息。
我要做的就是根据以下标准/条件组合(查找小时的总和)某些行:
当满足以下条件时添加和合并行
- 日期相同
- 员工姓名相同
-
包含以“LBR”开头的任务# 的行,“LBR 30”、“LBR 28”除外 (我的代码中还有一些 LBR# 异常)
OR 行只有异常 LBR (LBR 30, LBR 28..)
OR 只有非 LBR 任务的行#
换句话说,对于某个日期和员工姓名,我只想拥有三个不同类别的行
1) 总“LBR”小时数(不包括例外情况)(由“任务#”列确定)
2) 总“LBR”小时数(仅例外一次)(由“任务#”列确定)
3) 总非“LBR”小时数
例子:
Date Employee Task Hrs Dom
6/4/2019, Wright , Stephen, CND05, 30, 4
6/1/2019, Wimberly, Robert, LBR16, 30, 1
6/1/2019, Wimberly, Robert, CNRWK, 30, 1
6/1/2019, Wimberly, Robert, A02060, 30, 1
6/2/2019, Wimberly, Robert, LBR16, 30, 2
6/2/2019, Wimberly, Robert, A03000, 30, 2
6/2/2019, Wimberly, Robert, A03000, 30, 2
6/2/2019, Wimberly, Robert, LBR30, 30, 2
6/2/2019, Wimberly, Robert, LBR28, 30, 2
6/2/2019, waja, A02060 30, 2
6/2/2019, waja, A02060, 30, 2
我想把它转换成这个:
Date Employee Task Hrs Dom
6/4/2019, Wright, Stephen CND05, 30, 4
6/1/2019, Wimberly, Robert, LBR16, 30, 1
6/1/2019, Wimberly, Robert, CNRWK, 60, 1
6/2/2019, Wimberly, Robert, LBR16, 30, 2
6/2/2019, Wimberly, Robert, A03000, 60, 2
6/2/2019, Wimberly, Robert, LBR 30, 60, 2
6/2/2019, waja , , A02060, 60, 2
我所做的是任何两行具有相似的日期、名称和任务类别(三个类别之一),我计算了他们的时间总和并保留了一行(删除了任何人并保留了另一行)(注意:它可以是超过两行需要合并)。
我首先按照日期、名称和任务#对表格进行排序并实现以下代码
Sub SortAndSum()
Dim R As Integer
Dim PR As Integer
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Set wkb = Excel.Workbooks("LaborHours.xlsx")
Set wks = wkb.Worksheets("srg.hours")
R = 6
Do While wks.Cells(R, 2) <> ""
PR = R - 1
If wks.Cells(R, 1) = wks.Cells(PR, 1) Then
If wks.Cells(R, 2) = wks.Cells(PR, 2) Then
If InStr(1, wks.Cells(R, 3) & wks.Cells(PR, 3), "LBR") = 0 Then GoTo SumAndDelete
ElseIf InStr(1, wks.Cells(R, 3) & wks.Cells(PR, 3), "LBR") = 1 Then
If wks.Cells(R, 3) & wks.Cells(PR, 3) = "LBR10" Or "LBR28" Or "LBR29" Or "LBR291" Or "LBR293" Or "LBR295" Then GoTo SumAndDelete
ElseIf wks.Cells(R, 3) & wks.Cells(PR, 3) <> "LBR10" Or "LBR28" Or "LBR29" Or "LBR291" Or "LBR293" Or "LBR295" Then GoTo SumAndDelete
SumAndDelete:
wks.Cells(R, 4) = Cells(R, 4) + Cells(PR, 4)
wks.Rows(PR).Delete
Else
GoTo NextRow
End If
End If
NextRow:
R = R + 1
Loop
End Sub
我的代码有问题: -我必须多次运行此代码才能获得最终结果。 - 处理 LBR 时,我得到运行时错误 13,类型不匹配。当我点击“Debugg”按钮时,它会突出显示以下代码部分:
ElseIf wks.Cells(R, 3) & wks.Cells(PR, 3) <> "LBR10" Or "LBR28" Or "LBR29" Or "LBR291" Or "LBR293" Or "LBR295" Then GoTo SumAndDelete
【问题讨论】:
-
删除行时需要循环向后
-
您的设置还有许多其他问题 - 摆脱
GoTos,而您的Ors 需要针对某些东西进行每次测试。 -
@dwirony 仅在您效率低下的情况下;-) ...第一步,找出要删除的行 -
Union他们;第二步,一次操作将它们全部删除;这样就不需要向后循环,删除之间不会发生重新计算和重新绘制等。 -
我不明白你的最后 2 个
If语句 - 第一个说“如果它包含这些 LBR 值,则删除这些行”,然后继续它说“删除这些行,如果它 不包含这些 LBR 值”。 -
@MathieuGuindon 是的,这是真的。第二次查看这段代码后,我意识到除了手头的循环顺序之外还有更多问题:)
标签: excel vba data-analysis