Excel VBA-我的循环永远存在-想法?

时间:2018-10-04 19:22:09

标签: excel vba

我有一张纸是将电话费帐单的内容复制到excel中的结果。我已经编写了移动费用的代码,这些费用显示在电话号码下方,电话号码旁边。问题在于,标准工作表中有将近6,000行要处理。我想知道是否有比我现有的方法更好的数据移动方式。 谢谢,

LastRow = ActiveSheet.Cells(ActiveSheet.Rows.count, "A").End(xlUp).Row
For X = 2 To LastRow
    If Left(Range("A" & X).Value, 1) = "(" Or Left(Range("A" & X).Value, 1) = "C" Then
        Range("B" & X).Value = Range("A" & (X + 1)).Value
        Range("A" & (X + 1)).Delete
    End If
Next X

基本上,它基于循环查看单元格,如果合适,则将其下方的内容移动到其旁边的单元格中,并除去结果的空白行。

2 个答案:

答案 0 :(得分:0)

完全未经测试,因为您没有提供可测试的数据。假设A列中只有数据。

LastRow - 1开始向后迭代(由于是“最后”行,所以最后一行下面没有电荷行)。我只使用Delete而不是Clear,然后使用SpecialCells方法在循环结束时删除所有空单元格(行)。

我修改了识别电话号码单元格的逻辑,假设它们以“ C”开头(根据您的逻辑)或格式为(XXX)-...我认为电话号码可以是通过此逻辑确定:

  • 第一个字符=“(”
  • 第四和第五个字符=“)-”

应该避免误报,因为电话号码和贷方都以“(”开头。

Dim thisCell as Range
For X = LastRow - 1 to 2 Step - 1
    Set thisCell = Range("A1" & X)
    'If this cell is a phone number, modify if needed:
    If (Left(thisCell.Value, 1) = "(" And Mid(thisCell.Value,2,4) = ")-") _
       Or Left(thisCell.Value, 1) = "C" Then       
       ' Move what's below it [offset(1,0)] to the adjacent cell [offset(0, 1)]
        thisCell.Offset(0, 1).Value = thisCell.Offset(1, 0).Value
        ' Make the cell beneath empty
        thisCell.Offset(1, 0).Clear
    End If
Next X

' Delete the empty rows:
Range("A2:A" & LastRow).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

答案 1 :(得分:0)

请勿删除循环中的行。这会导致多次删除。而是在循环时创建一个Union(集合)单元格。然后,一旦循环完成,请一次删除所有Union单元格。

此外,在这种情况下,循环通过范围(For Each将比For i循环更快。


Sub DeleteMe()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("???")
Dim MyCell As Range, DeleteMe As Range, LRow As Long

LRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

For Each MyCell In ws.Range("A2:A" & LRow)
    If Left(MyCell, 1) = "(" Or Left(MyCell, 1) = "C" Then
        MyCell.Offset(, 1).Value = MyCell.Offset(1).Value
        If DeleteMe Is Nothing Then
            Set DeleteMe = MyCell
        Else
            Set DeleteMe = Union(DeleteMe, MyCell)
        End If
    End If
Next MyCell

If Not DeleteMe Is Nothing Then DeleteMe.Delete

End Sub