【问题标题】:How to use Excel VBA to conditionally add and delete certain rows in a table如何使用 Excel VBA 有条件地添加和删除表中的某些行
【发布时间】:2019-06-14 21:00:57
【问题描述】:

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

日期、员工姓名、任务编号、小时数、当月日期

每一行包含所有列的信息。

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

当满足以下条件时添加和合并行

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2011-11-30
    • 2016-08-28
    • 1970-01-01
    • 2016-03-19
    • 2018-05-03
    • 2017-01-01
    相关资源
    最近更新 更多