Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行宏vba之前添加正则表达式引用_Vba_Excel - Fatal编程技术网

在运行宏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