VBAはあまり詳しくないのでしたね、言葉足らずの回答で申し訳ありませんでした。
Sub TestB()
'E列
Const EColumn As Long = 5
'L列
Const LColumn As Long = 12
'P列
Const PColumn As Long = 16
'H列
Const HColumn As Long = 8
Dim Rng As Range
Dim Movedat() As String
Dim counter As Integer
Dim Wcounter As Integer
Dim i As Long
Dim j As Long
'A列の1行目からP列のデータのある最終行までを取得する。
Set Rng = Range(Cells(1, 1), Range("$P$65536").End(xlUp))
'配列の初期化
ReDim Movedat(0)
counter = -1
Wcounter = -1
For i = 1 To Rng.Rows.Count
'E列~L列のどれかひとつにデータがあるかを判別
If Rng.Cells(i, HColumn) <> vbNullString And _
Rng.Cells(i, HColumn) <> 0 Then
'P列にデータがある場合は移動しない
If Rng.Cells(i, PColumn) = vbNullString Or _
Rng.Cells(i, PColumn) = 0 Then
counter = counter + 1
ReDim Preserve Movedat(counter)
'カンマ区切りで格納
For j = EColumn To LColumn
Movedat(counter) = Movedat(counter) & Rng.Cells(i, j)
If j <> LColumn Then
Movedat(counter) = Movedat(counter) & ","
End If
'セルクリア
Rng.Cells(i, j) = vbNullString
Next j
End If
ElseIf counter <> Wcounter Then
'P列にデータがある場合は書き出す
If Rng.Cells(i, PColumn) = vbNullString Or _
Rng.Cells(i, PColumn) = 0 Then
Else
Wcounter = Wcounter + 1
Dim field() As String
field = Split(Movedat(Wcounter), ",")
For j = EColumn To LColumn
Rng.Cells(i, j) = field(j - EColumn)
Next j
End If
End If
Next i
End Sub
お礼
AKARI0418様 VBAに関してはド素人なんです。 簡単なものは見様見真似で頑張ってます・・・。 早速試させていただきました。 【完璧】です!! 長々とお付き合いいただきましてありがとうございました! すごいです! 私も少しずつ勉強していつかは自在に組めるように頑張りたいと思います。