2009-06-02 24 views
15

Ho questo codice macro in Microsoft Office Word 2003 che legge le righe di un file di testo. Le linee rappresentano ciascuna un valore stringa che ho bisogno di usare più avanti nel codice.Leggi le righe da un file di testo, ma salta le prime due righe

Tuttavia, le prime due righe del file di testo contengono alcune cose che non mi servono. Come posso modificare il codice in modo che salti le prime due righe? Il "Intellisense" entro l'editor VBA in Word succhia duro btw ..

In ogni caso, il codice simile a questa

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) 

E questo codice al momento mi dà tutte le linee, e io no voglio i primi due.

risposta

30

Tutta quella Open <file path> For Input As <some number> cosa è così 1990. È anche lento e molto incline agli errori.

Nell'editor VBA, selezionare Riferimenti dal menu Strumenti e cercare "Microsoft Scripting Runtime" (scrrun.dll) che dovrebbe essere disponibile su praticamente qualsiasi macchina XP o Vista. È lì, selezionalo. Ora si ha accesso a un (almeno per me) soluzione piuttosto più robusta:

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

Forse sto semplificando eccessivamente?

basta aggiungere il seguente codice:

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

Sundar

+0

Si potrebbe anche voler controllare per EOF prima di utilizzare ciascuno di questi ingressi di linea –

+0

-1. Questo fallisce se il file ha meno di due righe – Tomalak

+0

Funziona un po ', tranne, ho questo ciclo in fondo che passa attraverso l'intero file di testo, cercando ogni riga. E poiché non mettiamo le prime due linee in una stringa fittizia, la stessa cosa succede al prossimo ciclo. Significa che salta ogni seconda riga nel file di testo. Quale non dovrebbe fare. In realtà ho bisogno di inserire le linee in un array, che posso usare in seguito. –

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

Questo sembra funzionare piuttosto bene, grazie! :) Ma cosa succede se voglio usare le prime due righe per qualcos'altro? Dire, voglio memorizzare le prime righe in una stringa e la seconda riga in un'altra stringa. Quindi, memorizzare il resto delle linee in un array? –

+0

Se LineNum = 1 Then ... ElseIf LineNum = 2 Then ... ElseIf LineNum> 2 Then ... End If – Tomalak

+1

Invece di utilizzare la variabile LineNum, è possibile utilizzare la funzione Seek. Elimina 'LineNum = LineNum + 1' così come la dichiarazione e l'inizializzazione e sostituisci' LineNum> 2' con 'Seek (iFileNum)> 2'. Inoltre, è possibile usare 'Do Until EOF (iFileNum)' invece di 'Do While Not EOF (iFilenum)'. – systemovich

6

È possibile utilizzare l'accesso casuale.

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 
Problemi correlati