首页 > 解决方案 > 如何使用 Excel VBA 有条件地添加和删除表中的某些行

问题描述

我有一个包含以下列的表格

日期、员工姓名、任务编号、小时、月中的某天

每行包含所有列的信息。

我要做的就是根据以下标准/条件组合(查找小时的总和)某些行:

当以下为真时添加和合并行

  1. 有相同的日期
  2. 有相同的员工姓名
  3. 包含以“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

标签: excelvbadata-analysis

解决方案


@dwirony。倒数第三个 if 语句仅确定前两个类别案例的可能性(参考我在示例之前的描述)。所以最后两个 if 语句分别检查第一个和第二个类别。

另外,我希望代码仅在倒数第三个 if 语句为真时才运行最后两个 if 语句。不确定实际发生了什么。

@MathieuGuindon @dwirony 感谢您的反馈。还有其他建议吗?


推荐阅读