Для простого VBA выполните цикл по ячейкам, проверьте, не заполнено ли оно, и переместите значение.
For Each c In Range("AD2:AE42")
If Not c.Value = "" Then Range("AC" & Cells(Rows.Count, 29).End(xlUp).Offset(1, 0).Row).Value = c.Value
Next c
Это будет происходить слева направо.
Для цикла по каждому столбцу, вы можете сделать что-то вроде:
For i = 30 To 31
For Each c In Range(Cells(2, i), Cells(42, i))
If Not c.Value = "" Then Range("AC" & Cells(Rows.Count, 29).End(xlUp).Offset(1, 0).Row).Value = c.Value
Next c
Next i
edit Для использования на другом рабочем листе:
Dim ws As Worksheet, c As Range
Set ws = Worksheets("Data")
For Each c In ws.Range("AD2:AE42")
If Not c.Value = "" Then ws.Range("AC" & ws.Cells(Rows.Count, 29).End(xlUp).Offset(1, 0).Row).Value = c.Value
Next c
или
Dim ws As Worksheet, i As Long, c As Range
Set ws = Worksheets("Data")
For i = 30 To 31
For Each c In Range(ws.Cells(2, i), ws.Cells(42, i))
If Not c.Value = "" Then ws.Range("AC" & ws.Cells(Rows.Count, 29).End(xlUp).Offset(1, 0).Row).Value = c.Value
Next c
Next i