Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 求和并删除重复行_Vba_Excel - Fatal编程技术网

Vba 求和并删除重复行

Vba 求和并删除重复行,vba,excel,Vba,Excel,我需要一个显示DriverName和Duration列的表,其他每一列都可以删除。必须删除所有重复项,并对每个驱动程序的持续时间进行汇总 我已经为此挣扎了一段时间,下面是我尝试使用的代码。它需要在Vba中完成 如果有人能帮忙,我将不胜感激 Sub MG02Sep59 Dim Rng As Range, Dn As Range, n As Long, nRng As Range Set Rng = Range(Range("D2"), Range("D" & Rows.Count).End

我需要一个显示DriverName和Duration列的表,其他每一列都可以删除。必须删除所有重复项,并对每个驱动程序的持续时间进行汇总

我已经为此挣扎了一段时间,下面是我尝试使用的代码。它需要在Vba中完成

如果有人能帮忙,我将不胜感激

Sub MG02Sep59
Dim Rng As Range, Dn As Range, n As Long, nRng As Range
Set Rng = Range(Range("D2"), Range("D" & Rows.Count).End(xlUp))
With CreateObject("scripting.dictionary")
.CompareMode = vbTextCompare
For Each Dn In Rng
    If Not .Exists(Dn.Value) Then
        .Add Dn.Value, Dn
    Else
        If nRng Is Nothing Then Set nRng = _
       Dn Else Set nRng = Union(nRng, Dn)
        .Item(Dn.Value).Offset(, 3) = .Item(Dn.Value).Offset(, 3) +    Dn.Offset(, 3)
    End If
Next
If Not nRng Is Nothing Then nRng.EntireRow.Delete
End With
End Sub

一般来说,你使用字典的想法可能是个好主意。但是,我没有看到如何向其传递密钥,因此这是一个快速解决方案:

Option Explicit

Public Sub TestMe()

    Dim colCount    As Long
    Dim myCell      As Range
    Dim counter     As Long

    colCount = Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
                xlPart, SearchOrder:=xlByColumns, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False).Column

    For counter = colCount To 1 Step -1
        If Cells(4, counter) <> "DriverName" And Cells(4, counter) <> "Duration" Then
            Columns(counter).Delete
        End If
    Next counter       

End Sub
选项显式
公共子TestMe()
淡漠的寒冷与漫长的岁月一样
暗淡的迈塞尔山脉
昏暗的柜台一样长
colCount=Cells.Find(What:=“*”,After:=单元格(1,1),LookIn:=xlformals,LookAt:=_
xlPart,SearchOrder:=xlByColumns_
搜索方向:=xlPrevious_
MatchCase:=False)。列
对于计数器=colCount到1步骤-1
如果单元格(4,计数器)“DriverName”和单元格(4,计数器)“Duration”,则
列(计数器)。删除
如果结束
下一个柜台
端接头
代码假定表的标题始终是第4行。一旦这个假设准备好,借助于,我们用数据定义最后一列,并开始从它到第1列的循环,检查
单元格(4,计数器)
是否不是
驱动器名
持续时间
。如果不是,我们将其删除

您可以考虑稍后声明工作表,只要当前代码将始终引用ActhEsHeTET.< /P> 将所有内容设置为联合范围确实是一个更好的主意,因为这样删除操作只需执行一次,而且速度更快(但是,如果列数少于100,则不会明显)


关于“删除重复项”,请看这里-。

@RossH-我明白了。看看编辑,您应该能够轻松地删除重复项。关于驱动程序的求和,使用字典遍历行是一个好主意。我是初学者,所以您可以给我演示一个求和持续时间值的示例吗?@RossH-求和持续时间值就像求和其他值一样-您使用
+
符号。诀窍在于,最后必须将结果格式化回duration。像这样的
范围(“F16”).NumberFormat=“hh:mm:ss”