1

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

3 回答 3

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. 将 A 列中的值ActiveSheet读入变量数组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
于 2012-11-05T22:32:41.520 回答
1

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

于 2012-11-05T14:36:43.907 回答
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 个或多个先前的模式
  • \. 这匹配一个句点(句点必须用 a 转义,\因为它.本身意味着它想要匹配前一个模式的一个或多个。
  • " 这匹配一个空格。
于 2012-11-05T15:40:28.313 回答