2017-01-29 2 views
1

Ich hoffe, Sie können mit einem VBA-Problem helfen, das ich versuche zu lösen.Kopie gefunden Zeichenfolge 1 Zelle nach unten

Meine Situation: Ich habe mehrere TXT-Dateien als Eingabe für die Suche nach einer bestimmten Zeichenfolge ("tflux"). In jeder TXT-Datei ist die Zeichenfolge vorhanden, daher ist es nicht möglich, dass sie nicht gefunden wird. Ich habe den folgenden Code geschrieben, aber ich finde keine Möglichkeit, Excel mitzuteilen, dass nach dem Kopieren des Werts, der mit der gefundenen Zeichenfolge zusammenhängt, eine Zelle für den nächsten gefundenen Wert nach unten verschoben werden muss . Obwohl ich es noch nicht versucht habe, möchte ich auch den Dateinamen neben den Zahlen drucken, um sicherzugehen, dass die Werte einem bestimmten Dateinamen entsprechen.

Mein VBA-Code so weit:

Sub CommandButton1_Click() 

    Dim strF As String, strP As String, text As String, textline As String, tFlux As Integer 
    strP = "C:\test" 'change for the path of your folder 

    strF = Dir(strP & "\*.txt") 'Change as required 

    Do While strF <> vbNullString 

    Open strF For Input As #1 
    Do Until EOF(1) 

    Line Input #1, textline 
    text = text & textline 
    tFlux = InStr(text, "tflux") 
    Range("B2").Value = Mid(text, tFlux + 9, 3) <----- this is the line where I need help, Now the last found value is copied into cell B2, but I want excel to move to B3 after filling B2, move to B4 after filling B3, etc.... 

Loop 
Close #1 
text = "" 
strF = Dir() 
Loop 

End Sub 
+0

Tritt der String '" tflux "' in jeder Zeile in jeder Datei oder nur einmal in jeder Datei oder mehrmals (aber nicht in jeder Zeile) in jeder Datei auf? Und befinden sich die gesuchten Daten immer in der gleichen Zeile wie "tflux", oder ist es manchmal in einer folgenden Zeile (zB "tflux" können die letzten 5 Zeichen einer Zeile und die Daten sein, die Sie sind) nach vielleicht in der 5. bis 7. Zeichen der nächsten Zeile)? – YowE3K

+0

"tflux" tritt nur bei 1 Zeile in jeder Datei auf. Die Daten, die ich extrahieren möchte, befinden sich in der gleichen Zeile wie "tflux". – VBAnovice

Antwort

2

Wie über eine lange Variable, die einen Wert bis in den Bereich bewegt jedes Mal durch die Schleife läuft:

Sub CommandButton1_Click() 

Dim strF As String, strP As String, text As String, textline As String 
Dim tFlux As Integer strP = "C:\test" 'change for the path of your folder 
Dim x as long 

strF = Dir(strP & "*.txt") 'Change as required 

Do While strF <> vbNullString 

x = 2 

Open strF For Input As #1 Do Until EOF(1) 

    Line Input #1, textline 
    text = text & textline 
    tFlux = InStr(text, "tflux") 

    Range("B" & x).Value = Mid(text, tFlux + 9, 3) 
    x = x + 1 
Loop 

Close #1 text = "" strF = Dir() Loop 
End Sub 
+0

Nochmals vielen Dank für die Hilfe! – VBAnovice

3

Die Antwort von VBA Pete wird die gewünschte Abwärtsbewegung für jeden gefundenen Wert durchführen. Aber ich möchte Sie warnen, über ein anderes, wichtiges Problem in Ihrem Code:

Line Input #1, textline

text = text & textline

tFlux = InStr(text, "tflux")

Der obige Code hat zwei Probleme. Jedes Mal, wenn Sie eine Zeile lesen, hängen Sie sie an den vorherigen Text aus der Datei an und starten die Suche am Anfang der Datei neu. Dies ist sehr langsam, aber außerdem ist es falsch, denn wenn viele Vorkommen von "tflux" in der Datei vorhanden sind, werden Sie immer das erste Vorkommen feststellen. Selbst wenn es nur ein Vorkommen gibt, werden Sie es abfangen und es jedes Mal melden, wenn Sie eine neue Zeile lesen.

Die zweite Zeile der oben sollte diese Weise neu geschrieben werden:

text = textline ' <-- just copy the line, don't append it to previous lines from the file 
+1

Gute Ergänzung, ich habe nicht einmal darüber nachgedacht. –

+0

@VBAPete ja, aber das war sowieso jenseits der Frage des OP. :) –

+0

Vielen Dank A.S.H – VBAnovice

0

Ich würde empfehlen, dass Sie Ihren Code Refactoring wie folgt:

Sub CommandButton1_Click() 

    Dim strF As String, strP As String, textline As String, tFlux As Integer 
    Dim r As Long ' to keep track of which row we are writing to 

    strP = "C:\test" 'change for the path of your folder 
    strF = Dir(strP & "\*.txt") 'Change as required 
    r = 2 ' first line of output will go to row 2 

    Do While strF <> vbNullString 

     Open strF For Input As #1 
     Do Until EOF(1)  
      Line Input #1, textline 
      tFlux = InStr(textline, "tflux") 
      'See if we found "tflux" 
      If tFlux > 0 Then 
       'Found it - store the associated value 
       Cells(r, "B").Value = Mid(textline, tFlux + 9, 3) 
       'Store the filename too 
       Cells(r, "C").Value = strF 
       r = r + 1 ' set row pointer ready for next file 
       Exit Do ' found and processed - no need to keep looking within this file 
      End If 
     Loop 
     Close #1 
     strF = Dir() 
    Loop 

End Sub 

ich ein Exit Do innerhalb der „eingeschlossen lesen file "loop, so dass, sobald es die gesuchte Information findet, es die Schleife verlässt. Das spart Zeit, weil Sie nicht weiter den Rest der Datei lesen müssen, um nach etwas zu suchen, von dem Sie wissen, dass es nicht da sein wird.

+0

Vielen Dank, es hat mir sehr geholfen! – VBAnovice

Verwandte Themen