我需要帮助在Excel-VBA中构建一个循环

时间:2015-07-30 17:01:04

标签: excel vba excel-vba loops

我有一个像下面这样的数据块,我需要插入到有几千行的工作表中。

enter image description here

第一个问题是一些区块已经存在但不完整。最好通过示例进行说明。

enter image description here

在这种情况下,我缺少7010和7020的行。

enter image description here

在这种情况下,我只缺少7010.这都是随机的。我可以覆盖现有的块,但第二个问题是我在右边的单元格中有数据,所以显而易见的解决方案是插入与缺少的数字对应的空白行。

因为我知道块始终以7开头,所以我开始做类似的事情(数据在B列中)

If Left(Cells(Row, 2), 1) = 7 Then
If Cells(Row, 2) = 7005 Then

然后意识到这是嵌套if语句的泥潭。然后它变得棘手,因为在我插入必要的行之后,循环重复XD所以我想也许我使用数组来存储不完整的块并将其与完整的块进行比较然后插入行,但这也是一场噩梦。这一切都变得更糟,因为我必须遍历整个工作表并在必要时执行此操作。我可以编码所以如果任何人都可以提供逻辑,那就足够了。

如果更容易,我不需要填写新插入的行。意思是我可以把它全部留空,如下所示。如果这有意义或需要更多信息,请告诉我。

enter image description here

1 个答案:

答案 0 :(得分:1)

实际上很简单:)

让我给你一个代码示例的提示,它不会直接回答你的问题,但会让你开始!

注意:我使用硬编码范围进行演示。

  1. 循环通过第一个区块并检查第二个区块中是否存在。
  2. 示例

    Dim BlockA As Range, BlockB As Range
    Dim aCell As Range
    
    Set BlockA = Range("M1:M10")
    Set BlockB = Range("A1:A100")
    
    For Each aCell In BlockA
        If Application.WorksheetFunction.CountIf(BlockB, aCell.Value) > 0 Then
            Debug.Print "Match Found for " & aCell.Value
        Else
            Debug.Print "Match Not Found for " & aCell.Value
        End If
    Next
    
    1. 如果不是,那么只需将其添加到块的末尾
    2. 首先使用THIS找到最后一行,然后在写入之前简单地递增它。

      示例

      LastRow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row + 1
      '~~> aCell is the cell which is not there in the 2nd block
      Range("A" & LastRow).Value = aCell.Value
      
      1. 最后根据第1列对第2个完整块进行排序。数字右侧的空白行将自动创建:)
      2. 示例

        假设您的范围来自A1:F100,那么您可以将其用于排序

        With Sheet1
            .Columns("A:F").Sort Key1:=.Range("A2"), _
                                 Order1:=xlAscending, _
                                 Header:=xlYes, _
                                 OrderCustom:=1, _
                                 MatchCase:=False, _
                                 Orientation:=xlTopToBottom, _
                                 DataOption1:=xlSortNormal
        End With