【问题标题】:How to make each cell's length to be 5?如何使每个单元格的长度为5?
【发布时间】:2021-07-23 03:40:19
【问题描述】:

我有一列有 7000 多个名字。我想让每个名字的长度不超过5。这是我尝试过但不起作用的方法

Sub del()
    Dim myCell
    Set myCell = ActiveCell
    Dim count As Integer

    count = Len(ActiveCell)

    While count > 5
        myCell = Left(myCell, Len(myCell) - 1)
        myCell.Offset(1, 0).Select
        Set myCell = ActiveCell
    Wend
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    不需要 VBA。您可以使用公式=Left(A1,5) 来获取单元格的第一个5 字符。只需自动填写公式。

    如果您仍然想要 VBA,那么您也不需要循环。请参阅此示例。解释见Convert an entire range to uppercase without looping through all the cells

    Option Explicit
    
    Sub Sample()
        Dim ws As Worksheet
        Dim lRow As Long
        Dim rng As Range
        
        '~~> Change this to the relevant sheet
        Set ws = ThisWorkbook.Sheets("Sheet1")
        
        With ws
            lRow = .Range("A" & .Rows.Count).End(xlUp).Row
                
            Set rng = .Range("A1:A" & lRow)
            rng = Evaluate("index(left(" & rng.Address(External:=True) & ",5),)")
        End With
    End Sub
    

    在上面的代码中,我假设数据在Sheet1A 列中。根据需要进行更改。

    行动中

    【讨论】:

    • 我想知道 Evaluate 与数组上的循环相比如何执行。有什么经验吗?
    • 我做了一个快速测试。我在 A1:A1048576 1. EvaluateArray 上的测试结果都用了 4 秒。所以在这种情况下我更喜欢Evaluate,因为代码行更少。 2. 循环遍历该范围需要 1 分 50 秒。
    • 出色的工作。循环范围很明显是最长的^^ 但是很高兴知道Evaluate 表现如此出色,因为我喜欢使用Evaluate 完成这项任务是多么容易。
    • 有助于发现这种有趣的时间行为,可能取决于版本? - 友好提示:使用 VBA,我强烈建议通过External:=True 参数完全限定甚至范围地址字符串,如下所示:rng = Evaluate("index(left(" & rng.Address(External:=True) & ",5),)") @SiddharthRout
    • @T.M.是的,这是一个很好的建议。我已经更新了上面的帖子:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多