วิธีสร้างและเขียนไปยังไฟล์ txt โดยใช้ VBA


117

ฉันมีไฟล์ที่เพิ่มหรือแก้ไขด้วยตนเองตามอินพุต เนื่องจากเนื้อหาส่วนใหญ่ซ้ำซากในไฟล์นั้นมีเพียงค่าฐานสิบหกเท่านั้นที่เปลี่ยนแปลงฉันจึงต้องการให้มันเป็นไฟล์ที่สร้างด้วยเครื่องมือ

ฉันต้องการเขียนรหัส c ที่จะพิมพ์ในไฟล์. txtนั้น

คำสั่งในการสร้างไฟล์. txtโดยใช้ VBA คืออะไรและฉันจะเขียนมันได้อย่างไร


1
คุณต้องการแก้ไขไฟล์ที่มีอยู่เมื่อสร้างขึ้นแล้วหรือไม่? และ "รหัส c" คืออะไร
brettdj

1
หากคำตอบที่มีอยู่ตรงกับความต้องการของคุณคุณจะยอมรับเป็นคำตอบได้หรือไม่คำถามของคุณจึงไม่แสดงว่ายังไม่มีคำตอบอีกต่อไป (ถ้าไม่มีโปรดเพิ่มรายละเอียดว่ามีอะไรหายไปจากคำตอบที่มีอยู่เพื่อแก้ปัญหาของคุณ :))
Marcus Mangelsdorf

คำตอบ:


38

เพื่ออธิบายรายละเอียดเกี่ยวกับคำตอบของ Ben :

หากคุณเพิ่มการอ้างอิงMicrosoft Scripting Runtimeและพิมพ์ตัวแปรfอย่างถูกต้องคุณสามารถใช้ประโยชน์จากการเติมข้อความอัตโนมัติ (Intellisense) และค้นพบคุณสมบัติที่ยอดเยี่ยมอื่น ๆ ของFileSystemObject .

นี่คือโมดูลตัวอย่างที่สมบูรณ์:

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

ขอขอบคุณที่เขียนคำตอบที่สมบูรณ์พร้อมความคิดเห็นที่เป็นประโยชน์เกี่ยวกับโค้ด
Portland Runner

ฉันดีใจมากกว่านี้ถ้าคุณได้เรียนรู้บางสิ่งจากโพสต์ของฉัน! :)
Marcus Mangelsdorf

171

ใช้ FSO เพื่อสร้างไฟล์และเขียนลงในไฟล์

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    

ดูเอกสารที่นี่:


25
เมื่อคุณอ้างอิง Scripting Runtime โดยตรงคุณสามารถใช้ประเภทที่ถูกต้อง: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron

การใช้ Scripting Runtime เป็นที่ต้องการมากกว่าวิธีช่องทางที่เก่ากว่าหรือไม่? ฉันต้องการเหตุผลบางประการที่จะบอกนักเรียนของฉันด้วยข้อมูลที่สำรองไว้โดยประสบการณ์อื่น ๆ
Rick Henderson

@RickHenderson ฉันชอบมากกว่าถ้านั่นคือสิ่งที่คุณหมายถึง ข้อดีคือการห่อหุ้ม เมื่อคุณคัดค้าน (ตั้งค่า oFile = Nothing |) หรืออยู่นอกขอบเขตไฟล์จะถูกปิดโดยอัตโนมัติ
เบ็น

2
โปรดทราบว่าคำตอบนี้ส่งเสริมแนวทางปฏิบัติในการเขียนโค้ดที่ไม่ดี : ปัญหาคือการไม่กำหนดประเภทตัวแปรที่ถูกต้องอย่างชัดเจนรวมทั้งการสร้างออบเจ็กต์โดยการอ้างอิงสตริงไปยังชื่ออาจทำให้คุณแก้ไขปัญหาได้ยากในอนาคต (เช่นหากคุณ ส่วนที่สะกดผิดของชื่อ) นอกจากนี้โดยไม่ได้พิมพ์ตัวแปรคุณมีวิธีการเรียนรู้เกี่ยวกับวิธีการที่น่าตื่นตาตื่นใจอื่น ๆ ไม่FileSystemObjectได้ที่จะนำเสนอ @ Ben: โปรดพิจารณาปรับปรุงคำตอบของคุณจะเริ่มต้นนำในทิศทางที่ดีขึ้น
Marcus Mangelsdorf

2
@MarcusMangelsdorf ฉันเคยได้ยินคุณ แต่ฉันไม่ต้องการที่จะมีการอภิปราย
เบ็น

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

ข้อมูลมากกว่านี้:


โปรดเขียนคำตอบพร้อมคำอธิบายและรายละเอียด
Mohammed Noureldin

4
ฉันชอบวิธีนี้มากกว่าวิธี FSO เพราะไม่ต้องการการอ้างอิงภายนอกและค่อนข้างสั้น แม้ว่าฉันจะแนะนำให้ใช้ FreeFile เพื่อรับหมายเลขไฟล์แทนการเข้ารหัสเป็น # 1
phrebh

2
มันใช้งานได้ดี ฉันไม่เคยเห็นOpen somePath For Output As #1ไวยากรณ์มาก่อนเอกสารนี้: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
ChiliNUT

5
ฉันชอบแนวทางนี้เช่นกันสำหรับการเขียนไฟล์ข้อความทางโลก ข้อความเหล่านี้เป็นส่วนหนึ่งของภาษา BASIC ตั้งแต่อย่างน้อยปี 1981
richardtallent

2
เกี่ยวกับความคิดเห็นจาก @phrebh เกี่ยวกับการใช้ FreeFile แทน hardcoded # 1 โปรดดูที่wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George Birbilis

33

วิธีง่ายๆโดยไม่ต้องมีความซ้ำซ้อนมาก

    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
เป็นไปได้หรือไม่ที่จะใช้ตัวเลือกไฟล์เพื่อกำหนดเส้นทาง?
rrs

สิ่งนี้จะสร้างไฟล์ที่เข้ารหัส UCS2 เป็นไปได้ไหมที่จะสร้าง ANSI
paolov

-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()

สิ่งนี้สามารถช่วยในการเขียนและอ่านไฟล์ข้อความ
Zack Brightman

1
ฉันคิดว่าคุณไม่ได้อ่านว่าคำถามคืออะไรและคุณก็ไม่ชอบที่จะอธิบายว่าคุณกำลังพยายามทำอะไรซึ่งไม่ใช่เรื่องดีในขณะที่ช่วยเหลือผู้อื่น
M. Adeel Khalid

และคุณไม่ได้จัดรูปแบบคำตอบของคุณอย่างถูกต้อง
BDL

3
ขออภัยรหัสที่คุณโพสต์ไม่ใช่ VBA ไม่มีMy.Computer.FileSystemวัตถุใน VBA ตามค่าเริ่มต้นดังนั้นคุณจึงไม่สามารถใช้WriteAllTextวิธีนี้ได้เช่นกัน
Marcus Mangelsdorf

Zack โปรดหลีกเลี่ยงการโพสต์รหัสเฉพาะคำตอบและตรวจสอบให้แน่ใจว่าภาษาที่คุณใช้อยู่ในบรรทัดเดียวกับ op
Daniel L. VanDenBosch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.