Excel VBA найти / заменить текст в .txt файле - PullRequest
0 голосов
/ 25 февраля 2019

У меня почти нулевой опыт работы с VBA, поэтому терпите меня здесь.

Я пытаюсь создать макрос, который открывает текстовый файл и находит текст, расположенный в ячейке Excel А1, и заменяет его натекст в ячейке 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" дублируются и выводятся как таковые.Иногда больше символов дублируется в зависимости от размера файла.Как мне это исправить?

1 Ответ

0 голосов
/ 25 февраля 2019

Вероятно, это происходит, когда выходная строка короче входной.Вы открываете файл для чтения и записи, читаете текст (скажем, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...