我正在从事一些数据组织工作,需要将信息移到表格中。我有一列IP地址,有些列有多个,甚至没有。我最好需要能够遍历该列,并保留前13个字符并删除其后的所有内容,我需要581行才能通过。我认为,如果我能获得将在该列中运行的VBA,并找到第一个“,”并将其删除,则它会起作用。我试过了,但是什么也没做。
Sub cleanup()
lastrow = Range("G581").End(xlUp).Row
For i = 2 To lastrow
If Len(Cells(i, 1)) > 13 Then
Cells(i, 1) = Left(Cells(i, 1), 14)
End If
Next i
End Sub
答案 0 :(得分:0)
如前所述,您正在计算G列中的行,希望G列和A列具有相同的行数。 我认为G列可能是问题。
lastrow = Range("A581").End(xlUp).Row
For i = 2 To lastrow
If Len(Cells(i, 1)) > 13 Then
Cells(i, 1) = Left(Cells(i, 1), 14)
End If
Next i
答案 1 :(得分:0)
老实说,您可能会遇到一些原因。最重要的是,当您使用Left()
函数时,告诉它保留14个字符,而不是您说的13个字符!
另一个选择可能是excel认为您正在尝试在另一张纸上执行此操作。为了解决这个问题,我制作了一个worksheet
对象,并对提到的所有范围进行了限定,以确保excel知道您在说什么位置。
指定lastrow
的方式可能是一个问题(不太可能基于您的描述,但可能)。如果您有一列连续的值(尽管您的描述会建议您不要),并且用值指定该列的最后一行,则.End(xlUp)
实际上将追溯到没有值的最后一个单元格可能是第一行-因此循环永远不会运行!您可以通过将其更改为lastrow = Range("G582").End(xlUp).Row
(在最后一个完整的行下面一行)来避免这种情况,但是为什么麻烦当您可以让excel像下面我的答案那样为您完成工作。 / p>
Sub cleanup()
Dim ws As Worksheet
Set ws = sheets("Sheet1")
Dim lastRow As Long
lastRow = ws.Range("G" & rows.count).End(xlUp).row
Dim i As Long
For i = 2 To lastRow
If Len(ws.Cells(i, 1)) > 13 Then
ws.Cells(i, 1) = Left(ws.Cells(i, 1), 13)
End If
Next i
End Sub
我还制作了一个带有您在问题中提到的第二个选项的版本,该选项涉及用逗号","
分隔每一行。
Sub cleanup2()
Dim ws As Worksheet
Set ws = sheets("Sheet1")
Dim lastRow As Long
lastRow = ws.Range("G" & rows.count).End(xlUp).row
Dim i As Long
For i = 2 To lastRow
ws.Cells(i, 1) = Split(ws.Cells(i, 1), ",")(0) 'option 2
Next i
End Sub
希望这可以解决您的问题!