我有一张纸是将电话费帐单的内容复制到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
基本上,它基于循环查看单元格,如果合适,则将其下方的内容移动到其旁边的单元格中,并除去结果的空白行。
答案 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