Excel VBA正则expression式删除主要的数字,期间和空间?

我有一张工作表,我使用Excel VBAmacros自动填充所有工作表页面标题(不是列标题)与点击button上的相关信息。 这个macros使用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 

我想使用正则expression式去除这些前导数字,句点和空格,但我不确定如何在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 

更新: – 添加了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 

初始岗位`

我将结合正则expression式与变体数组来减less代码运行时间。 下面的代码使用

  1. 晚绑定设置正则regexp
  2. ActiveSheet A列中的值被读入一个variables数组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 

那么,你可以通过VBScript的RegEx对象来使用正则expression式。 有关示例,请参阅https://stackoverflow.com/a/13041710/1756702

我会详细说明我的评论。

这需要参考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 

正则expression式解释

  • "^这就是说,指定的模式必须从string的开始处开始,我们不想匹配标题标题中间的数字。
  • \S匹配除空格之外的所有内容([^ a-zA-Z0-9])。 即它将匹配字母和数字。
  • *匹配0个或更多以前的模式
  • \. 这匹配了一段时间(期间必须用\来逃脱,因为这意味着它想要匹配前面的一个或多个模式。
  • "这匹配一个空间。