http://okwave.jp/qa3914462.html

この状態のデータを、

こうしたい、という事ですね。
並べ替えるっていうよりは、一旦C列、D列に入っている情報をどこかに退避して、C列、D列とも消し、退避した情報を適当な位置に戻していく、っていうほうが分かりやすいかな?
退避する場所として、ワークエリアを使うことも可能ですが、どこが空いてるかわからないので、配列に退避することにします。
ということで

まず、C列、D列の値を配列に代入します。 C列が何行あるか調べて、配列を宣言し、値を代入してイミディエイトウィンドウに表示してみます。
Sub test()
Dim lastgyou As Integer
Dim i As Integer
'C列とD列を退避する配列を作成します
Dim taihiCretu() As String
Dim taihiDretu() As Integer
'C列の最終行の行番号を求めます
lastgyou = ActiveSheet.Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row
'C,Dを退避させる配列の要素数を確定します。
ReDim taihiCretu(lastgyou)
ReDim taihiDretu(lastgyou)
For i = 1 To lastgyou
'配列に値を代入します。
taihiCretu(i) = ActiveSheet.Cells(i, 3).Value
taihiDretu(i) = ActiveSheet.Cells(i, 4).Value
'とりあえず、イミディエイトウィンドウに表示します。
Debug.Print i; "行目は"; taihiCretu(i); "-"; taihiDretu(i)
Next i
End Sub
実行すると、

ん、いいんでないかい?(^^)
次は、C列、D列の値を全部消します。
特定の列の値をクリアする、というのはどうやるのかな?
「vba excel 列をクリア」で検索すると、こちらのページがみつかりました。
ActiveSheet.Range(“C:D”).Clear
でよさげですね。 以下のようにプログラムを修正します。
Sub test()
Dim lastgyou As Integer
Dim i As Integer
'C列とD列を退避する配列を作成します
Dim taihiCretu() As String
Dim taihiDretu() As Integer
'C列の最終行の行番号を求めます
lastgyou = ActiveSheet.Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row
'C,Dを退避させる配列の要素数を確定します。
ReDim taihiCretu(lastgyou)
ReDim taihiDretu(lastgyou)
For i = 1 To lastgyou
'配列に値を代入します。
taihiCretu(i) = ActiveSheet.Cells(i, 3).Value
taihiDretu(i) = ActiveSheet.Cells(i, 4).Value
'とりあえず、イミディエイトウィンドウに表示します。
Debug.Print i; "行目は"; taihiCretu(i); "-"; taihiDretu(i)
Next i
'C列、D列をクリアします。
ActiveSheet.Range("C:D").Clear
End Sub
このプログラムを実行すると、C列、D列がクリアされてしまうので、どこかにコピーを取っておいたほうがよいでしょう。
実行すると、

ん、消えました(^^)おっけいですね。
では、先に進む前に、コピーしておいた値でC列、D列を戻しておきます。
さて、この先ですが、
- 退避したC列の値を1つとってきて
- その値がA列に入っている行があるかどうか調べて、
- あれば、その行に退避した値を入れる
- なければ、下に列挙する
- その値がA列に入っている行があるかどうか調べて、
- この作業を最後の配列の要素まで繰り返す
って感じですね。
A列にあるかどうかを調べるには、A列が何行目までデータが入っているかを調べる必要があります。
また、「なければ下に列挙する」という処理ですが、
もしA列にデータがなければ、 最初は7行目、
次にないデータがあった場合は、8行目、
という形で、どこに列挙するのかを把握する必要があります。
というわけで、プログラムにしてみます。
Sub test()
Dim lastgyou As Integer
Dim i As Integer
Dim alastgyou As Integer
Dim j As Integer
Dim atta As Integer
Dim shitanukidasigyou As Integer
'C列とD列を退避する配列を作成します
Dim taihiCretu() As String
Dim taihiDretu() As Integer
'C列の最終行の行番号を求めます
lastgyou = ActiveSheet.Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row
'A列の最終行の行番号を求めます
alastgyou = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
'なかったデータを下に抜き出す場合、どこに抜き出すのかを shitanukidasigyou に入れておきます。
'最初は、A列の最終行の次の行になります。
shitanukidasigyou = alastgyou + 1
'C,Dを退避させる配列の要素数を確定します。
ReDim taihiCretu(lastgyou)
ReDim taihiDretu(lastgyou)
For i = 1 To lastgyou
'配列に値を代入します。
taihiCretu(i) = ActiveSheet.Cells(i, 3).Value
taihiDretu(i) = ActiveSheet.Cells(i, 4).Value
Next i
'C列、D列をクリアします。
ActiveSheet.Range("C:D").Clear
'退避した値を1つずつ見ていきます。
For i = 1 To lastgyou
'あったかどうかを判断する変数 atta を0にします。
atta = 0
'すべてのA列を見ていきます。
For j = 1 To alastgyou
'もし、A列の値と退避した値が一致した場合、
If ActiveSheet.Cells(j, 1).Value = taihiCretu(i) Then
'退避した値をC,D列に入れます。
ActiveSheet.Cells(j, 3).Value = taihiCretu(i)
ActiveSheet.Cells(j, 4).Value = taihiDretu(i)
'atta の変数に 1をいれます。
atta = 1
'以下の行は調べる必要がないので、Forループを抜けます。
Exit For
End If
Next j
'上のループを抜けた段階で、atta=0の場合、見つからなかったので、下に書き出します。
If atta = 0 Then
ActiveSheet.Cells(shitanukidasigyou, 3).Value = taihiCretu(i)
ActiveSheet.Cells(shitanukidasigyou, 4).Value = taihiDretu(i)
'下に書き出す行を下に1行下げます。
shitanukidasigyou = shitanukidasigyou + 1
End If
Next i
End Sub
(^^;)一気に長いですね。
alastgyouがA列の最後の行を調べています。
shitanukidasigyouが、なかったデータをどこの行に書き出すかを表しています。
For j=1 to alastgyou のループでA列に退避した値があるかどうかを調べ、あれば、セルに値を代入し、attaという変数を1にしてループを抜けます。
そのループの下で、attaの変数を調べ、なかった場合、下に書き出す、という形になっています。
実行してみると、

ん、おっけい(^^) ここに置いておきます→vbastudy_20.xls