【问题标题】:How to remove leading spaces and/or "/" or "\"如何删除前导空格和/或“/”或“\”
【发布时间】:2020-05-22 07:59:04
【问题描述】:

我是 Excel 中的 VBA 新手。我有一个始终有 172 列的电子表格。答:FP。它可能有 2 到多行。对于电子表格中的每个单元格,我想删除所有前导和尾随空格以及任何前导或尾随“/”或“\”。字符串可以包含反斜杠或正斜杠,但不能在字符串的开头或结尾。我的代码删除了前导和尾随空格。它删除尾随的反斜杠或正斜杠。但是,它不会删除前导斜杠。我不明白为什么。有没有更好的方法来实现我的目标?感谢您的帮助。

For Each Rng In ActiveSheet.UsedRange
   CellVal = Trim(Rng.Value)
   LengT = Trim(Len(CellVal))

      If CellVal <> "" Then
         If Not Rng.HasFormula Then
            While Trim(Left(CellVal, 1) = Chr(47)) Or Trim(Left(CellVal, 1) = Chr(92)) Or Trim(Right(CellVal, 1) = Chr(47)) Or Trim(Right(CellVal, 1) = Chr(92))

            If Trim(Left(CellVal, 1) = Chr(47)) Or Trim(Left(CellVal, 1) = Chr(92)) Then
               CellVal = Trim(Mid(CellVal, 2, LengT))
            ElseIf Trim(Right(CellVal, 1) = Chr(47)) Or Trim(Right(CellVal, 1) = Chr(92)) Then
               LengT = Len(CellVal)
               CellVal = Trim(Left(CellVal, LengT - 1))
               Rng.Value = CellVal
               LengT = LengT - 1
            End If
         Wend
      End If
   End If
Next Rng

【问题讨论】:

    标签: excel vba character-trimming


    【解决方案1】:

    首先,我想说尽量避免使用UsedRange,但要找到一种方法来获取您最后使用的行和列。然后,我不会对Worksheet 对象进行大量调用,而是通过使用数组来遍历内存中的值。

    最后,您可以进行许多替换等。但也许在这里使用正则表达式并不合适。只是为了灵感,我会写下以下内容:

    Sub Test()
    
    Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
    Dim lr As Long, lc As Long, x As Long, y As Long
    Dim arr As Variant
    Dim RegEx As Object: Set RegEx = CreateObject("vbscript.regexp")
    
    'Set up regular expression first
    RegEx.Global = True
    RegEx.Pattern = "^[ \/\\]*(.*?)[ \/\\]*$"
    
    With ws
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        lc = .Cells(1, .Columns.Count).End(xlToLeft).Column
        arr = .Range(.Cells(1, 1), .Cells(lr, lc)).Value
        For x = LBound(arr, 1) To UBound(arr, 1)
            For y = LBound(arr, 2) To UBound(arr, 2)
                If RegEx.Test(arr(x, y)) Then arr(x, y) = RegEx.Execute(arr(x, y))(0).submatches(0)
            Next
        Next
        .Range(.Cells(1, 1), .Cells(lr, lc)).Value = arr
    End With
    
    End Sub
    

    所以最后它会将清理后的数据读回工作表。

    Regex Demo

    【讨论】:

    • 你好 JvdV。是的!!!它工作得很好。我在使用“Set ws =”时遇到了一些问题,但这是我自己的问题。一旦我用我的宏给工作表的名称替换了“Sheet1”,它就完美地工作了。并且正则表达式演示的链接是一个真正的奖励。它确实有助于解释谁使用正则表达式。我将使用一些正则表达式值来进行更多清理。谢谢,谢谢,谢谢!
    • @Gianmarco,很高兴它有帮助。不要忘记接受答案以回报人情。单击左侧的复选按钮。如果你收集了足够多的积分,它甚至会让你投票赞成
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2012-02-28
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多