2009-06-02 47 views
15

Tôi đã có mã macro này trong Microsoft Office Word 2003 đọc dòng của tệp văn bản. Mỗi dòng đại diện cho một giá trị chuỗi mà tôi cần sử dụng sau này trong mã.Đọc các dòng từ một tệp văn bản nhưng bỏ qua hai dòng đầu tiên

Tuy nhiên, hai dòng đầu tiên của tệp văn bản chứa một số nội dung tôi không cần. Làm cách nào để sửa đổi mã để bỏ qua hai dòng đầu tiên? Các "Intellisense" trong trình soạn thảo VBA trong Word hút cứng btw ..

Dù sao, mã trông giống như sau

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) 

Và mã này hiện đang mang lại cho tôi tất cả các dòng, và tôi không muốn hai cái đầu tiên.

Trả lời

30

Đó toàn Open <file path> For Input As <some number> điều nên năm 1990. Nó cũng chậm và rất dễ bị lỗi.

Trong trình soạn thảo VBA của bạn, chọn Tham khảo từ trình đơn Công cụ và tìm "Thời gian chạy Microsoft Scripting" (scrrun.dll) sẽ có sẵn trên hầu hết mọi máy XP hoặc Vista. Nó ở đó, chọn nó. Bây giờ bạn có thể vào (với tôi ít nhất) giải pháp khá mạnh mẽ hơn:

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

Tôi có thể đơn giản hóa không?

Chỉ cần thêm đoạn mã sau:

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

Sundar

+0

Bạn cũng sẽ muốn kiểm tra cho EOF trước khi sử dụng mỗi một trong các dòng đầu vào –

+0

-1. Điều này thất bại nếu tập tin có ít hơn hai dòng – Tomalak

+0

Nó hoạt động một phần, ngoại trừ, tôi đã có vòng lặp này ở phía dưới mà đi qua toàn bộ tập tin văn bản, tìm kiếm cho mỗi dòng. Và kể từ khi chúng tôi không đặt hai dòng đầu tiên trong một chuỗi giả, điều tương tự xảy ra ở vòng lặp tiếp theo. Có nghĩa là, nó bỏ qua mọi dòng thứ hai trong tệp văn bản. Mà nó không nên làm. Tôi thực sự cần phải có các dòng được chèn vào một mảng, mà tôi có thể sử dụng sau này. –

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

Điều này dường như hoạt động khá tốt, thanx! :) Nhưng nếu tôi muốn sử dụng hai dòng đầu tiên cho bất kỳ thứ gì khác thì sao? Nói, tôi muốn lưu các dòng đầu tiên trong một chuỗi và dòng thứ hai trong một chuỗi khác. Sau đó, lưu trữ phần còn lại của các dòng trong một mảng? –

+0

Nếu LineNum = 1 Sau đó ... ElseIf LineNum = 2 Sau đó ... ElseIf LineNum> 2 Sau đó ... Kết thúc Nếu – Tomalak

+1

Thay vì sử dụng biến LineNum, bạn có thể sử dụng chức năng Tìm kiếm. Xóa 'LineNum = LineNum + 1' cũng như khai báo và khởi tạo, và thay thế' LineNum> 2' bằng 'Seek (iFileNum)> 2'. Ngoài ra, bạn có thể sử dụng 'Do Until EOF (iFileNum)' thay vì 'Do While Not EOF (iFilenum)'. – systemovich

6

Bạn có thể sử dụng truy cập ngẫu nhiên.

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 
Các vấn đề liên quan