删除第n个字符后的所有字符

时间:2018-09-10 14:49:09

标签: excel excel-vba excel-formula

我正在从事一些数据组织工作,需要将信息移到表格中。我有一列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

2 个答案:

答案 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

希望这可以解决您的问题!