[[20170617180759]] 『マクロで縦のデータを横に』(koko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで縦のデータを横に』(koko)

宜しくお願いします。

「入所退所データ」シートの
D列に入所者コードが入力
E列に”入所”又は”退所”のどちらかが入力
I列に日付
このようなデータが約7000行ほどあります。

D     E     I      
105   入所   h20/2/1    
105   退所   h21/1/5    
105   入所   h21/5/1    
177   入所   h18/5/10   
177   退所   h19/2/10    
280   入所   h25/5/15    

これをSheet2に

C      D        E
コード   入所日     退所日    
105    h20/2/1     h21/1/5 
105    h21/5/1          
177    h18/5/10   h19/2/10
280    h25/5/15 

このような形に並べ替えをしたいのですが、
どうにもややこしくて、手におえません。
どうか宜しくお願い致します。

< 使用 Excel:Excel2007、使用 OS:WindowsVista >


こんな感じで考えるとできそうに思えませんか。

1)E列を上から順にみていき
2)入所なら、D、I列を、シート2のC、D列に転記
3)退所なら、2)の行のE列に転記
4)これを繰り返す

(マナ) 2017/06/17(土) 19:28


マナ様

私が書くとこうなってしまうのです。
どこを変えればいいのか困っています。

コード   入所日     退所日
105    h20/2/1
105             h21/1/5 
105    h21/5/1          
177    h18/5/10 
177            h19/2/10
280    h25/5/1

下記のコードです
Sub test()

 Dim maxrow  As Long
 Dim mysh As Worksheet
 Dim mysh2 As Worksheet
 Dim i As Long
 Dim j As Long

 Set mysh = Worksheets("入所退所")
 Set mysh2 = Worksheets("並べ替え")

   maxrow = mysh.Cells(Rows.Count, 4).End(xlUp).Row

   j = 2

   For i = 2 To maxrow
          mysh2.Range("c" & j).Value = mysh.Range("d" & i).Value

        If mysh.Range("e" & i).Value = "入所" Then
            mysh2.Range("d" & j).Value = mysh.Range("i" & i).Value
        ElseIf mysh.Range("e" & i).Value = "退所" Then
            mysh2.Range("e" & j).Value = mysh.Range("i" & i).Value
        Else
        End If
     j = j + 1

   Next

End Sub

(koko) 2017/06/18(日) 00:57


>2)入所なら、D、I列を、シート2のC、D列に転記
>3)退所なら、2)の行のE列に転記

ここを言い換えると

2)入所なら、D、I列を、並べ替えシートの「新たな行」のC、D列に転記
3)退所なら、「2)と同じ行」のE列に転記

並べ替えシートのどの行に転記するかは、変数j ですよね。

並べ替えシートを見ながらスッテプ実行(F8)すると
どこがおかしいかわかります。

(マナ) 2017/06/18(日) 07:43


マナ様
ヒント有難うございます
下記のようにかえてみました。.例題の少ないデータならOKなのですが
実際の7000行のデータだとC列のコードとD列、E列がずれて転記されてしまいます。
明日までにこのデータが必要なので、今回は手動と関数でどうにかしてみます
有難うございました。

Sub test()

 Dim maxrow  As Long
 Dim mysh As Worksheet
 Dim mysh2 As Worksheet
 Dim i As Long
 Dim j As Long

 Set mysh = Worksheets("入所退所")
 Set mysh2 = Worksheets("並べ替え")

   maxrow = mysh.Cells(Rows.Count, 4).End(xlUp).Row

   j = 2

   For i = 2 To maxrow

           If mysh.Range("e" & i).Value = "入所" Then
                j = mysh2.Cells(Rows.Count, 4).End(xlUp).Row + 1
                mysh2.Range("c" & j).Value = mysh.Range("d" & i).Value
                mysh2.Range("d" & j).Value = mysh.Range("i" & i).Value

           ElseIf mysh.Range("e" & i).Value = "退所" Then
                j = mysh2.Cells(Rows.Count, 4).End(xlUp).Row
               mysh2.Range("e" & j).Value = mysh.Range("i" & i).Value
           Else

           End If

   Next

End Sub

(koko) 2017/06/18(日) 09:23


>下記のようにかえてみました。.例題の少ないデータならOKなのですが
>実際の7000行のデータだとC列のコードとD列、E列がずれて転記されてしまいます

D列、I列はソートされている必要があります。

(マナ) 2017/06/18(日) 10:30


 簡単に書いたつもりだけど、Step Debug してもわからないところがあったら質問を

 Sub test()
    Dim mysh As Worksheet, mysh2 As Worksheet, r As Range, n As Long
    Set mysh = Worksheets("入所退所")
    Set mysh2 = Worksheets("並べ替え")
    n = 1
    With mysh
        For Each r In .Range("d2", .Range("d" & Rows.Count).End(xlUp))
            If r.Offset(, 1).Value = "入所" Then
                n = n + 1
                mysh2.Range("c" & n).Value = r.Value
                mysh2.Range("d" & n).Value = r.Offset(, 5).Value
            Else
                mysh2.Range("e" & n).Value = r.Offset(, 5).Value
            End If
        Next
    End With
End Sub
(seiya) 2017/06/18(日) 13:56

seiya さんへ

・日付が西暦/月/日になってしまう
・コードが上書き(?)されてしまう
=> 105    h20/2/1     h21/1/5 のデータが105 h20/2/1 はなくなり、
h21/1/5 が1行目の”退所日”を上書きして居座っている

といった感じでした。

>Worksheets("入所退所")
には項目行がないからでしょうか?
D列の最初をD1としたらいけました。

日付については、kokoさんがどうしたいのか?で決まるのかも知れませんが。

 
(じゅんじゅん) 2017/06/18(日) 16:08


 日付の問題は単にセルの書式の問題だと思います。

 kokoさんのコードでは両シート共にヘッダーがあると思います。
 データのレイアウトが提示されているものであれば、提示された結果の通りになるはずですが?
(seiya) 2017/06/18(日) 16:43

seiyaさんへ

> kokoさんのコードでは両シート共にヘッダーがあると思います。

私もそう思うのですが、最初の質問文をコピペしたからでしょうね。
kokoさんのコードも2行目からになってますし、私の早とちりかもしれません。

日付についても、元々列で書式設定されているなら心配ないのかな?

お手数おかけ致しました。

(じゅんじゅん) 2017/06/18(日) 18:18


皆様 有難うございます

並べ替えはほぼ終わりました。
データがずれる原因ですが、
元データの方に原因がありました。
元データは個人別の日付順に並んでいるのですが、
入所、退所、入所、退所・・・と並ばないといけないのですが
一部の人のデータが入所、入所になっていたりする入力ミスがあり
それが並べ替えがうまくいかない原因でした。
入力ミスの有る人を消去して並べ替え実行してみたら
うまくいきました。

seiyaさんのコードは無駄がなく処理が早そうですね。
使わせていただきます。有難うございました。

(koko) 2017/06/18(日) 20:17


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.