Regex Excel VBA-从剪贴板返回字符串中所有子字符串的位置
我试图在从剪贴板获取的字符串中找到唯一键的所有位置(后跟两个制表键),然后我希望使用这些位置插入回车符,然后将所有内容再次放回剪贴板 第一件事优先;让位置部件工作起来 下面是字符串的一个缩短示例:Regex Excel VBA-从剪贴板返回字符串中所有子字符串的位置,regex,vba,excel,Regex,Vba,Excel,我试图在从剪贴板获取的字符串中找到唯一键的所有位置(后跟两个制表键),然后我希望使用这些位置插入回车符,然后将所有内容再次放回剪贴板 第一件事优先;让位置部件工作起来 下面是字符串的一个缩短示例: Initial Approval in First Market or Non-Submitted Closure 090052fb842ef82f 090052fb842f3659 090052fb842ef82e 以下是我从研究问题到目前为
Initial Approval in First Market or Non-Submitted Closure 090052fb842ef82f 090052fb842f3659 090052fb842ef82e
以下是我从研究问题到目前为止收集的非功能性代码:
Sub oldRecords()
Dim clipboard As MSForms.DataObject
Dim strContents As String
Set clipboard = New MSForms.DataObject
clipboard.GetFromClipboard
strContents = clipboard.GetText
Set objRegEx = CreateObject("vbscript.regexp")
objRegEx.Pattern = "(090052fb)[0-9A-Za-z]{8}\t\t"
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
Start = 1
Do
pos = InStr(Start, strContents, objRegEx.Execute(strContents), vbBinaryCompare)
If pos > 0 Then
Start = pos + Len(objRegEx.Pattern)
WScript.Echo pos
WScript.Echo Mid(strContents, pos, Len(objRegEx.Pattern))
End If
Loop While pos > 0
End Sub
现在我得到一个运行时错误“450”:参数数量错误或属性分配无效,我认为罪魁祸首是:
objRegEx.Execute(strContents)
我不知道从这里到哪里去,所以任何帮助都将是非常棒的!:)
编辑1:
首先感谢你对我的问题感兴趣
BrackNicku为一个问题提供了一个简单的解决方案,我显然认为这个问题比它需要的更复杂!下面是我最终使用的代码,在核心问题上添加了我需要的一些额外的位:
Sub oldRecords2()
Dim clipboard As MSForms.DataObject
Dim strContents As String
Dim start As Long, pos As Long
Set clipboard = New MSForms.DataObject
clipboard.GetFromClipboard
strContents = clipboard.GetText
Dim objRegEx
Set objRegEx = CreateObject("vbscript.regexp")
objRegEx.Pattern = "(090052fb[0-9A-Za-z]{8})\t\t"
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
X1 = 10 ' Line Feed Character
X2 = 13 ' Carriage Return Character
X3 = "Archive Custodain Group"
X4 = "Archive Custodain Group" & Chr(X2)
'======================================================================================================
strContents = Replace(strContents, Chr(X1), "") ' REMOVES LINE FEEDS
strContents = Replace(strContents, X3, X4) ' ADDS CR AFTER TITLE ROW
strContents = objRegEx.Replace(strContents, "$1" & vbNewLine)
'======================================================================================================
clipboard.SetText strContents 'PUT BACK INTO CLIPBOARD
clipboard.PutInClipboard
End Sub
运行
objRegEx.Execute(strContents)
时,它返回一个匹配集合。然后,您甚至没有使用结果,因为Len(objRegEx.Pattern)
返回模式的长度,而不是匹配的长度
似乎您只想获取字符串中的匹配项及其索引。当pos>0时,从Start=1
开始,并以循环结束,删除所有开始,然后使用
Dim ms As Object, m As Object
'...
objRegEx.Pattern = "(090052fb[0-9A-Za-z]{8})\t\t"
'...
Set ms = objRegEx.Execute(strContents)
For Each m In ms
WScript.Echo m.FirstIndex
WScript.Echo m.SubMatches(0)
Next
测试
strContents = "Initial Approval in First Market or Non-Submitted Closure" & vbTab & vbTab & "090052fb842ef82f" & vbTab & vbTab & "090052fb842f3659" & vbTab & vbTab & "090052fb842ef82e" & vbTab & vbTab
结果:
59
090052fb842ef82f
77
090052fb842f3659
95
090052fb842ef82e
注意:我将捕获组移到了除制表符模式以外的所有模式,(090052fb[0-9A-Za-z]{8})\t\t
,请根据需要自由调整。使用您的字符串示例,我得出以下结论:
Sub findKeyPositions()
Dim str As String
Dim splitStr() As String
Dim searchStr As String
str = "Initial Approval in First Market or Non-Submitted Closure 090052fb842ef82f 090052fb842f3659 090052fb842ef82e "
splitStr() = Split(Replace(str, "090052fb", ""), " ") 'in your example i did it with 7 spaces and not vbtab
For i = LBound(splitStr) To UBound(splitStr)
searchStr = Trim(splitStr(i))
Debug.Print (InStr(1, str, searchStr, vbTextCompare))
Next i
End Sub
我试图找到唯一键的所有位置(后跟
两次制表键)在一个字符串中,从剪贴板中获取,位置
然后我希望用它来插入回车,然后
将所有内容重新放回剪贴板
如果要在每个键之前插入新行,则可以尝试RegExp.Replace
strContents = objRegEx.Replace(strContents, vbNewLine & "$1")
您必须修改模式以将整个密钥包含在组中:
objRegEx.Pattern = "(090052fb[0-9A-Za-z]{8})\t\t"
结果:
59
090052fb842ef82f
77
090052fb842f3659
95
090052fb842ef82e
首次市场的初始批准或未提交的关闭
090052fb842ef82f
090052fb842f3659
090052fb842ef82e
完整代码(图案后有新行):
如果我正确理解你的帖子,你想用CR替换标签
如果是这样,那么就没有必要找到位置,你可以直接替换
Sub replaceTab()
Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
clipboard.GetFromClipboard
clipboard.SetText Replace(clipboard.GetText, vbTab, vbCrLf)
clipboard.PutInClipboard
End Sub
你能加上预期的结果吗?请注意,pos+Len(objRegEx.Pattern)
是错误的,因为您添加了模式的长度,而不是匹配的长度。可能您需要找到匹配项本身并获取其索引。我得到了59
、77
和95
,这是预期的吗?根据strContents=“首次市场中的初始批准或未提交的关闭”&vbTab&vbTab和“090052fb842ef82f”&vbTab和“090052fb842f3659”&vbTab和“090052fb842ef82e”&vbTab&vbTab进行测试
如果我添加匹配输出,我也会得到090052fb842ef82f
,090052fb842f3659
,090052fb842ef82e
。如果访问组1值时出现问题,请尝试m.SubMatches.Item(0)
这听起来近乎完美,但我无法让它工作,我需要在模式之后返回。你能在一次编辑中发布你用来完成这项工作的所有代码吗?@HotSauceCoconuts我已经添加了代码(与你的代码几乎相同)。如果要保存选项卡,请将它们包含在模式的括号中。如果你只想要CR,用vbCr
而不是vbNewLine
哈哈,你真的救了我一命,伙计:我们的办公室将永远感激你