2009-06-02 22 views
15

Mam ten kod makr w programie Microsoft Office Word 2003, który odczytuje wiersze pliku tekstowego. Każda linia reprezentuje wartość ciągu, którą muszę użyć później w kodzie.Czytaj linie z pliku tekstowego, ale pomiń pierwsze dwie linie.

Jednak pierwsze dwa wiersze pliku tekstowego zawierają pewne elementy, których nie potrzebuję. Jak mogę zmodyfikować kod tak, aby pomijał dwa pierwsze wiersze? W „Intellisense” w edytorze VBA w programie Word do Bani ciężko btw ..

Zresztą kod wyglądać tak

Dim sFileName As String 
Dim iFileNum As Integer 
Dim sBuf As String 
Dim Fields as String 

sFileName = "c:\fields.ini" 
''//Does the file exist? 
If Len(Dir$(sFileName)) = 0 Then 
    MsgBox ("Cannot find fields.ini") 
End If 

iFileNum = FreeFile() 
Open sFileName For Input As iFileNum 
Do While Not EOF(iFileNum) 
    Line Input #iFileNum, Fields 

    MsgBox (Fields) 

A to kod obecnie daje mi wszystkie linie, a ja nie chcę pierwsze dwa.

Odpowiedz

30

Ta cała Open <file path> For Input As <some number> rzeczą jest tak 1990. Jest również powolny i podatny na błędy.

W swoim edytorze VBA wybierz polecenie Odwołaj z menu Narzędzia i znajdź "Środowisko wykonawcze Microsoft Scripting" (scrrun.dll), które powinno być dostępne na prawie każdym komputerze XP lub Vista. To tam, wybierz to. Teraz masz dostęp do a (przynajmniej dla mnie), a bardziej niezawodne rozwiązanie:

With New Scripting.FileSystemObject 
    With .OpenTextFile(sFilename, ForReading) 

     If Not .AtEndOfStream Then .SkipLine 
     If Not .AtEndOfStream Then .SkipLine 

     Do Until .AtEndOfStream 
      DoSomethingImportantTo .ReadLine 
     Loop 

    End With 
End With 
2

Może to być uproszczenie?

Wystarczy dodać następujący kod:

Open sFileName For Input as iFileNum 
Line Input #iFileNum, dummy1 
Line Input #iFileNum, dummy2 
........ 

Sundar

+0

Będziesz także chcą sprawdzić EOF przed użyciem każdej z tych Wejścia Wiersz –

+0

-1. To się nie powiedzie, jeśli plik ma mniej niż dwie linie. – Tomalak

+0

To działa trochę, z wyjątkiem, mam tę pętlę na dole, która przechodzi przez cały plik tekstowy, szukając każdej linii. A ponieważ nie umieszczamy pierwszych dwóch linii w łańcuchu fikcyjnym, to samo dzieje się w następnej pętli. Oznacza to, że pomija co drugą linię w pliku tekstowym. Którego nie powinno robić. Rzeczywiście muszę wstawić linie do tablicy, z której będę mógł później korzystać. –

3
Open sFileName For Input As iFileNum 

Dim LineNum As Long 
LineNum = 0 

Do While Not EOF(iFileNum) 
    LineNum = LineNum + 1 
    Line Input #iFileNum, Fields 
    If LineNum > 2 Then 
    DoStuffWith(Fields) 
    End If 
Loop 
+0

To wydaje się działać całkiem dobrze, thanx! :) Ale co, jeśli chcę użyć dwóch pierwszych linii do czegokolwiek innego? Powiedz: chcę zapisać pierwsze linie w ciągu, a drugą linię w innym ciągu. Następnie przechowuj pozostałe linie w tablicy? –

+0

Jeśli LineNum = 1 Then ... ElseIf LineNum = 2 Then ... ElseIf LineNum> 2 Then ... End If – Tomalak

+1

Zamiast używać zmiennej LineNum, możesz użyć funkcji Seek. Usuń 'LineNum = LineNum + 1', a także deklarację i inicjalizację, i zastąp' LineNum> 2' przez 'Seek (iFileNum)> 2'. Możesz też użyć opcji "Do Until EOF (iFileNum)" zamiast "Do While Not EOF (iFilenum)". – systemovich

6

Można użyć losowego dostępu.

Open "C:\docs\TESTFILE.txt" For Random As #1 

    Position = 3 ' Define record number. 
    Get #1, Position, ARecord ' Read record. 

Close #1 
1
Dim sFileName As String 
Dim iFileNum As Integer 
Dim sBuf As String 
Dim Fields as String 
Dim TempStr as String 

sFileName = "c:\fields.ini" 
''//Does the file exist? 
If Len(Dir$(sFileName)) = 0 Then 
    MsgBox ("Cannot find fields.ini") 
End If 

iFileNum = FreeFile() 
Open sFileName For Input As iFileNum 

''//This part skips the first two lines 
if not(EOF(iFileNum)) Then Line Input #iFilenum, TempStr 
if not(EOF(iFileNum)) Then Line Input #iFilenum, TempStr 

Do While Not EOF(iFileNum) 
    Line Input #iFileNum, Fields 

    MsgBox (Fields) 
Loop 
Powiązane problemy