我正在使用VBA,并使用InStr来检查文件.txt中是否存在某些模式,但是我不在乎我在所有文件中都获得的第一个模式。我该如何跳过我第一次获得的所有循环。
在条目中,我有一个包含一些.txt文件的文件夹(具有2000/9000行),我有一个符号名称列表,我需要检查每个文件中是否存在每个符号以及每个文件包含多少个符号。现在已完成此步骤,但是符号文件中的第一个外观并不引起我的兴趣,因为它只声明了符号,但它不是符号。因此,要计算this.txt文件中此类符号的数量,我必须删除我得到的第一个符号
For i = 2 To Filepath_size
Open Filepath(i) For Input As #IndexFile
Debug.Print "Open file: "; Filepath(i)
Do While Not EOF(IndexFile)
Line Input #IndexFile, LineContent
If (InStr(LineContent, LinePrefix)) Then
For Each SymbolName In rngSymbo
If (InStr(LineContent, SymbolName)) Then
Set SymbolLineIndex = Range("A:A").Find(SymbolName, lookat:=xlWhole)
Cells(SymbolLineIndex.Row, i + 1).Interior.ColorIndex = 4
Cells(SymbolLineIndex.Row, i + 1).Value = Cells(SymbolLineIndex.Row, i + 1).Value + 1
Cells(SymbolLineIndex.Row, i + 1).Font.Size = 20
End If
Next SymbolName
End If
Loop
Close #IndexFile
Next i
我一周前开始使用VBA,所以我完全不知道这是否可行,但是可以跳过InStr发现的符号的首次出现。目前,我的代码在每次遇到符号时都会计数我,也就是说,一次超出必要次数,然后将其显示在我sheet1的表格上
答案 0 :(得分:1)
添加一个计数器,然后检查该计数器是否大于1
counter = 0
For i = 2 To Filepath_size
Open Filepath(i) For Input As #IndexFile
Debug.Print "Open file: "; Filepath(i)
Do While Not EOF(IndexFile)
Line Input #IndexFile, LineContent
If (InStr(LineContent, LinePrefix)) Then
For Each SymbolName In rngSymbo
If (InStr(LineContent, SymbolName)) Then
counter = counter + 1
if counter > 1 then
Set SymbolLineIndex = Range("A:A").Find(SymbolName, lookat:=xlWhole)
Cells(SymbolLineIndex.Row, i + 1).Interior.ColorIndex = 4
Cells(SymbolLineIndex.Row, i + 1).Value = Cells(SymbolLineIndex.Row, i + 1).Value + 1
Cells(SymbolLineIndex.Row, i + 1).Font.Size = 20
end if
End If
Next SymbolName
End If
Loop
Close #IndexFile
Next i
答案 1 :(得分:0)
更新
下面是显示如何计算文本中每个模式出现次数的示例:
Option Explicit
Sub TestSplit()
Dim sSample As String
Dim aSymbols()
Dim sSymbol
Dim a
sSample = "abc789 def 123 defghi123 abc def 456 789 abc ghi abc 123def 123 456abc789"
aSymbols = Array("abc", "123", "789")
For Each sSymbol In aSymbols
a = Split(sSample, sSymbol)
Debug.Print "Symbol '" & sSymbol & "': " & UBound(a) & " occurances"
Next
End Sub
初始答案
以下是简单函数的示例,该函数允许获取文本中的第n个模式出现位置:
Option Explicit
Sub Test()
Debug.Print GetNthInStr("678 abc 123 abc 456", "abc", 1)
Debug.Print GetNthInStr("678 abc 123 abc 456", "abc", 2)
End Sub
Function GetNthInStr(sText As String, sPattern As String, lNumber As Long) As Long
Dim i As Long
GetNthInStr = 0
For i = 1 To lNumber
GetNthInStr = InStr(GetNthInStr + 1, sText, sPattern)
If GetNthInStr = 0 Then Exit For
Next
End Function