Попробуйте что-то вроде этого:
Sub sample()
Dim bufF As String, bufT As String, NO As String, name As String, day As String, Min As String, Min2 As String
Dim i As Long, j As Single, LastR1 As Long, LastR2 As Long
Dim ws1 As Worksheet, ws2 As Worksheet
Dim x() As String, y() As String, cnt As Long
Set ws1 = Sheets("data") '<--change the sheet name
Set ws2 = Sheets("result") '<--change the sheet name
With ws1
LastR1 = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastR1
NO = .Cells(i, 1).Value
name = .Cells(i, 2).Value
bufF = InStr(Format(.Cells(i, 4).Value, "ddmmyyyy hh:mm"), " ")
bufF = Mid(Format(.Cells(i, 4).Value, "ddmmyyyy hh:mm"), bufF + 1, 2)
bufT = InStr(Format(.Cells(i, 5).Value, "ddmmyyyy hh:mm"), " ")
bufT = Mid(Format(.Cells(i, 5).Value, "ddmmyyyy hh:mm"), bufT + 1, 2)
Min = InStr(Format(.Cells(i, 4).Value, "ddmmyyyy hh:mm"), ":")
Min = Mid(Format(.Cells(i, 4).Value, "ddmmyyyy hh:mm"), Min + 1, 2)
Min2 = InStr(Format(.Cells(i, 5).Value, "ddmmyyyy hh:mm"), ":")
Min2 = Mid(Format(.Cells(i, 5).Value, "ddmmyyyy hh:mm"), Min2 + 1, 2)
day = Format(.Cells(i, 4).Value, "dd-mm-yyyy ")
If bufT = "00" Then bufT = 24
With ws2
LastR2 = .Cells(Rows.Count, 1).End(xlUp).Row
ReDim x(bufT * 2 - bufF * 2)
ReDim y(bufT * 2 - bufF * 2)
If Min = "30" Then bufF = bufF + 0.5
If Min2 = "30" Then bufT = bufT + 0.5
For j = bufF * 1 To bufT * 1 - 0.5 Step 0.5
If j = Int(j) Then
x(cnt) = day & j & ":00"
y(cnt) = NO & "-" & j
cnt = cnt + 1
Else
x(cnt) = day & Int(j) & ":30"
y(cnt) = NO & "-" & j
cnt = cnt + 1
End If
Next j
.Range(.Cells(LastR2 + 1, 1), .Cells(LastR2 + cnt, 1)).Value = WorksheetFunction.Transpose(y)
.Range(.Cells(LastR2 + 1, 3), .Cells(LastR2 + cnt, 3)).Value = WorksheetFunction.Transpose(x)
.Range(.Cells(LastR2 + 1, 2), .Cells(LastR2 + cnt, 2)).Value = name
End With
cnt = 0
Next
End With
End Sub