Передача многострочной строки из Excel в Word - PullRequest
0 голосов
/ 12 марта 2019

В настоящее время я пытаюсь передать многострочную строку из Excel в документ Word. Сначала я создаю строку, используя данные ячейки, а затем пытаюсь передать ее в Word методом поиска и замены. Код находит слово в Word (где его заменить), но заменяет его пустой строкой. Пара вещей из этого; во-первых, я Debug.Print строка, когда происходит замена, и строка заполняется в непосредственном окне. Во-вторых, когда я заменяю слово простой строкой, оно заменяет его в порядке, что приводит меня к мысли, что, похоже, существует проблема с многострочной строкой, которую я пытаюсь отправить в Word. Ниже приведен мой код и все остальное, что может иметь отношение к делу.

Ниже приведен цикл For Each, который циклически проходит по каждому листу и создает соответствующую строку для этого листа. randNo представляет случайный номер строки (так как строка должна содержать случайные данные). Но это не имеет отношения к проблеме.

'open the word file
Set objWord = CreateObject("Word.Application")

objWord.Documents.Open strPath & fileOpen, ReadOnly:=False
objWord.Visible = True

For Each ws In Worksheets
    lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

    'check if enough rows
    If lRow < 11 Then
        myLimit = (lRow - 1)
    Else
        myLimit = 10
    End If
    'cycle through and concatenate string
    For i = 1 To myLimit
        randNo = Int((lRow - 2 + 1) * Rnd + 2)

        dateStr = ws.Range("A" & randNo).Text
        timeStr = ws.Range("B" & randNo).Text

        conditionString = conditionString & vbNewLine & dateStr & " " & timeStr & " " & GetAllConditions(dateStr, timeStr)
    Next i
    'activate word - ready for search and replace        
    objWord.Activate

    textToFind = "RS" & myCntr

    finalStr = textToFind & conditionString

    With objWord.ActiveDocument.Content.Find
        .Text = textToFind
        .Replacement.Text = finalStr
        Debug.Print finalStr
        .Execute Replace:=wdReplaceAll
    End With

    ThisWorkbook.Activate

    myCntr = myCntr + 1
    conditionString = ""
Next ws

Ниже приведен пример распечатки finalStr из окна Immediate в VBE:

RS7
25/09/2018 08:00:00 C2, C5, C6, C7, C8, C9, C10, 
06/08/2018 08:00:00 C4, C6, C7, 
25/01/2019 14:30:00 C1, C2, C5, C6, C7, C8, C11, 
05/11/2018 08:00:00 C6, C7, 
31/12/2018 20:30:00 C1, C2, C6, C7, C8, C10, C11, 
30/11/2018 08:00:00 C2, C6, C7, C8, 
25/09/2018 08:00:00 C2, C5, C6, C7, C8, C9, C10, 
11/02/2019 14:30:00 C1, C4, C6, C7, C8, 
01/10/2018 14:30:00 C1, C2, C5, C6, C7, C8, C9, C11, 
11/09/2018 14:30:00 C1, C2, C3, C4, C6, C7, C8, C9, C10, C11, 

Опять же, он находит переменную textToFind в порядке, но просто заменяет ее пустой строкой вместо обязательной (указанной выше) строки.

Я не уверен относительно причины этого или того, что я упускаю или не понимаю (поскольку я, должно быть, здесь идиот!), Поэтому любая помощь будет принята с благодарностью!

Спасибо

1 Ответ

1 голос
/ 12 марта 2019

Максимальное количество символов в Find & Replace составляет 255, и вы можете обойти его с помощью функции Replace с помощью буфера обмена.Это работает только для замены текста.Элемент управления «^ c» не работает в функции «Найти текст».

Добавьте в свой код следующее:

Dim DataObj As New MSForms.DataObject
'Put string variable content on the clipboard
DataObj.SetText finalStr
DataObj.PutInClipboard
With objWord.ActiveDocument.Content.Find
    .Text = textToFind
    .Replacement.Text = "^c"
    .Execute Replace:=wdReplaceAll
End With

'clear the clipboard
DataObj.SetText " "
DataObj.PutInClipboard
...