I have an Excel VBA script that concatenates five values: three static text strings, and values contained in two dynamic user-input ranges. One of the ranges contains values that need to be concatenated repeatedly in the output, top to bottom, over and over, until the end of the data in the other range is reached.
So, given sample values:
TextA: Alpha
TextB: Gamma
TextC: Delta
LoopRange:
AAA
BBB
CCC
UserRange:
111
222
333
444
555
666
777
888
The output should be:
AlphaAAAGamma111Delta
AlphaBBBGamma222Delta
AlphaCCCGamma333Delta
AlphaAAAGamma444Delta
AlphaBBBGamma555Delta
AlphaCCCGamma666Delta
AlphaAAAGamma777Delta
AlphaBBBGamma888Delta
The script I've written works, but in a rather janky way. It builds the output in stages — creating a new column of data, combining it with existing values, combining those results with remaining values until the output is achieved, then deleting the leftovers.
The enhancement I'm looking for is how to avoid the piecemeal process currently in place. I'm thinking there's a way to nest the Loop
inside a For
statement but I haven't been able to figure it out.
Sub LoopAndConcat()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim TextA As String
Dim TextB As String
Dim TextC As String
Dim LoopRange As Range
Dim CellA As Long
Dim CopyRange As Range
Dim CellB As Range
Dim LastRow As Long
Dim CellC As Long
TextA = ActiveSheet.Cells(3, "A").Value
TextB = ActiveSheet.Cells(6, "A").Value
TextC = ActiveSheet.Cells(9, "A").Value
Set LoopRange = Range(ActiveSheet.Cells(12, "A"), ActiveSheet.Cells(Rows.Count, "A").End(xlUp))
Do
CellA = CellA + 1
LoopRange.Copy Range("E" & Rows.Count).End(xlUp)(2)
Loop Until CellA = 10
Set CopyRange = Range(ActiveSheet.Cells(2, "E"), ActiveSheet.Cells(Rows.Count, "E").End(xlUp))
For Each CellB In CopyRange
If Not CellB.Offset(0, -3).Value = "" Then
CellB.Offset(0, -2).Value = TextA & CellB.Value & TextB
End If
Next CellB
LastRow = Range("B" & Rows.Count).End(xlUp).Row
For CellC = 2 To LastRow
ActiveSheet.Cells(CellC, "C").Value = ActiveSheet.Cells(CellC, "C").Value & _
ActiveSheet.Cells(CellC, "B").Value & _
TextC
Next CellC
CopyRange.ClearContents
Application.ScreenUpdating = True
Application.DisplayAlerts = True
If Not LoopRange Is Nothing Then Set LoopRange = Nothing
If Not CopyRange Is Nothing Then Set CopyRange = Nothing
End Sub