Cách tạo và ghi vào tệp txt bằng VBA


116

Tôi có một tệp được thêm vào hoặc sửa đổi theo cách thủ công dựa trên các đầu vào. Vì hầu hết các nội dung đều lặp lại trong tệp đó, chỉ có các giá trị hex là thay đổi, tôi muốn đặt nó thành tệp do công cụ tạo.

Tôi muốn viết các mã c sẽ được in trong tệp .txt đó .

Lệnh tạo tệp .txt bằng VBA là gì và làm cách nào để ghi vào tệp đó


1
Bạn có muốn sửa đổi một tệp hiện có sau khi nó được tạo không? Và "các mã c" là gì
brettdj

1
Nếu bất kỳ câu trả lời hiện có nào đáp ứng được nhu cầu của bạn, bạn có thể chấp nhận nó như một câu trả lời, để câu hỏi của bạn không còn hiển thị là chưa được trả lời? (Nếu không, xin vui lòng thêm chi tiết về những gì còn thiếu từ các câu trả lời hiện có để giải quyết vấn đề của bạn :))
Marcus Mangelsdorf

Câu trả lời:


37

Để giải thích rõ hơn về câu trả lời của Ben :

Nếu bạn thêm một tham chiếu đến Microsoft Scripting Runtimevà nhập chính xác biến fso, bạn có thể tận dụng lợi thế của tính năng tự động hoàn thành (Intellisense) và khám phá các tính năng tuyệt vời khác của FileSystemObject.

Đây là một mô-đun ví dụ hoàn chỉnh:

Option Explicit

' Go to Tools -> References... and check "Microsoft Scripting Runtime" to be able to use
' the FileSystemObject which has many useful features for handling files and folders
Public Sub SaveTextToFile()

    Dim filePath As String
    filePath = "C:\temp\MyTestFile.txt"

    ' The advantage of correctly typing fso as FileSystemObject is to make autocompletion
    ' (Intellisense) work, which helps you avoid typos and lets you discover other useful
    ' methods of the FileSystemObject
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    Dim fileStream As TextStream

    ' Here the actual file is created and opened for write access
    Set fileStream = fso.CreateTextFile(filePath)

    ' Write something to the file
    fileStream.WriteLine "something"

    ' Close it, so it is not locked anymore
    fileStream.Close

    ' Here is another great method of the FileSystemObject that checks if a file exists
    If fso.FileExists(filePath) Then
        MsgBox "Yay! The file was created! :D"
    End If

    ' Explicitly setting objects to Nothing should not be necessary in most cases, but if
    ' you're writing macros for Microsoft Access, you may want to uncomment the following
    ' two lines (see https://stackoverflow.com/a/517202/2822719 for details):
    'Set fileStream = Nothing
    'Set fso = Nothing

End Sub

Cảm ơn bạn đã viết một câu trả lời đầy đủ với các nhận xét hữu ích cho mã.
Á quân Portland

Tôi rất vui nếu bạn học được điều gì đó từ bài viết của tôi! :)
Marcus Mangelsdorf

171

Sử dụng FSO để tạo tệp và ghi vào tệp đó.

Dim fso as Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim oFile as Object
Set oFile = FSO.CreateTextFile(strPath)
oFile.WriteLine "test" 
oFile.Close
Set fso = Nothing
Set oFile = Nothing    

Xem tài liệu tại đây:


25
khi bạn tham khảo các Scripting Runtime trực tiếp, bạn có thể sử dụng các loại chính xác: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron

Sử dụng Scripting Runtime có được ưu tiên hơn phương pháp kênh cũ hơn không? Tôi muốn một số lý do để nói với học sinh của mình với thông tin được sao lưu bởi trải nghiệm khác.
Rick Henderson

@RickHenderson, tôi thích nó hơn, nếu đó là ý của bạn. Ưu điểm là tính đóng gói. Khi bạn phản đối (đặt oFile = Nothing |) hoặc nó vượt ra khỏi phạm vi, tệp sẽ tự động bị đóng.
Ben

