http://okwave.jp/qa3914462.html

 224-01.jpg

この状態のデータを、

 224-02.jpg

こうしたい、という事ですね。

 並べ替えるっていうよりは、一旦C列、D列に入っている情報をどこかに退避して、C列、D列とも消し、退避した情報を適当な位置に戻していく、っていうほうが分かりやすいかな?

退避する場所として、ワークエリアを使うことも可能ですが、どこが空いてるかわからないので、配列に退避することにします。

ということで

 224-01.jpg

まず、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

実行すると、

 224-03.jpg

ん、いいんでないかい?(^^)

次は、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列がクリアされてしまうので、どこかにコピーを取っておいたほうがよいでしょう。

実行すると、

 224-04.jpg

 ん、消えました(^^)おっけいですね。

では、先に進む前に、コピーしておいた値でC列、D列を戻しておきます。

 さて、この先ですが、

  • 退避したC列の値を1つとってきて
    • その値が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の変数を調べ、なかった場合、下に書き出す、という形になっています。

 実行してみると、

 224-05.jpg

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

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 simple blog いろいろ勉強中 Suffusion theme by Sayontan Sinha