-->

VBA - 搜索和删除重复(VBA - Search and remove duplicates)

2019-09-16 18:50发布

我在寻找一种算法,我没有VBA知识脚本自己。 所以,我坚持。 这不是因为缺乏努力尝试,因为我已经给了它一个去(加,这段代码是剩下的最后一块我更大的VBA代码)我只是缺乏知识/经验/技能...

基本上,我有一个Excel文件。 在该文件是一个表,而“sheet1”。 Sheet1中包含多行数据。 包含在Sheet1的行数可以从1到n。 有时,我可能有50个,而其他时候我可能有30个,等什么是一致的是这本书的布局,也就是我在列代码的该标识的产品在我的数据库。

我想这样做是:

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

Answer 1:

开发知识和技能的唯一途径就是在那里和代码搞定! 我敢肯定有人会进来,写上你的整个过程,但在此期间,这些资源应该给你的工具,自己做。

首先,检查出的方法在这里删除空行。 它依赖于“选择”的范围,所以可以通过手动选择的片材的所有细胞中,然后运行宏,或与下列替换:

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

OR(甚至更好)使用你的代码查找最近使用的行和列从1设置的范围为“mylastrow”。

接着,从“mylastrow”开始,开始添加在列A中的值到一个字典对象(例如这里 )。 您可以使用一个行计数器从“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

之前: 后:

注意,因为我们停止了第一排还未触碰时rowCount为1(假设有一个头)。



文章来源: VBA - Search and remove duplicates