0

我正在寻找一种我没有 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 where x = mylastrow) 中的产品代码并找到它的任何其他出现(在 A 列中)。如果找到,则删除与其对应的整行。重要的是,这个循环必须反向。例如mylastrow = 40,假设循环需要从 A40 开始,并且在下一次迭代中执行 A39(或者如果一行已被删除,则为 38?)。这是因为对于任何产品编号,行中的相应数据都包含更多的数据(由于工作表的生成方式)。本质上,最接近最后一行的条目是最新的。

希望我能够正确解释现场。但如果不是,并且您愿意接受挑战(我的负担?),我将非常感激。

资历架构

4

1 回答 1

2

发展这些知识和技能的唯一方法是进入那里并编写代码!我相信有人可能会进来并为您编写整个过程,但与此同时,这些资源应该为您提供自己完成的工具。

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

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

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

接下来,从“mylastrow”开始,开始将 A 列中的值添加到 Dictionary 对象(此处为示例)。您可以使用行计数器从“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

之前: 前 之后: 后

请注意,自从我们在 1 时停止以来,第一行没有被触及rowCount(假设有一个标题)。

于 2012-04-26T17:34:34.703 回答