我有一个包含大约30k行数据和20列的工作表。 B列中的许多值都是重复的,我想删除这些重复项。我遇到的问题是,即使列b可能是重复的,其余列中的该行的数据也不一定是重复的,因此,如果列B中的值是重复的,则只删除该行,这一点很重要。列M = 0的值。
有没有办法对工作表中的每一行执行此操作(工作表名称为Test)?我想它涉及“For Each ...”,但我没有很多经验,并且无法找到任何其他可以完成此任务的宏。如果您需要我详细说明我想要完成的任务,请告诉我。
感谢您的帮助!
答案 0 :(得分:0)
除非您需要经常重复相同的过程,否则您也可以只过滤符合条件的行并手动删除它们。
如果您的数据是根据B列分类的,您可以在M列中添加一个公式,将B列中每个单元格的值与上方和下方的值进行比较,以识别重复项。
以下公式将检查单元格B是否与 AND 上方的值匹配 AND 如果列M = 0且结果为True / False。 = AND(OR(B2 = B1,B2 = B3),M2 = 0)
答案 1 :(得分:0)
这是VBA中的一种简单方法,可以像表格一样查询电子表格。你必须为你的特定情况调整RunQuery()方法,因为我不知道你的列名。
这假设如下:
在我的特定工作簿中,我有一个标记为“类别”的列,一个标记为“类型”的列,我添加了一个名为“DeleteMe”的列。
'Adapt RunQuery for your particular needs
Sub RunQuery()
'Change this SQL statement to reflect your particular need
SQL = "SELECT [Category], [Types] FROM %table(0)% GROUP BY [Category], [Types] HAVING Count(*) > 1"
'Change "Sheet2" to your sheet name
Set rs = QuerySheet(SQL, Sheet2)
Do While Not rs.EOF
SQL = "UPDATE %table(0)% SET [DeleteMe]='x' WHERE [Category]='" & rs!Category & "' AND [Types]='" & rs!Types & "'"
'Again, change Sheet2 to your sheet name
QuerySheet SQL, Sheet2
rs.MoveNext
Loop
End Sub
'You don't need to change this function
Function QuerySheet(sSQL, ParamArray Worksheets())
Dim oSh
Dim sConn, n
On Error GoTo QuerySheet_Err
Set QuerySheet = CreateObject("ADODB.Recordset")
sConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Worksheets(0).Parent.FullName & ";Extended Properties=""Excel 8.0;HDR=Yes"";"
n = 0
For Each oSh In Worksheets
sSQL = Replace(sSQL, "%table(" & n & ")%", "[" & oSh.Name & "$]")
n = n + 1
Next
QuerySheet.Open sSQL, sConn
Exit Function
QuerySheet_Err:
MsgBox "Error in QuerySheet(): " & Err.Description
End
End Function
代码使用x更新“DeleteMe”列。现在,您可以按“DeleteMe”排序,并删除行(或者编写一个简单的VBA语句来执行此操作)。
您的 RunQuery()方法需要看起来更像这样,将“B列”和“M列”替换为工作表标题行中字段的名称:
...
'Change this SQL statement to reflect your particular need
SQL = "SELECT [column B] FROM %table(0)% WHERE [column M] = 0 GROUP BY [column B] HAVING Count(*) > 1"
'Change "Sheet2" to your sheet name
Set rs = QuerySheet(SQL, Sheet2)
Do While Not rs.EOF
SQL = "UPDATE %table(0)% SET [DeleteMe]='x' " & _
" WHERE " & _
IIf(IsNull(rs![column B]), _
" [column B] IS NULL", _
" [column B]='" & rs![column B] & "' ") & _
" AND [column M]=0"
'Again, change Sheet2 to your sheet name
QuerySheet SQL, Sheet2
...
注意:当您将工作表的名称从“Sheet1”更改为其他内容时,有时会出现调试错误...尚未解决该问题。但这适用于“Quick N'Dirty”查询。
答案 2 :(得分:0)
你可以在没有VBA的情况下试试这个:
添加公式
的列=B1&IF(M1=0,"",RAND()*9999999)
如果M1 = 0
,这将创建一个唯一条目将新列粘贴到值
根据新列执行常规“删除重复”例程。
删除新列