В настоящее время у меня есть шаблон, который находится в диапазоне, который называется rngP1.

И это содержит текст ниже:

«Это подтверждает, что strTitle был введен в действие strDate для strCompany ».

По сути, у меня есть данные на другом листе, которые будут использоваться для замены этих трех строк из моего шаблона:

enter image description here

Я бы хотел, чтобы в каждой строке данных он выполнял поиск в строках strTitle , strDate и strCompany и заменял их в соответствии с данные каждой строки.

У меня уже есть код, но он работает не так, как я ожидал:

Sub example()
    Dim wsMain As Worksheet
    Set wsMain = Sheets("Main")
    Dim wsTemplate As Worksheet
    Set wsTemplate = Sheets("Template")
    Dim textToReplace As Variant
    Dim array_example()
    Dim Find_Text As Variant
    Dim str As String

    last_row = wsMain.Range("A1").End(xlDown).Row 'Last row of the data set

    ReDim array_example(last_row - 1, 2)

    Find_Text = Array("strTitle", "strDate", "strCompany")
    str = wsTemplate.Range("rngP1").Value
    'Storing values in the array
    For i = 0 To last_row - 1   
        array_example(i, 0) = wsMain.Range("A" & i + 2)
        array_example(i, 1) = wsMain.Range("C" & i + 2)
        array_example(i, 2) = wsMain.Range("D" & i + 2)    
    Next

    For i = LBound(array_example, 1) To UBound(array_example, 1)
        For j = LBound(array_example, 2) To UBound(array_example, 2)
            For a = 0 To UBound(Find_Text)       
                str = Replace(str, Find_Text(a), array_example(i, j))   
            Next a
        Next j

        MsgBox str
    Next i  
End Sub

Неправильный вывод:

enter image description here

Должен быть:

Это подтверждает, что Title1 был принят 13 октября 18 для компании X.

И следующей будет следующая строка, которая будет title 2. И так далее и так далее.

Если у вас есть альтернативный способ сделать это, я ценю это.

1
Sevpoint 22 Ноя 2018 в 10:33

1 ответ

Лучший ответ

Вот рабочий пример:

  1. Вы можете переместить диапазон данных из рабочего листа в массив с одной строкой без зацикливания

    DataArr = wsMain.Range("A2:D" & LastRow).Value
    
  2. Для замены понадобится всего 2 петли:

    • один для циклического перебора строк данных
    • один для перебора переменных для замены
  3. Ваш шаблон str не был инициализирован в цикле, но вам нужен новый шаблон для каждой строки данных.

Обратите внимание, что массив, загруженный из диапазона, начинает отсчет с 1, но массив переменных начинает отсчет с 0.

Option Explicit

Sub Example()
    Dim Template As String
    Template = "This is to confirm that strTitle has been enacted on strDate for strCompany."
    'load your template string from worksheet here!

    Dim Variables As Variant 'variables to be replaced
    Variables = Array("strTitle", "strDate", "strCompany")

    Dim wsMain As Worksheet
    Set wsMain = ThisWorkbook.Worksheets("Main")

    Dim LastRow As Long 'this method is more reliable to find the last used row
    LastRow = wsMain.Cells(wsMain.Rows.Count, "A").End(xlUp).Row

    Dim DataArr As Variant 'load the complete data range into an array
    DataArr = wsMain.Range("A2:D" & LastRow).Value

    Dim Output As String

    Dim iRow As Long, iVar As Long
    For iRow = LBound(DataArr, 1) To UBound(DataArr, 1) '1 to LastRow
        Output = Template 'initialize with the template!

        For iVar = LBound(Variables) To UBound(Variables) ' 0 to 2
            Output = Replace(Output, Variables(iVar), DataArr(iRow, iVar + 1))
        Next iVar

        Debug.Print Output
    Next iRow
End Sub
3
Pᴇʜ 22 Ноя 2018 в 08:11