2009-06-02 6 views
15

J'ai ce code de macro dans Microsoft Office Word 2003 qui lit les lignes d'un fichier texte. Les lignes représentent chacune une valeur de chaîne que je dois utiliser plus tard dans le code.Lire des lignes à partir d'un fichier texte, mais ignorer les deux premières lignes

Cependant, les deux premières lignes du fichier texte contiennent des éléments dont je n'ai pas besoin. Comment puis-je modifier le code afin qu'il saute les deux premières lignes? Le « IntelliSense » dans l'éditeur VBA dans Word suce dur btw ..

Quoi qu'il en soit, le code ressemble à ceci

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) 

Et ce code me donne actuellement toutes les lignes, et je ne le font pas veux les deux premiers.

Répondre

30

Toute cette Open <file path> For Input As <some number> chose est si 1990. C'est aussi lent et très sujet aux erreurs.

Dans votre éditeur VBA, sélectionnez Références dans le menu Outils et recherchez "Microsoft Scripting Runtime" (scrrun.dll) qui devrait être disponible sur pratiquement toutes les machines XP ou Vista. C'est là, sélectionnez-le. Maintenant, vous avez accès à un (pour moi au moins) un peu plus robuste solution:

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

Peut-être que je simplifie à l'excès?

il suffit d'ajouter le code suivant:

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

Sundar

+0

Vous aimerez également vouloir vérifier EOF avant d'utiliser chacune de ces entrées ligne –

+0

-1. Cela échoue si le fichier a moins de deux lignes – Tomalak

+0

Cela fonctionne un peu, sauf que j'ai cette boucle en bas qui parcourt tout le fichier texte, en recherchant chaque ligne. Et puisque nous ne mettons pas les deux premières lignes dans une ficelle, la même chose arrive à la prochaine boucle. Ce qui signifie, il saute toutes les deux lignes dans le fichier texte. Ce qu'il ne devrait pas faire. J'ai vraiment besoin que les lignes soient insérées dans un tableau, que je pourrai utiliser plus tard. –

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

Cela semble fonctionner plutôt bien, merci! :) Mais que se passe-t-il si je veux utiliser les deux premières lignes pour autre chose? Dites, je veux stocker les premières lignes dans une chaîne, et la deuxième ligne dans une autre chaîne. Ensuite, stockez le reste des lignes dans un tableau? –

+0

Si LineNum = 1 Then ... ElseIf LineNum = 2 Alors ... ElseIf LineNum> 2 Then ... End Si – Tomalak

+1

Au lieu d'utiliser la variable LineNum, vous pouvez utiliser la fonction Seek. Supprimer 'LineNum = LineNum + 1' ainsi que la déclaration et l'initialisation, et remplacer' LineNum> 2' par 'Seek (iFileNum)> 2'. De plus, vous pouvez utiliser 'Do Until EOF (iFileNum)' au lieu de 'Do While Not EOF (iFilenum)'. – systemovich

6

Vous pouvez utiliser l'accès aléatoire.

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 
Questions connexes