在运行宏vba之前添加正则表达式引用
代码:在运行宏vba之前添加正则表达式引用,vba,excel,Vba,Excel,代码: Public Sub CallDeleteAllText(control As IRibbonControl) Call LeaveNumbers End Sub Public Function PullOnly(strSrc As String, CharType As String) Dim RE As RegExp Dim regexpPattern As String Set RE = New RegExp CharType = LCase(CharType) Select C
Public Sub CallDeleteAllText(control As IRibbonControl)
Call LeaveNumbers
End Sub
Public Function PullOnly(strSrc As String, CharType As String)
Dim RE As RegExp
Dim regexpPattern As String
Set RE = New RegExp
CharType = LCase(CharType)
Select Case CharType
Case Is = "digits":
regexpPattern = "\D"
Case Is = "letters":
regexpPattern = "\d"
Case Else:
regexpPattern = ""
End Select
RE.Pattern = regexpPattern
RE.Global = True
PullOnly = RE.Replace(strSrc, "")
End Function
Sub LeaveNumbers()
Dim cCell As Range
For Each cCell In Selection
If cCell <> "" Then
cCell.Value = "'" & PullOnly(cCell.Text, "digits")
End If
Next cCell
With Selection
.NumberFormat = "0"
.Value = .Value
End With
End Sub
Public子调用deleteAllText(控件作为IRIBOnControl)
电话号码
端接头
公共函数PullOnly(strSrc作为字符串,CharType作为字符串)
Dim RE As RegExp
Dim regexpPattern作为字符串
Set RE=New RegExp
ChartType=LCase(ChartType)
选择案例图表类型
大小写为=“数字”:
regexpPattern=“\D”
Case Is=“letters”:
regexpPattern=“\d”
其他情况:
regexpPattern=“”
结束选择
RE.Pattern=regexpPattern
RE.Global=True
PullOnly=RE.Replace(strSrc,“”)
端函数
子编号()
变暗cCell As范围
对于选择中的每个cCell
如果cCell“”则
cCell.Value=“””和PullOnly(cCell.Text,“数字”)
如果结束
下一个cCell
有选择
.NumberFormat=“0”
.Value=.Value
以
端接头
此代码删除单元格中的所有文本并保留所有数字。但要运行此代码,用户必须从
Tools>References
手动添加Microsoft VBScript正则表达式
reference。是否有一种方法可以在代码本身中添加引用,以便首先添加引用,然后删除所有文本?将PullOnly函数中的这两行正则表达式声明和赋值更改为静态后期绑定
Dim RE As RegExp
...
Set RE = New RegExp
'becomes,
static RE As object
...
if re is nothing then Set RE = createobject("VBScript.RegExp")
静态变量由声明它们的子过程或函数“记住”。通常,当函数完成并退出时,RE将被“遗忘”(并被销毁)。但是,使用静态RE,第二次(以及所有后续时间)输入函数时,它会“记住”已将其设置为正则表达式脚本对象,因此无需再次设置
这并不意味着静态var是全球公开的;它仅在声明它的函数或子过程中可用。将PullOnly函数中的这两行正则表达式声明和赋值更改为静态后期绑定
Dim RE As RegExp
...
Set RE = New RegExp
'becomes,
static RE As object
...
if re is nothing then Set RE = createobject("VBScript.RegExp")
静态变量由声明它们的子过程或函数“记住”。通常,当函数完成并退出时,RE将被“遗忘”(并被销毁)。但是,使用静态RE,第二次(以及所有后续时间)输入函数时,它会“记住”已将其设置为正则表达式脚本对象,因此无需再次设置
这并不意味着静态var是全球公开的;它仅在声明它的函数或子过程中可用。使用后期绑定:
Set RE=CreateObject(“vbscript.regexp”)
。见@Pᴇʜ我添加了您的代码。我将Set RE=New RegExp
更改为Set RE=CreateObject(“vbscript.RegExp”)
。现在,当我运行它时,它在Dim RE As RegExp
行中给出了错误。错误是:未定义用户定义类型
将RE设置为对象
,如我的链接中所示。请改用后期绑定:设置RE=CreateObject(“vbscript.regexp”)
。见@Pᴇʜ我添加了您的代码。我将Set RE=New RegExp
更改为Set RE=CreateObject(“vbscript.RegExp”)
。现在,当我运行它时,它在Dim RE As RegExp
行中给出了错误。错误是:用户定义类型未定义
Dim RE As Object
,如我的链接所示。是的,我正在这样做,只是得到一条消息作为,您可以在3分钟内接受答案
。将等待3分钟,然后为其他人做一个注释,RE的静态性质意味着它只创建一次。对函数的后续调用跳过CreateObject调用。这大大提高了运行时间,尤其是在UDF中使用长列时。感谢您的解释。我会做更多的研究,虽然我没有完全理解是的,我正在这样做,只是得到一条消息,你可以在3分钟内接受答案。将等待3分钟,然后为其他人做一个注释,RE的静态性质意味着它只创建一次。对函数的后续调用跳过CreateObject调用。这大大提高了运行时间,尤其是在UDF中使用长列时。感谢您的解释。我会做更多的研究,虽然我没有完全理解P