Excel VBA正则表达式删除前导数字,句点和空格?

时间:2012-11-05 14:22:40

标签: regex excel excel-vba vba

我有一张工作表,我使用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

3 个答案:

答案 0 :(得分:2)

更新: - 已添加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
  5. enter image description here

    <强>代码

    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
    

答案 1 :(得分:1)

好吧,你可以通过VBScript的RegEx对象实际使用正则表达式。有关示例,请参阅https://stackoverflow.com/a/13041710/1756702

答案 2 :(得分:1)

我会详细说明我的评论。

这需要引用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个或更多
  • \.这与句点匹配(句点必须使用\进行转义,因为.本身意味着它希望匹配上一个模式中的一个或多个。
  • "这匹配单个空格。