excel - 如何使用 Excel VBA 有条件地添加和删除表中的某些行
问题描述
我有一个包含以下列的表格
日期、员工姓名、任务编号、小时、月中的某天
每行包含所有列的信息。
我要做的就是根据以下标准/条件组合(查找小时的总和)某些行:
当以下为真时添加和合并行
- 有相同的日期
- 有相同的员工姓名
包含以“LBR”开头的任务#的行,除了“LBR 30”,“LBR 28”(在我的代码中还有一些LBR#异常)
或行只有异常 LBR (LBR 30, LBR 28..)
或只有非 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
解决方案
@dwirony。倒数第三个 if 语句仅确定前两个类别案例的可能性(参考我在示例之前的描述)。所以最后两个 if 语句分别检查第一个和第二个类别。
另外,我希望代码仅在倒数第三个 if 语句为真时才运行最后两个 if 语句。不确定实际发生了什么。
@MathieuGuindon @dwirony 感谢您的反馈。还有其他建议吗?
推荐阅读
- laravel - 我在哪里可以找到框架(Laravel)中的一些基本功能?例如 Illuminate\Auth\Middleware\AuthenticateWithBasicAuth 中的 basic()
- firebase - 使用分页器时更新材料表的问题
- php - 从购物车页面上的产品缩略图中删除链接
- javascript - 禁用其中一个包含任何值的
- html - 悬停图像上的 CSS 动画效果不起作用
- vue.js - Vue Router 模仿原生移动标签和历史堆栈
- url-parameters - 货币兑换 API 中的逗号?
- mysql - 如果不进行第二次查询,是否可以知道是什么 UPDATE "WHERE" 语句导致不更新?
- python - 当我使用 which python 时,python 有两个单独的路径
- javascript - 如何对带有解构 props 的组件进行测试?