Merge 3 cells in 1 with VBA The below code is working uses formula to concatenate the result from Range("K:M") and write the result in column H. 

Is there a better way to write the below code that can concatenate the result to the exact location as per below table? Please note that data in the before table is discontinued but sometimes will be from row 4 to 1000 rows down or the below example.

Sub GenerateStyleFabricColourV4()
    Dim srcData As Range
    Dim rowNum As Long, lastRow As Long

    With Worksheets(2)
        lastRow = Application.Max(4, _
                    .Cells(.Rows.Count, "K").End(xlUp).Row, _
                    .Cells(.Rows.Count, "L").End(xlUp).Row, _
                    .Cells(.Rows.Count, "M").End(xlUp).Row)
        With .Cells(4, "H").Resize(lastRow - 4 + 1, 1)
            .FormulaR1C1 = "=rc[3]&amp;rc[4]&amp;rc[5]"
            .Value = .Value2
        End With
    End With
End Sub


Sub ClearAllData()

Rows("4:" &amp; Rows.Count).ClearContents

End Sub
To answer another question I provided some helpful information about optimization in vba here, VBA syntax that compiles sub data into master sheet.
This maybe help you to skip the blank rows (You did not clarify your question but based on the data you provided I think that would be your problem) and find the actual last row used. It is in reference to this post. Here's the code:
Dim srcData As Range, rng As Range
Dim rowNum As Long, lastRow As Long
Dim wsh As Worksheet

Sub GSFC_V4()
 Set wsh = Worksheets(2)
 
 wsh.Activate
 Set srcData = Range(&quot;K:M&quot;)
 Set rng = Range(&quot;K4&quot;)


 With wsh 
  If Application.WorksheetFunction.CountA(.Cells) &lt;&gt; 0 Then
     lastrow = srcData.Find(What:=&quot;*&quot;, _
                  After:=rng, _
                  Lookat:=xlPart, _
                  LookIn:=xlFormulas, _
                  SearchOrder:=xlByRows, _
                  SearchDirection:=xlPrevious, _
                  MatchCase:=False).Row
 Else
     lastrow = 1  
 End If


     With .Cells(4, &quot;H&quot;).Resize(lastRow - 4 + 1, 1)
         .FormulaR1C1 = &quot;=rc[3]&amp;rc[4]&amp;rc[5]&quot;
         .Value = .Value2
     End With
 End With

End Sub

This is what I am using to optimize my macros. I call OptimizeVBA True at the beginning of each macro and at the end call OptimizeVBA False to set everything back to default. It increases the performance remarkably.
Sub OptimizeVBA(isOn As Boolean)

  Application.Calculation = IIf(isOn, xlCalculationManual, xlCalculationAutomatic)
  Application.EnableEvents = Not (isOn)
  Application.ScreenUpdating = Not (isOn)
  Application.StatusBar = Not (isOn)

End Sub

You need to be careful of how you refer to ranges to avoid getting errors.