我在VBA方面的经验几乎为零,所以请在这里忍受。
我正在尝试创建一个宏,该宏打开文本文件并在Excel的单元格A1中找到该文本,并将其替换为单元格B1中的文本。然后,它应该找到位于单元格A2中的文本,并将其替换为单元格B2,依此类推,直到A列中最后一个包含数据的单元格。
现在,我搜索了一下,偶然发现了这个工作代码:
Sub Replace_Text()
Dim strFile As String
Dim i As Integer
Dim strText As String
Dim cell As Range
With Application.FileDialog(msoFileDialogFilePicker)
.InitialFileName = ThisWorkbook.Path
If .Show <> -1 Then Exit Sub
strFile = .SelectedItems(1)
End With
i = FreeFile
strText = Space(FileLen(strFile))
With CreateObject("vbscript.regexp")
.Global = True
Open strFile For Binary Access Read Write As #i
Get #i, , strText
For Each cell In Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
.Pattern = Replace(Replace(Replace(Replace(cell.Value, "?", "\?"), "*", "\*"), "+", "\+"), ".", "\.")
strText = .Replace(strText, cell.Offset(, 1).Value)
Next cell
Put #i, 1, strText
Close #i
End With
End Sub
除1个小问题外,它的工作与预期完全相同。似乎复制了文本文件中的最后几个字符,并将其追加到最后一个字符之后,进行了一些重复。
示例:
Column A | Column B
<Var1> | Patrick
<Var2> | ghosts
运行代码之前:
This is <Var1>.
There are <Var2>.
Some random text
运行代码后:
This is Patrick.
There are ghosts.
Some random textom text
最后几个字符“ om text”被复制并按原样输出。有时,根据文件大小,可能会复制更多字符。我该如何解决?
答案 0 :(得分:2)
当输出字符串短于输入字符串时,可能会发生这种情况。您正在打开文件以进行读写,读取文本(假设为100字节),进行替换(假设为90字节)。然后,在开始处写入90个字节。文件中剩余的10个字节保持不变。
您应该首先打开文件以进行读取(然后将其关闭),然后再打开以将文本写入其中-打开文件for Output
Open strFile For Binary Access Read Write As #i
Get #i, , strText
Close #i
For Each cell In Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
...
Next cell
Open strFile For Output As #i
Write #i, strText
Close #i