VBA读取文本文件:权限被拒绝

我有一个文件夹包含文本文件。 文本显示如下:

NAME Number Mail Date xx 1 zz // 

我想写一个vba代码,读取所有的文本文件,并search信息“名称”,以“名称”replace它,然后保存修改。 我做了下面的代码,但我有一个error 70 permission deniedSet f = FSO.OpenTextFile(Fichier, forWriting, True)

你可以帮帮我吗 ?

 Sub Sample() dim fso=createobject("scripting.filesystemObject") dim f dim path as string dim file_txt as string path= "C:\Users\Folder\Fileshere\" file_txt= Dir(path & "*.*") Do While Len(file_txt) > 0 'Set objfile = FSO.CreateTextFile(path & file_txt) Set f = FSO.OpenTextFile(file_txt, ForReading) While Not f.AtEndOfStream Namechange = f.ReadAll Wend Namechange = Replace(Namechange , "NAME", "name") Set f = FSO.OpenTextFile(file_txt, forWriting, True) f.Write Namechange file_txt=dir() loop end sub 

我会重写使用一些FileSystemObjectfunction,而不是个人使用Dir() ,但这是你自己的select。 我认为你遇到的关键问题是你已经打开文件进行阅读,然后立即尝试在TextStream对象仍然在内存中时打开它,并locking文件。 这就是为什么你得到“权限被拒绝”。 引用TechNet文章 :

打开文本文件

使用文本文件是一个三步过程。 在你做任何事情之前,你必须打开文本文件。 这可以通过打开现有的文件或创build一个新的文本文件来完成。 (当您创build一个新文件时,该文件会自动打开并准备使用。)任一方法都会返回对TextStream对象的引用。 在引用了TextStream对象之后,您可以读取或写入文件。 但是,不能同时读取和写入同一个文件。 换句话说,您不能打开文件,读取内容,然后将其他数据写入文件,所有操作都在同一个操作中。 相反,您必须读取内容,closures文件,然后重新打开并写入其他数据。 当您打开一个现有的文本文件时,可以打开该文件进行读取或写入。 当您创build一个新的文本文件时,该文件仅用于写入,如果没有其他原因而没有内容可读。 最后,你应该总是closures一个文本文件。 虽然这不是必需的(一旦脚本终止,文件一般会被closures),这是很好的编程习惯。

我的代码应该符合你的要求。 我已经从中间删除了While循环,就像使用ReadAll你不需要遍历文本。

 Sub MySub() Dim fso Set fso = CreateObject("scripting.filesystemObject") Dim file, folder Dim path As String Dim file_txt As String path = "C:\users\folders\fileshere\" Set folder = fso.GetFolder(path) For Each file In folder.Files Set file = fso.OpenTextFile(file.Path, 1) Namechange = file.ReadAll file.Close Namechange = Replace(Namechange, "NAME", "name") Set file = fso.OpenTextFile(file.Path, 2, True) file.Write Namechange file.Close Next End Sub 

如果您有任何困难,或想进一步解释上述,请告诉我。

一些小的变化,它为我工作。 请按以下代码更改path:

 Sub change_txt() Dim fso As Object Set fso = CreateObject("scripting.filesystemObject") Dim f Dim path As String Dim file_txt As String path = "D:\Folder\Fileshare\" file_txt = Dir(path & "*.*") Do While Len(file_txt) > 0 'Set objfile = FSO.CreateTextFile(path & file_txt) Set f = fso.opentextfile(path & file_txt, 1) While Not f.AtEndOfStream Namechange = f.ReadAll Wend Namechange = Replace(Namechange, "NAME", "name") Set f = fso.opentextfile(path & file_txt, 2) f.Write Namechange file_txt = Dir() Loop End Sub