VBA代码searchstring,然后第二个string,并从文本文件返回数据行

我试图通过大日志文件search来查找一个文本string,然后如果该string存在find另一个文本string,然后返回下一个5行数据。 我设法search文本文件的string,并返回5行之后,但我似乎无法让macros返回5行之前search两行文本。

例如,如果文本文件看起来像这样:

17:42:56: Log File Closed 17:42:56: PrintInvoice: 2 17:42:56: copyReportData: 17:42:56: getNextRptDataID: 17:42:58: CalcDelCharge: 17:42:58: Sub Total: 3.80 17:42:58: Del Total: 0.00 17:42:58: Disc Total: 0.00 17:42:58: Vat Total: 0.00 17:42:58: Inv Total: 3.80 18:33:00: CalculateAmtDue: 18:33:00: CalculateChange: 18:33:00: UpdateDelCharge: 18:33:00: UpdateTotals 18:42:58: CalcDelCharge: 18:42:58: Sub Total: 5.80 18:42:58: Del Total: 0.00 18:42:58: Disc Total: 0.00 18:42:58: Vat Total: 0.00 18:42:58: Inv Total: 5.80

我想在第一个'CalcDelCharge'之后提取5行,因为它跟在'PrintInvoice:2'之后,这也是我想要search的string之一。

文本文件中始终包含“CalcDelCharge”,但是我只关心“PrintInvoice:2”之后的实例,这种情况出现频率较低。

这是我到目前为止

 Dim fn As String, txt As String, delim As String, a() As String Dim i As Long, ii As Long, iii As Long, x, y fn = "C:\Documents\tilllogfile.log" delim = vbTab temp = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll x = Split(temp, vbCrLf) ReDim a(1 To UBound(x) + 1, 1 To 100) For i = 0 To UBound(x) If InStr(1, x(i), "CalcDelCharge", 1) Then For ii = 0 To 5 n = n + 1: y = Split(x(i + ii), delim) For iii = 0 To UBound(y) a(n, iii + 1) = y(iii) Next Next End If 

这将提取5行后'CalcDelCharge',并把它放到一个电子表格,我没有能够缩小它的实例,当它跟随“PrintInvoice:2”。

任何帮助将不胜感激。

谢谢。

声明布尔variables来告诉macros你的文本是否被find

 Dim boolFound As Boolean 

在你最外部的循环中添加第一个testing:

 For i = 0 To UBound(x) If InStr(1, x(i), "PrintInvoice: 2", 1) Then boolFound = True End If 

在你的第二个testing中添加条件:

 If InStr(1, x(i), "CalcDelCharge", 1) And boolFound Then 

在复制五行之后,请不要忘记将boolFound更改为false:

  boolFound = False End If 

你可以使用正则expression式 ,不得不使用2个正则expression式,但是也可能只有一个。

 Dim str1 As Variant, str2 As Variant ReDim str1(0 To 100) ReDim str2(0 To 100) Dim objMatches As Object Dim j As Long, k As Long j = 0 k = 0 Set objRegExp = CreateObject("VBScript.RegExp") 'New regexp objRegExp.Pattern = "(?:PrintInvoice: 2)[\s\S]*?(?:\s*(?:\d+:)+\s*[\w\s]*:\s\d.*)+" 'https://regex101.com/r/ChRr4w/1/ objRegExp.Global = True Set objMatches = objRegExp.Execute(temp) If objMatches.Count <> 0 Then For Each m In objMatches str1(j) = m.Value j = j + 1 Next ReDim Preserve str1(0 To j - 1) For j = LBound(str1) To UBound(str1) txt = txt & str1(j) & vbCrLf Next j End If objRegExp.Pattern = "(?:\d+:)+\s*([\w\s]*:\s\d.*)" 'https://regex101.com/r/CLAL9i/1/ Set objMatches = objRegExp.Execute(txt) If objMatches.Count <> 0 Then For Each m In objMatches str2(k) = m.Submatches(0) k = k + 1 Next ReDim Preserve str2(0 To k - 1) For k = LBound(str2) To UBound(str2) result = result & str2(k) & vbCrLf Next k End If Debug.Print result 

结果

结果

这是我的版本(没有布尔值),只是使用一些嵌套循环。 在这里,我们把值放到一个数组中,让你做任何你想做的事情:

样本数据:

样本数据

 Option Explicit Sub Test() Dim searchvalue1 As String, searchvalue2 As String, myarray() As Variant, i As Long, j As Long, k As Long, l As Long ReDim myarray(0 To 0) searchvalue1 = "PrintInvoice: 2" searchvalue2 = "CalcDelCharge:" l = 1 For i = 1 To 100 If InStr(Range("A" & i).Value, searchvalue1) > 0 Then For j = i + 1 To 100 If InStr(Range("A" & j).Value, searchvalue2) > 0 Then For k = 0 To 4 ReDim Preserve myarray(UBound(myarray) + 1) As Variant myarray(k) = Range("A" & j + l).Value l = l + 1 Debug.Print myarray(k) Next k End If Next j End If Next i End Sub 

立即窗口:

在这里输入图像说明