2

FileSystemObject現在、(を使用して)テキストファイルを読み取り、特定の文字列を検索するようにVBAを設定しています。これはすべてうまくいきます。しかし、私が達成しようとしているのは、VBAがテキストを読み通し、特定の文字列(A)を見つけ、その下の次の行に別の文字列(B)を見つけると、何かを実行することです。ただし、BがAの直後にある場合のみ。

例:

Find in the following text "Bob's House" and in the next line after that "Electricity.
Text 1: - Return False
blablabla *Bob's House* blablabla
blablabla blablabla blablabla
blabla *Electiricity* blablabla

Text 1: - Return True
blablabla *Bob's House* blablabla
blabla *Electiricity* blablabla

これは私がこれまでに持っているものです:

Set fsFile = fs.OpenTextFile(FilePath, 1, False)
sLine = fsFile.ReadLine

If VBA.InStr(1, sLine, "Bobs House") > 0 Then
   checkpointHeading = True
End If
If VBA.InStr(1, sLine, "Electricity") > 0 Then
   checkpointSubheading = True
End If
If checkpointHeading = True And checkpointSubheading = True Then
   MsgBox "Found it!"
End If

Bobs Houseこれは、との間に何行あるかに関係なく、「Foundit」を返しますElectricity。これは理にかなっています。しかし、最初の拘束が前の行で見つかった後でのみ、2番目の拘束を強制するにはどうすればよいですか?

sLine +1/のようなものはありますか.Readline + 1(次に、最初のステートメント内に2番目のifステートメントを適用しますか?)。よろしくお願いします、R

4

3 に答える 3

2

次の行の「Electricity」と等しくない場合、次の行の「Bob's House」変数をリセットしていないため、この問題が発生しています。したがって、ボブの家が見つかると、それは常に真実であり、「電気」がどこに入ってくるかは問題ではありません。

あなたは2つの方法のうちの1つの後にあなたが何であるかを達成することができます。あなたが持っているようなブール値と「Way1」のコード(私は少し肥大化したのでわかりやすい)を使用するか、おそらく現在の行の文字列変数を保持する新しい文字列変数に設定するより良い方法ですループの最後の前の行で、「ウェイ2」のように次の行でこれらの変数の両方をチェックします。

(コードが例で機能するように、私が保持している例にはいくつかのタイプミスがあることに注意してください)。

    Sub Way1()
    Dim fs As New FileSystemObject, fsfile As Object
    Dim sLine As String
    Dim checkpointHeading As Boolean, checkpointSubheading As Boolean

    'Open file
    Set fsfile = fs.OpenTextFile("G:Test.txt", 1, False)

    'Loop through
    Do While fsfile.AtEndOfStream <> True

        sLine = fsfile.ReadLine

        If VBA.InStr(1, sLine, "Bob's House") > 0 Then
           checkpointHeading = True
        Else
           'If the line doesn't have Bob's House then check if the line before did
           If checkpointHeading Then
               'If it did then check for Electricity
               If VBA.InStr(1, sLine, "Electiricity") > 0 Then
                   'If it's found then happy days
                   checkpointSubheading = True
               Else
                   'If it's not found then reset everything
                   checkpointHeading = False: checkpointSubheading = False
               End If
           End If
        End If

        'Check if we've found it
        If checkpointHeading = True And checkpointSubheading = True Then
           MsgBox "Found it!"

           'You may want to reset here to be safe
           checkpointHeading = False:    checkpointSubheading = False
        End If

    Loop

    fsfile.Close
    Set fsfile = Nothing
    Set fs = Nothing
End Sub

より簡単で簡潔な方法2:

Sub Way2()
    Dim fs As New FileSystemObject, fsfile As Object
    Dim sLine As String, sPrevLine As String

    'Open file
    Set fsfile = fs.OpenTextFile("G:Test.txt", 1, False)

    'Loop through
    Do While fsfile.AtEndOfStream <> True

        sLine = fsfile.ReadLine

        If VBA.Len(sPrevLine) > 0 Then
            If VBA.InStr(1, sPrevLine, "Bob's House") > 0 And VBA.InStr(1, sLine, "Electiricity") Then
                MsgBox "Found it!"
            End If
        End If

        'Set the current line to the previous line *at the end of the loop*
        sPrevLine = sLine
    Loop

    fsfile.Close
    Set fsfile = Nothing
    Set fs = Nothing
End Sub
于 2013-02-26T03:17:25.063 に答える
0

私はそれをテストしませんでしたが、これはロジックを示すはずです:

 Const filepath = "..."

 Sub test()

    Dim fs
    Dim fsFile
    Dim found As Boolean
    Dim flag As Boolean
    Dim sLine As String

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set fsFile = fs.OpenTextFile(filepath, 1, False)

    found = False
    flag = False
    Do While Not fsFile.AtEndOfStream And Not found
        sLine = fsFile.readLine
        If flag And InStr(sLine, "Electricity") Then found = True
        flag = (InStr(sLine, "Bobs House") > 0)
    Loop

    If found Then
        MsgBox sLine
    Else
        MsgBox "not found"
    End If

 End Sub

編集:テスト済み。

于 2013-02-25T20:37:33.360 に答える
0

このようなもの:

    sLine = fsFile.ReadLine

    If isHeading Then
        If InStr(1, sLine, "Electricity") > 0 Then
            MsgBox "Found It!"
        End If
        isHeading = False
    End If

    If InStr(1, sLine, "Bobs House") > 0 Then
        isHeading = True
    End If
于 2013-02-25T20:43:23.137 に答える