我有一张工作表,我使用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
答案 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
初始帖子
我会将regexp与变量数组合并以减少代码运行时间。以下代码使用
regexp
ActiveSheet
的A列中的值被读入变量数组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
答案 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个或更多\.
这与句点匹配(句点必须使用\
进行转义,因为.
本身意味着它希望匹配上一个模式中的一个或多个。"
这匹配单个空格。