Como criar e gravar em um arquivo txt usando VBA

116

Eu tenho um arquivo que é adicionado ou modificado manualmente com base nas entradas. Como a maior parte do conteúdo é repetitiva nesse arquivo, apenas os valores hexadecimais estão mudando, quero torná-lo um arquivo gerado por ferramenta.

Quero escrever os códigos c que serão impressos nesse arquivo .txt .

Qual é o comando para criar um arquivo .txt usando VBA e como faço para escrever nele

danny
fonte
1
Deseja modificar um arquivo existente depois de criado? E o que são "os códigos c"
brettdj
1
Se alguma das respostas existentes atender às suas necessidades, você se importaria em aceitá-la como uma resposta, para que sua pergunta não apareça mais como sem resposta? (Caso contrário, adicione detalhes sobre o que está faltando nas respostas existentes para resolver seu problema :))
Marcus Mangelsdorf

Respostas:

37

Para elaborar a resposta de Ben :

Se você adicionar uma referência Microsoft Scripting Runtimee digitar corretamente a variável fso, poderá aproveitar as vantagens do preenchimento automático (Intellisense) e descobrir os outros excelentes recursos do FileSystemObject.

Aqui está um módulo de exemplo 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
fonte
Obrigado por escrever uma resposta completa com comentários úteis sobre o código.
Portland Runner de
Fico mais do que feliz se você aprendeu alguma coisa com minha postagem! :)
Marcus Mangelsdorf
171

Use FSO para criar o arquivo e escrever nele.

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    

Veja a documentação aqui:

Ben
fonte
25
ao fazer referência ao Scripting Runtime diretamente, você pode usar os tipos corretos: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron
O uso do Scripting Runtime é preferível ao método de canal mais antigo? Eu gostaria de alguns motivos para contar aos meus alunos com informações apoiadas por outra experiência.
Rick Henderson
@RickHenderson, eu prefiro, se é o que você quer dizer. A vantagem é o encapsulamento. Assim que você objetar (definir oFile = Nothing |) ou sair do escopo, o arquivo será fechado automaticamente.
Ben
2
Observe que esta resposta promove práticas de codificação inadequadas : O problema é que não definir explicitamente os tipos de variáveis ​​corretos , bem como criar um objeto por uma referência de string ao seu nome pode dificultar muito a depuração de problemas no futuro (por exemplo, se você erros de ortografia em partes do nome). Além disso, ao não digitar as variáveis, você não tem como aprender sobre os outros métodos incríveis que FileSystemObjecttem a oferecer. @Ben: Por favor, considere atualizar sua resposta para levar os iniciantes a uma direção melhor .
Marcus Mangelsdorf
2
@MarcusMangelsdorf Já ouvi você, mas não quero debater.
Ben
43
Open ThisWorkbook.Path & "\template.txt" For Output As #1
Print #1, strContent
Close #1

Mais Informações:

Bhanu Sinha
fonte
Por favor escreva a resposta com algumas explicações e detalhes.
Mohammed Noureldin
4
Prefiro este método ao método FSO porque não requer referências externas e é bastante curto. Embora eu sugira usar o FreeFile para obter o número do arquivo em vez de codificá-lo como # 1.
phrebh de
2
isso funciona muito bem. Nunca vi a Open somePath For Output As #1sintaxe antes, esta documenta: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
chiliNUT
5
Eu prefiro essa abordagem também para a escrita de arquivos de texto comuns. Essas declarações fazem parte da linguagem BASIC desde pelo menos 1981.
richardtallent
2
Com relação ao comentário de @phrebh sobre o uso de FreeFile em vez de um codificado # 1, consulte wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George
33

uma maneira fácil sem muita redundância.

    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
fonte
2
É possível usar o seletor de arquivos para definir o caminho?
rrs
Isso cria um arquivo que é codificado em UCS2. É possível criar um que seja 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
fonte
Isso pode ajudar a escrever e ler um arquivo de texto
Zack Brightman
1
Acho que você não leu qual é a pergunta e também não gosta de explicar o que vai tentar, o que não é bom para ajudar os outros.
M. Adeel Khalid de
E você nem está formatando sua resposta adequadamente.
BDL de
3
Infelizmente, o código que você postou não é VBA. Não há My.Computer.FileSystemobjeto no VBA por padrão e, portanto, você também não pode usar o WriteAllTextmétodo.
Marcus Mangelsdorf,
Zack, evite postar respostas apenas com código e certifique-se de que a linguagem que você está usando está alinhada com op.
Daniel L. VanDenBosch