Конкатенация значений 3 столбцов строка за строкой

#vba #excel

#vba #excel

Вопрос:

Я пытаюсь объединить значения столбцов (1, 2, 3). Результат должен быть в столбце (4). Существует n строк, для которых должна быть произведена конкатенация. С помощью кода, который я создал, обрабатывается каждая строка, но результат в каждой ячейке результата добавляется и дополняется. Что я сделал не так?

 Sub insertStatement()
Dim row As Integer
Dim lrow As Integer
Dim x As String
Dim cel As Range
Dim rng As Range

Sheets("INSERT").Select
row = 1
lrow = Cells(Rows.Count, 1).End(xlUp).row

Do While Cells(row, "A").Value <> ""
    With Worksheets("INSERT")
        Set rng = Range(.Cells(1, 1), .Cells(lrow, 3))
    End With

    x = ""

    For Each cel In rng

        x = x amp; cel.Value

    Next

    Sheets("Insert").Cells(row, 4).Value = x

row = row   1
Loop

End Sub
  

Комментарии:

1. Если вы поставите Debug.Print rng.Address перед x = "" , вы поймете почему.

Ответ №1:

Попробуйте ниже для достижения этой простой цели.

 Sub insertStatement()
    Const sFormulaR1C1 = "=CONCATENATE(RC[-3],RC[-2],RC[-1])"
    Dim lLastRow As Long

    With ThisWorkbook.Worksheets("INSERT")
        lLastRow = .Cells(Rows.Count, "A").End(xlUp).row
        .Range("D1:D" amp; lLastRow).FormulaR1C1 = sFormulaR1C1
    End With
End Sub
  

Комментарии:

1. Я никогда не думал о таком способе решения моей проблемы. Я должен изучить то, что вы предложили, но самое главное, это работает!

2. Приятно слышать, что вы это изучите, это сочетает в себе встроенную в Excel функцию =concatenate(text1, text2 и т.д.) и использование VBA для заполнения формул за один раз (с относительной формулой).

Ответ №2:

В строке, где вы устанавливаете свой диапазон…

 Set rng = Range(.Cells(1, 1), .Cells(lrow, 3))
  

…вы каждый раз используете строку 1, столбец 1 в качестве начальной точки. Хотелось бы предложить следующее…

 Set rng = Range(.Cells(row, 1), .Cells(lrow, 3))
  

Комментарии:

1. Спасибо. Я протестировал код, и теперь он конкатенирует последнюю строку и использует это значение для каждой строки?

2. Когда я использую row вместо lrow в первом диапазоне ячеек, это работает. Спасибо!

3. Я вижу — это имеет смысл — спасибо за корректировку — редактирование ответа.