从MatchCollection到数组或值对

时间:2014-10-31 13:13:14

标签: regex vba

有没有办法将正则表达式捕获直接放入数组而不介入MatchCollection

我想要的是:Set myArray = myRegEx.Execute(myString)(0).SubMatches

或者至少,如果我知道可以捕获的数量,那么就可以"绑定"返回值:(myFirst, mySecond) = myRegEx.Execute(myString)(0).SubMatches

我知道SubMatches的使用已经完成,我只是想找到一种方法来完成对干预MatchCollection的规避。

1 个答案:

答案 0 :(得分:1)

好的,也许这会让你开始。

从Outlook宏到Excel宏不是我会做的事情。相反,我建议将一个应用程序绑定到另一个应用程序,并对暴露给VBProject的两个对象模型引用执行任何操作。

但无论如何,你可以按照你描述的方式去做,这应该是一个例子。

此示例假定Excel已打开,并且在该Excel实例中也打开包含该宏的工作簿。在Excel中,我创建了一个接受泛型Object参数的简单过程。我这样做是为了避免需要显式引用Microsoft VBScript Regular Expressions库。

这样,Excel中有一个宏,它接受(实际上是)一个对象变量。在这种情况下,它将成为SubMatches对象。 (确保将#9; Book9"更改为工作簿的名称,或根据需要进行修改以允许用户选择/打开工作簿等。)

Sub excelmacro(SM As Object)

    MsgBox SM.Count & " submatches"

End Sub

现在,我有一个非常简单的Outlook过程来测试它并验证它是否有效。在这种情况下,将没有子匹配,因此上面的Excel过程将显示消息框0 submatches

Sub test_to_Excel()
'### Requires reference to Microsoft VBScript Regular Expressions 5.0 ###
Dim re As New RegExp
Dim mySubmatches As SubMatches
Dim xl As Object 'Excel.Application
Dim wb As Object 'Excel.Workbook

With re
    .Global = True
    .Pattern = "asd"
    '## Now get a handle on the particular indexed match.submatches() 
    Set mySubmatches = .Execute("asdfkjasdfj; asdl asdfklwedrewn adg")(1).SubMatches
End With

'## Now we can send to Excel procedure:
'## Assumes Excel is already running and the file which contains the macro
'   is already open
Set xl = GetObject(, "Excel.Application")
Set wb = xl.Workbooks("Book9")

'## This tells the Excel application to run a named procedure
'   and passes the variable argument(s) to that procedure
xl.Application.Run "excelmacro", mySubmatches

End Sub