Ele retorna erro porque val1 é definido como longo e o valor da célula é uma string. Removi os caracteres & da parte dim . A parte de mesclagem também é atualizada.
Sub TestCustomMerge()
Dim row2, row4, val1, val2, val3
Application.DisplayAlerts = False
row2 = 2
row4 = 4
val1 = Cells(row2, 1).Value
val2 = Cells(row2, 2).Value
Range(Cells(row2, 1), Cells(row4 - row2, 1)).Merge
Cells(row2, 1).Value = val1
Range(Cells(row2, 2), Cells(row4 - row2, 2)).Merge
Cells(row2, 2).Value = val2
Application.DisplayAlerts = True
End Sub