InStr: пропустить первый получить - PullRequest
1 голос
/ 24 июня 2019

Я на VBA и использую InStr, чтобы проверить, есть ли в моем файле .txt некоторые паттерны, но меня не волнует первый паттерн, который я получаю во всех моих файлах.Как я могу пропустить все мои циклы первое, что я получаю.

Во входе у меня есть папка с некоторыми файлами .txt (с 2000/9000 строк), у меня есть список имен символов, и мне нужночтобы проверить, есть ли каждый символ здесь в каждом файле и сколько символов в каждом файле.Этот шаг уже сделан, но первое появление в файле символов меня не интересует, поскольку он просто объявляет символ, но не является символом.Таким образом, чтобы подсчитать количество символов этого типа в этом файле .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.На данный момент мой код считает меня каждый раз, когда встречается с символом, то есть слишком много раз, чем необходимо, и отображает это на столе на моем листе1

Ответы [ 2 ]

1 голос
/ 24 июня 2019

добавить счетчик, а затем проверить, является ли счетчик больше 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
0 голосов
/ 24 июня 2019

Обновление

Вот пример, показывающий, как подсчитать каждое вхождение образца в тексте:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...