Come creare e scrivere su un file txt utilizzando VBA


116

Ho un file che viene aggiunto o modificato manualmente in base agli input. Poiché la maggior parte dei contenuti sono ripetitivi in ​​quel file, cambiano solo i valori esadecimali, voglio renderlo un file generato dallo strumento.

Voglio scrivere i codici c che verranno stampati in quel file .txt .

Qual è il comando per creare un file .txt utilizzando VBA e come scriverlo


1
Vuoi modificare un file esistente una volta creato? E cosa sono "i codici c"
brettdj

1
Se una qualsiasi delle risposte esistenti soddisfacesse le tue esigenze, ti dispiacerebbe accettarla come risposta, quindi la tua domanda non appare più come senza risposta? (In caso contrario, aggiungi i dettagli su ciò che manca dalle risposte esistenti per risolvere il tuo problema :))
Marcus Mangelsdorf

Risposte:


37

Per approfondire la risposta di Ben :

Se aggiungi un riferimento Microsoft Scripting Runtimee digiti correttamente la variabile fso puoi sfruttare il completamento automatico (Intellisense) e scoprire le altre fantastiche funzionalità diFileSystemObject .

Ecco un modulo di esempio completo:

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

Grazie per aver scritto una risposta completa con commenti utili al codice.
Portland Runner

Sono più che felice se hai imparato qualcosa dal mio post! :)
Marcus Mangelsdorf

171

Usa UST per creare il file e scriverci sopra.

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    

Consulta la documentazione qui:


25
quando si fa riferimento direttamente a Scripting Runtime, è possibile utilizzare i tipi corretti: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron

È preferibile utilizzare Scripting Runtime rispetto al vecchio metodo di canale? Vorrei alcuni motivi per raccontare ai miei studenti informazioni supportate da altre esperienze.
Rick Henderson

@ RickHenderson, lo preferisco, se è questo che intendi. Il vantaggio è l'incapsulamento. Una volta che si obietta (set oFile = Nothing |), o esce dall'ambito, il file viene chiuso automaticamente.
Ben

2
Tieni presente che questa risposta promuove una cattiva pratica di codifica : il problema è che non definire esplicitamente i tipi di variabili corretti e creare un oggetto con un riferimento a una stringa al suo nome può causare problemi di debug in futuro (ad esempio se parti errate del nome). Inoltre, non digitando le variabili, non hai modo di conoscere gli altri fantastici metodi che FileSystemObjectha da offrire. @ Ben: per favore considera l'aggiornamento della tua risposta per guidare i principianti in una direzione migliore .
Marcus Mangelsdorf

2
@MarcusMangelsdorf ti ho sentito, ma non voglio discutere.
Ben

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

Maggiori informazioni:


Si prega di scrivere la risposta con alcune spiegazioni e dettagli.
Mohammed Noureldin

4
Preferisco questo metodo al metodo UST perché non richiede riferimenti esterni ed è piuttosto breve. Anche se suggerisco di utilizzare FreeFile per ottenere il numero di file invece di codificarlo come # 1.
phrebh

2
funziona alla grande. Non ho mai visto la Open somePath For Output As #1sintassi di prima, questo documenta: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/...
chiliNUT

5
Preferisco questo approccio anche per la scrittura banale di file di testo. Queste affermazioni fanno parte del linguaggio BASIC almeno dal 1981.
richardtallent

2
Per quanto riguarda il commento di @phrebh sull'utilizzo di FreeFile invece di un hardcoded # 1, vedere wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George Birbilis

33

un modo semplice senza troppe ridondanze.

    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
È possibile utilizzare il selettore di file per impostare il percorso?
RRS

Questo crea un file che è codificato UCS2. È possibile crearne uno che sia 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()

Questo può aiutare con la scrittura e la lettura di un file di testo
Zack Brightman

1
Penso che tu non legga qual è la domanda e inoltre non ti piace spiegare cosa intendi tentare, il che non è una buona cosa mentre aiuti gli altri.
M. Adeel Khalid

E non stai nemmeno formattando correttamente la tua risposta.
BDL

3
Sfortunatamente, il codice che hai pubblicato non è VBA. Non ci sono My.Computer.FileSystemoggetti in VBA per impostazione predefinita e quindi non puoi usare nemmeno il WriteAllTextmetodo.
Marcus Mangelsdorf

Zack, per favore evita di pubblicare risposte solo in codice e assicurati che la lingua che stai utilizzando sia in linea con op.
Daniel L. VanDenBosch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.