【问题标题】:Excel VBA Regular Expression to Remove Leading Number, Period, and Space?Excel VBA 正则表达式删除前导数字、句点和空格?
【发布时间】:2012-10-25 09:39:26
【问题描述】:

我有一个工作表,我使用 Excel VBA 宏在单击按钮时自动填充所有工作表页眉(不是列标题)和相关信息。此宏使用 wSheet.Name 填充标题标题。但是,wSheet.Name 通常包含我不想出现在标题中的前导数字、句点和空格。

注意以下示例工作表名称:

Cover Page
1a. Test Page
1b. Sample Page
2. Another Test Page
3. Yet Another Test Page
4. Almost the Last Example Page
998.  Last Example Page

我想使用正则表达式删除这些前导数字、句点和空格,但我不确定如何在 Excel 中使用 VBA 对其进行编码。我希望它尽可能灵活。这是我希望工作表名称显示方式的示例:

Cover Page
Test Page
Sample Page
Another Test Page
Yet Another Test Page
Almost the Last Example Page
Last Example Page

这是填充标题的现有代码:

Sub FillHeaders()
'
' Auto_Fill_Project_Name Macro
'
For Each wSheet In ActiveWorkbook.Worksheets
    If wSheet.Name <> "Cover Page" Then
        wSheet.PageSetup.CenterHeader = _
            "&16&KFF0000" & ActiveSheet.Range("J1") & "&10&K000000 &16" & " " & _
            wSheet.Name & Chr(13) & "&10 &11 Revision Date: "
    End If
    Next wSheet
'
End Sub

如何修改它以实现我的目标?

谢谢!

编辑——我采取了以下方法:

Function remleaddig(str As String)
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "^\S*\."
    str = regEx.Replace(str, "")
    remleaddig = Trim(str)
End Function

【问题讨论】:

  • ^\d+\w\.\s 匹配 1.b Another Test Title?除非那不是 ^\S*\. 类型,否则仍然能够匹配您的所有示例。你确定它不起作用吗?

标签: regex excel vba


【解决方案1】:

更新:--添加了UDF

Function StripChars(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
 With objRegex
 .Pattern = "^.+\.\s+"
.ignorecase = True
StripChars = .Replace(strIn, vbNullString)
End With
End Function

初次发布`

我会将 与变体数组结合起来以减少代码运行时间。下面的代码使用

  1. 后期绑定设置regexp
  2. ActiveSheet 的 A 列中的值被读入变量数组 X(请注意,代码将处理 2D 范围,即您可以使用 X = Range([a1], Cells(Rows.Count, "B").End(xlUp)).Value2 处理 A 列和 B 列
  3. regexp 去除不需要的字符 - 如果它位于您要保留的文本之前,它将处理多个空格
  4. 清理后的文本被转储到从C1 开始的活动工作表中。更改此行以移动转储 - 您可以使其转储回从 A1 开始的原始值。 [c1].Resize(UBound(X, 1), UBound(X, 2)).Value2 = X

代码

Sub QuickUpdate()
Dim X()
Dim objRegex As Object
Dim lngRow As Long
Dim lngCol As Long

X = Range([a1], Cells(Rows.Count, "A").End(xlUp)).Value2
Set objRegex = CreateObject("vbscript.regexp")
 With objRegex
 .Pattern = "^.+\.\s+"
.ignorecase = True
For lngRow = 1 To UBound(X, 1)
For lngCol = 1 To UBound(X, 2)
X(lngRow, lngCol) = .Replace(X(lngRow, lngCol), vbNullString)
Next lngCol
Next lngRow
End With

[c1].Resize(UBound(X, 1), UBound(X, 2)).Value2 = X

End Sub

【讨论】:

    【解决方案2】:

    嗯,您实际上可以通过 VBScript 的 RegEx 对象使用正则表达式。示例见https://stackoverflow.com/a/13041710/1756702

    【讨论】:

      【解决方案3】:

      我会详细说明我的评论。

      这需要引用Microsoft VBScript Regular Expressions 5.5(或您机器上的任何号码)

      Dim r As RegExp
      Set r = New RegExp
      r.Pattern = "^\S*\. "
      
      Dim c As Range, rng As Range
      Set rng = Range("A1:A7")   ' <-- Set this to your range
      For Each c In rng
          c.Value = r.Replace(c.Value, "")
      Next c
      

      如果所有文本都在一个单元格中,则将其更改为

      Dim r As RegExp
      Set r = New RegExp
      r.Pattern = "^\S*\. "
      r.MultiLine = True
      r.Global = True
      
      Dim c As Range
      Set c = Range("J1")
          c.Value = r.Replace(c.Value, "") '<--or place the result where ever you want
      

      正则表达式解释

      • "^ 这表示指定的模式必须从字符串的开头开始。我们不想匹配标题中间的数字。
      • \S 这匹配除空白 ([^a-zA-Z0-9]) 之外的所有内容。即它将匹配字母和数字。
      • * 这匹配 0 个或多个先前的模式
      • \. 这匹配一个句点(句点必须用\ 转义,因为. 本身意味着它要匹配一个或多个先前的模式。
      • " 这匹配一个空格。

      【讨论】:

      • 谢谢布拉德。我试图理解这一点。首先,变量被初始化为一个新的正则表达式,其模式匹配一​​个或多个数字、一个小数点,然后是一个空格?接下来,初始化一个新范围并给定一个单元格范围。然后此代码循环遍历范围中的每个单元格并用新值替换该值。但是,我们要替换哪些单元格,因为我正在尝试填充页眉,而不仅仅是列标题?我糊涂了。我假设我可以使用这个正则表达式创建一个基于 wSheet.Name 的新子字符串?
      • 所有这些都存在于单元格J1 中吗?而你只是从那里抓住它放在标题中?
      • 我很抱歉,J1 单元格与我的问题无关,我含糊地表达了这个问题。请参阅我对原始帖子所做的编辑。我几乎让它工作了,不过正则表达式模式需要一些修改。
      猜你喜欢
      • 2019-10-14
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 2021-10-10
      相关资源
      最近更新 更多