删除所有重复行 Excel vba 无法正常工作
Delete all duplicate rows Excel vba doesn´t work correctly
我在 excel 中创建了一个工作簿,其中包含一个允许您在工作表中导入 .csv 数据的用户表单。
知道我有重复行的问题。我在这里找到了一个解决方案,但它不是 100% 有效。
(Delete all duplicate rows Excel vba)脚本删除了大部分重复数据,但仍有2-5行重复。一开始我以为是单元格的格式问题,但这不是问题...
这是马克罗:
Sub DeleteRows()
With ActiveSheet
Set Rng = Range("A1", Range("T1").End(xlDown))
Rng.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), Header:=xlYes
End With
End Sub
剩下的重复数据以负数开头。我不知道这是否有助于找到解决方案...
我强烈怀疑负号不是常规的 CHAR(45)
连字符或有 leading/trailing 个零。是否有些值左对齐而其他值右对齐?这将表明一些被认为是 text 和其他真实 numbers.
在文本分栏中删除 leading/trailing 个空格的最快方法 ► 每列固定宽度。
Sub DeleteRows()
Dim c As Long
With ActiveSheet
For c = 1 To 20
If Application.CountA(.Columns(c)) Then
.Columns(c).TextToColumns Destination:=.Cells(1, c), _
DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
End If
Next c
With .Range("A1", .Range("T1").End(xlDown)).Cells
.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), Header:=xlYes
End With
End With
End Sub
这可能有不太明显的原因;立即想到不间断空格(ASCII 160 或 0×A0)。代替实际显示一些示例数据,您需要仔细检查您的值以查看导致 Excel 不将这些值视为重复值的原因。
我不知道真正的问题,但我通过在每个单元格中添加一个点来修复它。
示例:
1. Cell1 -> .Cell1
2. Remove the duplicates
3. .Cell1 -> Cell1
代码如下:
Sub DeleteRows()
Dim c As Long
With ActiveSheet
For c = 1 To 20
If Application.CountA(.Columns(c)) Then
.Columns(c).TextToColumns Destination:=.Cells(1, c), _
DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
End If
Next c
With .Range("A1", .Range("T1").End(xlDown)).Cells
.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), Header:=xlYes
End With
End With
End Sub
Private Sub CommandButton2_Click()
.
.'some code'
.
For i = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
column = ActiveSheet.Range("A" & i).value
If column < 0 Then
column = "." & column
ActiveSheet.Range("A" & i).value = column
End If
Next
Call DeleteRows
For i = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
firstChar = Left(ActiveSheet.Range("A" & i).value, 1)
If firstChar = "." Then
column = Right(ActiveSheet.Range("A" & i).value, Len(ActiveSheet.Range("A" & i).value) - 1)
ActiveSheet.Range("A" & i).value = column
End If
Next
.
.'some code'
.
End Sub
这不是最好的解决方案,但它确实有效!
感谢您的帮助。
我在 excel 中创建了一个工作簿,其中包含一个允许您在工作表中导入 .csv 数据的用户表单。 知道我有重复行的问题。我在这里找到了一个解决方案,但它不是 100% 有效。 (Delete all duplicate rows Excel vba)脚本删除了大部分重复数据,但仍有2-5行重复。一开始我以为是单元格的格式问题,但这不是问题...
这是马克罗:
Sub DeleteRows()
With ActiveSheet
Set Rng = Range("A1", Range("T1").End(xlDown))
Rng.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), Header:=xlYes
End With
End Sub
剩下的重复数据以负数开头。我不知道这是否有助于找到解决方案...
我强烈怀疑负号不是常规的 CHAR(45)
连字符或有 leading/trailing 个零。是否有些值左对齐而其他值右对齐?这将表明一些被认为是 text 和其他真实 numbers.
在文本分栏中删除 leading/trailing 个空格的最快方法 ► 每列固定宽度。
Sub DeleteRows()
Dim c As Long
With ActiveSheet
For c = 1 To 20
If Application.CountA(.Columns(c)) Then
.Columns(c).TextToColumns Destination:=.Cells(1, c), _
DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
End If
Next c
With .Range("A1", .Range("T1").End(xlDown)).Cells
.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), Header:=xlYes
End With
End With
End Sub
这可能有不太明显的原因;立即想到不间断空格(ASCII 160 或 0×A0)。代替实际显示一些示例数据,您需要仔细检查您的值以查看导致 Excel 不将这些值视为重复值的原因。
我不知道真正的问题,但我通过在每个单元格中添加一个点来修复它。 示例:
1. Cell1 -> .Cell1
2. Remove the duplicates
3. .Cell1 -> Cell1
代码如下:
Sub DeleteRows()
Dim c As Long
With ActiveSheet
For c = 1 To 20
If Application.CountA(.Columns(c)) Then
.Columns(c).TextToColumns Destination:=.Cells(1, c), _
DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
End If
Next c
With .Range("A1", .Range("T1").End(xlDown)).Cells
.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), Header:=xlYes
End With
End With
End Sub
Private Sub CommandButton2_Click()
.
.'some code'
.
For i = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
column = ActiveSheet.Range("A" & i).value
If column < 0 Then
column = "." & column
ActiveSheet.Range("A" & i).value = column
End If
Next
Call DeleteRows
For i = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
firstChar = Left(ActiveSheet.Range("A" & i).value, 1)
If firstChar = "." Then
column = Right(ActiveSheet.Range("A" & i).value, Len(ActiveSheet.Range("A" & i).value) - 1)
ActiveSheet.Range("A" & i).value = column
End If
Next
.
.'some code'
.
End Sub
这不是最好的解决方案,但它确实有效! 感谢您的帮助。