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代码运行时间。 下面的代码使用
- 晚绑定设置正则
regexp
-
ActiveSheet
A列中的值被读入一个variables数组X
(请注意,代码将处理一个2D范围,即可以使用X = Range([a1], Cells(Rows.Count, "B").End(xlUp)).Value2
在列A和B上工作 - 正则
regexp
不需要的字符 – 如果在要保留的文本之前它将处理多个空格 - 已清除的文本从
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个或更多以前的模式 -
\.
这匹配了一段时间(期间必须用\
来逃脱,因为这意味着它想要匹配前面的一个或多个模式。 -
"
这匹配一个空间。