Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
Regex Excel VBA-从剪贴板返回字符串中所有子字符串的位置_Regex_Vba_Excel - Fatal编程技术网

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
哈哈,你真的救了我一命,伙计:我们的办公室将永远感激你