2012-04-26 105 views
0

我正在寻找一种算法,我没有VBA知识来编写脚本。所以我卡住了。这不是通过努力尝试,因为我已经放弃了(加上,这一点的代码是我的更大的VBA代码的最后剩余部分)我只是缺乏知识/经验/技能...VBA - 搜索并删除重复项

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

我想这样做是:

扫描片空行(由于生成的工作簿的路上,我有时有空白行),并删除它们。这些空白行有时在数据行之间有数据,而在其他时间可能会在数据表末尾。

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

开发知识和技能的唯一办法是在那里得到的和代码!我确信有人可能会进来给你写整个程序,但是同时这些资源应该给你自己做的工具。

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

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

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

接下来,从“mylastrow”开始,将列A中的值添加到Dictionary对象(示例here)。你可以使用一个行计数器从“mylastrow”递减到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(假设有一个头)。

+0

谢谢 - 我会给这个*另一个*去。 – 2012-04-30 14:09:43

+0

我没有它......我会在这里粘贴我的代码,但我没有空间。有效地,我有一个For next循环进行。在其中,我将当前产品代码分配给一个变量,然后开始另一个与Next之前的循环相同的循环,只有这一次我循环访问列中其他代码的值并删除所有匹配。这两个循环迭代了我现在唯一的麻烦是循环删除了几乎所有的代码,但是三个(尽管存在更多的唯一值)。卡住... – 2012-04-30 15:57:37

+0

这可能是因为您用来迭代的计数器没有从行删除中正确更新。这就是为什么我建议字典的方法。在删除/插入行时,“Do While”通常比“For”更好,因为您可能需要增加/减少两次才能获得正确的偏移量。我的猜测是,当你返回到外部的'For'时,你的增量变量将会到达下一个行,在这一点上将是空的(由于删除),并正确地更新该变量,你需要使用'While'因为'For'总是将增量var重置为下一步。 – Zairja 2012-04-30 17:46:03