VBA - 搜索并删除重复项

时间:2012-04-26 13:30:25

标签: vba excel-vba excel-2011 excel

我正在寻找一种算法,我没有自己的VBA知识。所以我被卡住了。这不是因为我没有努力尝试,因为我已经给它一个去(加上,这段代码是我最大的VBA代码的剩余部分)我只是缺乏知识/经验/技能......

基本上,我有一个Excel文件。在这个文件中是一张工作表“sheet1”。 Sheet1包含许多行数据。 sheet1中包含的行数可以从1到n变化。有时,我可能有50个,而有时我可能有30个等等。这本书的布局是一致的,即我在A列中有代码来识别我数据库中的产品。

我想做的是:

1。扫描工作表中的空行(由于生成工作簿的方式,我有时会有空行)并将其删除。这些空白行有时位于具有数据的行之间,而其他时候可能位于表格末尾。

2. 删除空行后找到最后使用的行。将其存储到变量中。我发现这段代码对于这样做非常有用:

mylastrow = myBook.Sheets("Results").Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

3. 从(2)中确定的行开始,我想将产品代码放在A(x,其中x = mylastrow)中并找到它的任何其他出现(在A列中) 。如果找到任何内容,请删除与其对应的整行。重要的是,这个循环必须反过来。例如,假设mylastrow = 40,循环将需要从A40开始,并在下一次迭代时执行A39(如果已删除行,则为38)。这是因为对于任何产品编号,行中的相应数据在列的下方包含更多数据(因为生成工作表的方式)。基本上,最靠近最后一行的条目是最新的。

希望我已经能够正确地解释原位。但如果没有,你愿意接受挑战(我的负担?),我将非常感激。

QF

1 个答案:

答案 0 :(得分:1)

培养这种知识和技能的唯一方法就是进入那里并编写代码!我确信有人可以进来给你写完整个程序,但与此同时,这些资源应该为你提供自己动手的工具。

首先,查看方法here以删除空白行。它依赖于范围的“选择”,因此您可以手动选择工作表的所有单元格,然后运行宏,或者用以下内容替换它:

Dim r as range
set r = Sheet1.Cells 'now use r instead of Selection

OR(甚至更好)使用您的代码查找最后使用的行,并将范围从第1行设置为“mylastrow”。

接下来,从“mylastrow”开始,开始将列A中的值添加到Dictionary对象(示例here)。您可以使用行计数器从“mylastrow”递减到1.这是一个如何工作的示例。假设密钥位于第1列(“A”)。

Dim dict As Object
Dim rowCount As Long
Dim strVal As String

Set dict = CreateObject("Scripting.Dictionary")

rowCount = Sheet1.Range("A1").CurrentRegion.Rows.Count

Do While rowCount > 1
  strVal = Sheet1.Cells(rowCount, 1).Value2

  If dict.exists(strVal) Then
    Sheet1.Rows(rowCount).EntireRow.Delete
  Else
    dict.Add strVal, 0
  End If

  rowCount = rowCount - 1
Loop

Set dict = Nothing

在: Before 后: After

请注意,由于我们在rowCount为1时停止(假设有标题),因此未触及第1行。