我有一个包含文本文件的文件夹。案文如下:
NAME Number Mail Date
xx 1 zz //
我想编写一个vba代码来读取所有文本文件并搜索信息" NAME"用" name"替换它,然后保存修改。
我做了下面的代码,但我在error 70 permission denied
中有Set 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
答案 0 :(得分:1)
我会使用更多FileSystemObject
功能重写,而不是亲自使用Dir()
,但这是您自己选择的。我认为您遇到的关键问题是您已打开文件进行读取,然后在TextStream
对象仍在内存中并锁定文件时立即尝试打开它进行写入。这就是为什么你得到“权限被拒绝”。引用TechNet Article:
打开文本文件
使用文本文件分为三个步骤。 在您可以执行任何其他操作之前,您必须打开文本文件。这个可以 可以通过打开现有文件或创建新文本来完成 文件。 (当您创建新文件时,该文件会自动打开 并准备好使用。)任何一种方法都会返回一个引用 TextStream对象。在您引用TextStream之后 对象,您可以读取或写入文件。但是,你 不能同时读取和写入同一个文件。其他 单词,你不能打开文件,读取内容,然后写 文件的附加数据,全部在同一操作中。相反,你 必须读取内容,关闭文件,然后重新打开并写入 其他数据。当您打开现有文本文件时,该文件可以是 开放阅读或写作。创建新文本时 文件,该文件仅供写入,如果没有其他原因 没有内容可读。最后,你应该总是关闭一个 文本文件。虽然这不是必需的(文件通常是 一旦脚本终止就关闭),这是很好的编程 实践。
我的代码应该符合您的要求。我已从中间删除了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
如果您有任何困难或希望进一步解释上述内容,请与我联系。
答案 1 :(得分:0)
一些小的改变,它对我有用。请在以下代码中根据您自己的要求更改路径:
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