[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロで縦のデータを横に』(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列を、並べ替えシートの「新たな行」のC、D列に転記
3)退所なら、「2)と同じ行」のE列に転記
並べ替えシートのどの行に転記するかは、変数j ですよね。
並べ替えシートを見ながらスッテプ実行(F8)すると
どこがおかしいかわかります。
(マナ) 2017/06/18(日) 07:43
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
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
・日付が西暦/月/日になってしまう
・コードが上書き(?)されてしまう
=> 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
> 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.