Cómo crear y escribir en un archivo txt usando VBA

116

Tengo un archivo que se agrega o modifica manualmente en función de las entradas. Dado que la mayoría de los contenidos son repetitivos en ese archivo, solo cambian los valores hexadecimales, quiero convertirlo en un archivo generado por una herramienta.

Quiero escribir los códigos c que se imprimirán en ese archivo .txt .

¿Cuál es el comando para crear un archivo .txt usando VBA y cómo lo escribo?

danny
fuente
1
¿Desea modificar un archivo existente una vez creado? ¿Y qué son los "códigos c"
brettdj
1
Si alguna de las respuestas existentes satisface sus necesidades, ¿le importaría aceptarla como una respuesta para que su pregunta ya no aparezca sin respuesta? (De lo contrario, agregue detalles sobre lo que falta en las respuestas existentes para resolver su problema :))
Marcus Mangelsdorf

Respuestas:

37

Para desarrollar la respuesta de Ben :

Si agrega una referencia Microsoft Scripting Runtimey escribe correctamente la variable f , puede aprovechar el autocompletado (Intellisense) y descubrir las otras excelentes características de FileSystemObject.

Aquí hay un módulo de ejemplo 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
Marcus Mangelsdorf
fuente
Gracias por escribir una respuesta completa con comentarios útiles para codificar.
Portland Runner
¡Estoy más que feliz si aprendieras algo de mi publicación! :)
Marcus Mangelsdorf
171

Utilice FSO para crear el archivo y escribir en él.

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    

Vea la documentación aquí:

Ben
fuente
25
cuando hace referencia a Scripting Runtime directamente, puede usar los tipos correctos: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron
¿Es preferible usar Scripting Runtime sobre el método de canal anterior? Me gustaría contarles algunas razones para contárselo a mis alumnos con información respaldada por otra experiencia.
Rick Henderson
@RickHenderson, lo prefiero, si eso es lo que quieres decir. La ventaja es la encapsulación. Una vez que objeta (establece oFile = Nothing |), o sale del alcance, el archivo se cierra automáticamente.
Ben
2
Tenga en cuenta que esta respuesta promueve una mala práctica de codificación : el problema es que no definir explícitamente los tipos de variables correctos , así como crear un objeto mediante una referencia de cadena a su nombre, puede ocasionarle problemas de depuración muy difíciles en el futuro (por ejemplo, si escribe mal partes del nombre). Además, al no escribir las variables, no tiene forma de aprender sobre los otros métodos asombrosos FileSystemObjectque ofrece. @Ben: considere actualizar su respuesta para guiar a los principiantes en una mejor dirección .
Marcus Mangelsdorf
2
@MarcusMangelsdorf Te he escuchado, pero no quiero tener un debate.
Ben
43
Open ThisWorkbook.Path & "\template.txt" For Output As #1
Print #1, strContent
Close #1

Más información:

Bhanu Sinha
fuente
Por favor escriba la respuesta con algunas explicaciones y detalles.
Mohammed Noureldin
4
Prefiero este método al método FSO porque no requiere referencias externas y es bastante corto. Aunque sugiero usar FreeFile para obtener el número de archivo en lugar de codificarlo como # 1.
phrebh
2
esto funciona muy bien. Nunca había visto la Open somePath For Output As #1sintaxis antes, esto la documenta: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
chiliNUT
5
Prefiero este enfoque también para la escritura mundana de archivos de texto. Estas declaraciones han sido parte del lenguaje BÁSICO desde al menos 1981.
richardtallent
2
Con respecto al comentario de @phrebh sobre el uso de FreeFile en lugar de un número 1 codificado de forma rígida,
George Birbilis
33

una forma fácil sin mucha redundancia.

    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
pelos
fuente
2
¿Es posible utilizar el selector de archivos para establecer la ruta?
2017
Esto crea un archivo codificado en UCS2. ¿Es posible crear uno que sea 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
fuente
Esto puede ayudar a escribir y leer un archivo de texto
Zack Brightman
1
Creo que no lees cuál es la pregunta y tampoco te gusta explicar lo que vas a intentar, lo cual no es bueno mientras ayudas a los demás.
M. Adeel Khalid
Y ni siquiera está formateando su respuesta correctamente.
BDL
3
Desafortunadamente, el código que publicó no es VBA. No hay ningún My.Computer.FileSystemobjeto en VBA de forma predeterminada, por lo que tampoco puede usar el WriteAllTextmétodo.
Marcus Mangelsdorf
Zack, evite publicar respuestas de solo código y asegúrese de que el idioma que está utilizando esté en línea con op.
Daniel L. VanDenBosch