2
Xin lưu ý rằng câu trả lời này khuyến khích thực hành mã hóa kém : Vấn đề là không xác định rõ ràng các loại biến chính xác cũng như tạo một đối tượng bằng tham chiếu chuỗi đối với tên của nó có thể khiến bạn rất khó gỡ lỗi trong tương lai (ví dụ: nếu bạn sai chính tả các bộ phận của tên). Ngoài ra, bằng cách không nhập các biến, bạn không có cách nào để tìm hiểu về các phương pháp tuyệt vời khác FileSystemObjectđã cung cấp. @Ben: Vui lòng xem xét cập nhật câu trả lời của bạn để dẫn dắt người mới bắt đầu theo hướng tốt hơn .
Marcus Mangelsdorf

2
@MarcusMangelsdorf Tôi đã nghe bạn nói, nhưng tôi không muốn tranh luận.
Ben

43
Open ThisWorkbook.Path & "\template.txt" For Output As #1
Print #1, strContent
Close #1

Thêm thông tin:


Vui lòng viết câu trả lời với một số giải thích và chi tiết.
Mohammed Noureldin

4
Tôi thích phương pháp này hơn phương pháp FSO vì nó không yêu cầu tham chiếu bên ngoài và khá ngắn. Mặc dù tôi khuyên bạn nên sử dụng FreeFile để lấy số tệp thay vì mã cứng nó là # 1.
phrebh 15/02/18

2
điều này hoạt động tuyệt vời. Tôi chưa bao giờ thấy Open somePath For Output As #1cú pháp trước đây, tài liệu này ghi lại nó: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
ớtNUT

5
Tôi thích cách tiếp cận này hơn cho việc viết tệp văn bản thông thường. Những câu lệnh này đã là một phần của ngôn ngữ BASIC ít nhất là từ năm 1981.
richardtallent

2
Về bình luận từ @phrebh về việc sử dụng FreeFile thay vì một hardcoded # 1 thấy wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George Birbilis

33

một cách dễ dàng mà không có nhiều dư thừa.

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim Fileout As Object
    Set Fileout = fso.CreateTextFile("C:\your_path\vba.txt", True, True)
    Fileout.Write "your string goes here"
    Fileout.Close

2
Có thể sử dụng trình chọn tệp để đặt đường dẫn không?
rrs

Điều này tạo ra một tệp được mã hóa UCS2. Có thể tạo một ANSI không?
paolov 25/09/18

-10
Dim SaveVar As Object

Sub Main()

    Console.WriteLine("Enter Text")

    Console.WriteLine("")

    SaveVar = Console.ReadLine

    My.Computer.FileSystem.WriteAllText("N:\A-Level Computing\2017!\PPE\SaveFile\SaveData.txt", "Text: " & SaveVar & ", ", True)

    Console.WriteLine("")

    Console.WriteLine("File Saved")

    Console.WriteLine("")

    Console.WriteLine(My.Computer.FileSystem.ReadAllText("N:\A-Level Computing\2017!\PPE\SaveFile\SaveData.txt"))
    Console.ReadLine()

End Sub()

Điều này có thể giúp đỡ với Viết và đọc một file văn bản
Zack Brightman

1
Tôi nghĩ rằng bạn không đọc câu hỏi là gì và bạn cũng không muốn giải thích những gì bạn sẽ cố gắng không phải là một điều tốt khi giúp đỡ người khác.
M. Adeel Khalid

Và bạn thậm chí không định dạng đúng câu trả lời của mình.
BDL

3
Rất tiếc, mã bạn đã đăng không phải là VBA. Không có My.Computer.FileSystemđối tượng nào trong VBA theo mặc định và vì vậy bạn cũng không thể sử dụng WriteAllTextphương thức này.
Marcus Mangelsdorf

Zack, Vui lòng tránh chỉ đăng câu trả lời mã và đảm bảo rằng ngôn ngữ bạn đang sử dụng phù hợp với op.
Daniel L. VanDenBosch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.