Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel VBA宏,用于根据相邻值删除重复项及其相邻单元格_Excel_Vba - Fatal编程技术网

Excel VBA宏,用于根据相邻值删除重复项及其相邻单元格

Excel VBA宏,用于根据相邻值删除重复项及其相邻单元格,excel,vba,Excel,Vba,我一直在尝试编写一个宏来根据相邻的值删除重复的单元格/行。 我的意思是,我只需要邻域值最低的单元,f.e 1 | 1 2 | 1 1 | 2 1 | 0 然后 2 | 1 1 | 0 我知道Range.removedupplicates函数,但是我不能在这里以正确的方式使用它。 我的代码有点直截了当,并不总是删除所有重复的代码。我是VBA新手,所以可能是因为我不能真正理解输出来自哪里。 我的代码: Sub-usunDuplikaty3() Dim findRange作为范围,foundCell作

我一直在尝试编写一个宏来根据相邻的值删除重复的单元格/行。 我的意思是,我只需要邻域值最低的单元,f.e

1 | 1

2 | 1

1 | 2

1 | 0

然后

2 | 1

1 | 0

我知道Range.removedupplicates函数,但是我不能在这里以正确的方式使用它。 我的代码有点直截了当,并不总是删除所有重复的代码。我是VBA新手,所以可能是因为我不能真正理解输出来自哪里。 我的代码:

Sub-usunDuplikaty3()
Dim findRange作为范围,foundCell作为范围,cell作为范围,del作为布尔值
设置findRange=Range(“A1”,Range(Range(“A1”).End(xlDown).Address))
对于findRange中的每个单元格
Set foundCell=findRange.Find(cell.Value)
Do While Not foundCell为Nothing,foundCell.Address cell.Address

如果foundCell.Offset(0,1).Value我会尝试另一种方法。您可以使用MINIFS检查对应A值的B值是否最小,如果不是,则删除。这段代码在最后执行删除操作,这更容易,因为它避免了丢失行以及在执行时重新计算最小值

Sub usunDuplikaty3()

Dim findRange As Range, cell As Range, rDel As Range

Set findRange = Range("A1", Range("A" & Rows.Count).End(xlUp)) 'better to work up from the bottom

For Each cell In findRange
    If cell.Offset(, 1).Value <> WorksheetFunction.MinIfs(findRange.Offset(, 1), findRange, cell.Value) Then
    'alternative avoiding MINIFS
    'If cell.Offset(, 1).Value <> Evaluate("Min(If(" & findRange.Address & "=" & cell.Value & "," & findRange.Offset(, 1).Address & "))") Then
      If rDel Is Nothing Then
            Set rDel = cell
        Else
            Set rDel = Union(cell, rDel)
        End If
    End If
Next
    
If Not rDel Is Nothing Then rDel.EntireRow.Delete

End Sub
Sub-usunDuplikaty3()
变暗findRange作为范围,单元格作为范围,rDel作为范围
设置findRange=Range(“A1”,Range(“A”和Rows.Count).End(xlUp)),最好从底部向上操作
对于findRange中的每个单元格
如果cell.Offset(,1).Value工作表function.MinIfs(findRange.Offset(,1),findRange,cell.Value),则
"另类避孕药"
'If cell.Offset(,1).Value求值('Min(If(“&findRange.Address&“=”&cell.Value&“,“&findRange.Offset(,1).Address&”)然后
如果rDel什么都不是
设置rDel=单元
其他的
设置rDel=并集(单元格,rDel)
如果结束
如果结束
下一个
如果不是rDel,则rDel.EntireRow.Delete
端接头

我会尝试另一种方法。您可以使用MINIFS检查对应A值的B值是否最小,如果不是,则删除。这段代码在最后执行删除操作,这更容易,因为它避免了丢失行以及在执行时重新计算最小值

Sub usunDuplikaty3()

Dim findRange As Range, cell As Range, rDel As Range

Set findRange = Range("A1", Range("A" & Rows.Count).End(xlUp)) 'better to work up from the bottom

For Each cell In findRange
    If cell.Offset(, 1).Value <> WorksheetFunction.MinIfs(findRange.Offset(, 1), findRange, cell.Value) Then
    'alternative avoiding MINIFS
    'If cell.Offset(, 1).Value <> Evaluate("Min(If(" & findRange.Address & "=" & cell.Value & "," & findRange.Offset(, 1).Address & "))") Then
      If rDel Is Nothing Then
            Set rDel = cell
        Else
            Set rDel = Union(cell, rDel)
        End If
    End If
Next
    
If Not rDel Is Nothing Then rDel.EntireRow.Delete

End Sub
Sub-usunDuplikaty3()
变暗findRange作为范围,单元格作为范围,rDel作为范围
设置findRange=Range(“A1”,Range(“A”和Rows.Count).End(xlUp)),最好从底部向上操作
对于findRange中的每个单元格
如果cell.Offset(,1).Value工作表function.MinIfs(findRange.Offset(,1),findRange,cell.Value),则
"另类避孕药"
'If cell.Offset(,1).Value求值('Min(If(“&findRange.Address&“=”&cell.Value&“,“&findRange.Offset(,1).Address&”)然后
如果rDel什么都不是
设置rDel=单元
其他的
设置rDel=并集(单元格,rDel)
如果结束
如果结束
下一个
如果不是rDel,则rDel.EntireRow.Delete
端接头

这太好了,我很感激,但是在我的办公室里,我只能访问Excel 2016,它没有MinIfs功能,因此我必须对它进行一些修改,以使其正常工作。非常感谢。在这种情况下,您可以使用数组公式
=MIN(IF…
Evaluate
。我实际上尝试了类似
minIfRng.FormulaArray=“=MIN”(IF(A1:&findRange.End(xlDown).Address&“=”&cell.Address&“,”IF(B1:&findRange.Offset(,1).End(xlDown).Address&“,”B1:&findRange.Offset(,1).End(xlDown).Address&”))
然后在If语句中添加
cell.Offset(,1).Value>=minIfRng.Value
,但它仍然不能按计划工作。我在上面添加了一行,可以避免MINIFS。当然你是对的,我可以在问另一个问题之前考虑删除副本。非常感谢,我终于做到了。:)这很好,我很感激,但是在我的办公室里,我只能访问Excel 2016,它没有MinIfs功能,所以我必须对它进行一点修改,使其正常工作。非常感谢。在这种情况下,您可以使用数组公式
=MIN(IF…
Evaluate
。我实际上尝试了类似
minIfRng.FormulaArray=“=MIN”(IF(A1:&findRange.End(xlDown).Address&“=”&cell.Address&“,”IF(B1:&findRange.Offset(,1).End(xlDown).Address&“,”B1:&findRange.Offset(,1).End(xlDown).Address&”))
然后在If语句中添加
cell.Offset(,1).Value>=minIfRng.Value
,但它仍然不能按计划工作。我在上面添加了一行,可以避免MINIFS。当然你是对的,我可以在问另一个问题之前考虑删除副本。非常感谢,我终于做到了。:)