Comment créer et écrire dans un fichier txt à l'aide de VBA

117

J'ai un fichier qui est ajouté ou modifié manuellement en fonction des entrées. Étant donné que la plupart des contenus sont répétitifs dans ce fichier, seules les valeurs hexadécimales changent, je veux en faire un fichier généré par un outil.

Je veux écrire les codes c qui vont être imprimés dans ce fichier .txt .

Quelle est la commande pour créer un fichier .txt à l'aide de VBA et comment y écrire

Danny
la source
1
Voulez-vous modifier un fichier existant une fois qu'il est créé? Et qu'est-ce que "les codes c"
brettdj
1
Si l'une des réponses existantes répondait à vos besoins, cela vous dérangerait-il de l'accepter comme réponse afin que votre question n'apparaisse plus comme sans réponse? (Sinon, veuillez ajouter des détails sur ce qui manque dans les réponses existantes pour résoudre votre problème :))
Marcus Mangelsdorf

Réponses:

38

Pour élaborer sur la réponse de Ben :

Si vous ajoutez une référence à Microsoft Scripting Runtimeet tapez correctement la variable fso, vous pouvez profiter de la saisie semi-automatique (Intellisense) et découvrir les autres fonctionnalités intéressantes de FileSystemObject.

Voici un exemple de module complet:

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
la source
Merci d'avoir écrit une réponse complète avec des commentaires utiles sur le code.
Portland Runner
Je suis plus qu'heureux si vous avez appris quelque chose de mon message! :)
Marcus Mangelsdorf
171

Utilisez FSO pour créer le fichier et y écrire.

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    

Consultez la documentation ici:

Ben
la source
25
lorsque vous référencez directement le Scripting Runtime, vous pouvez utiliser les types corrects: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron
L'utilisation de Scripting Runtime est-elle préférable à l'ancienne méthode de canal? J'aimerais avoir des raisons de dire à mes étudiants des informations étayées par d'autres expériences.
Rick Henderson
@RickHenderson, je préfère ça, si c'est ce que tu veux dire. L'avantage est l'encapsulation. Une fois que vous vous objectez (set oFile = Nothing |), ou qu'il sort de la portée, le fichier est automatiquement fermé.
Ben
2
Veuillez noter que cette réponse favorise les mauvaises pratiques de codage : le problème est que ne pas définir explicitement les types de variables corrects ainsi que créer un objet par une référence de chaîne à son nom peut vous causer très difficile de déboguer des problèmes à l'avenir (par exemple si vous mal orthographier certaines parties du nom). De plus, en ne tapant pas les variables, vous n'avez aucun moyen d'en apprendre davantage sur les autres méthodes étonnantes FileSystemObjectà offrir. @Ben: Veuillez envisager de mettre à jour votre réponse pour guider les débutants dans une meilleure direction .
Marcus Mangelsdorf
2
@MarcusMangelsdorf Je vous ai entendu, mais je ne veux pas avoir de débat.
Ben le
43
Open ThisWorkbook.Path & "\template.txt" For Output As #1
Print #1, strContent
Close #1

Plus d'information:

Bhanu Sinha
la source
Veuillez écrire la réponse avec quelques explications et détails.
Mohammed Noureldin
4
Je préfère cette méthode à la méthode FSO car elle ne nécessite pas de références externes et est assez courte. Bien que je suggère d'utiliser FreeFile pour obtenir le numéro de fichier au lieu de le coder en dur comme # 1.
phrebh
2
cela fonctionne très bien. Je n'ai jamais vu la Open somePath For Output As #1syntaxe auparavant, cela la documente: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
chiliNUT
5
Je préfère également cette approche pour l'écriture de fichiers texte banals. Ces déclarations font partie du langage BASIC depuis au moins 1981.
richardtallent
2
En ce qui concerne le commentaire de @phrebh sur l'utilisation de FreeFile au lieu d'un # 1 codé en dur, voir wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George Birbilis
33

un moyen simple sans redondance.

    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
la source
2
Est-il possible d'utiliser le sélecteur de fichiers pour définir le chemin?
rrs
Cela crée un fichier encodé en UCS2. Est-il possible d'en créer un qui soit 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
la source
Cela peut aider à écrire et à lire un fichier texte
Zack Brightman
1
Je pense que vous ne lisez pas la question et que vous n'aimez pas non plus expliquer ce que vous allez essayer, ce qui n'est pas une bonne chose en aidant les autres.
M. Adeel Khalid
Et vous ne formatez même pas correctement votre réponse.
BDL
3
Malheureusement, le code que vous avez publié n'est pas VBA. Il n'y a pas d' My.Computer.FileSystemobjet dans VBA par défaut et vous ne pouvez donc pas non plus utiliser la WriteAllTextméthode.
Marcus Mangelsdorf
Zack, veuillez éviter de publier uniquement des réponses au code et assurez-vous que la langue que vous utilisez est en ligne avec op.
Daniel L. VanDenBosch