[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『並び替えについて』(sarara)
並び替えについて教えてください。
SHeet1に下記のような一覧表があります。
番号 氏名1 氏名2 氏名3 出張名 旅費 旅費 旅費
1 山本 田中 清水 視察 10,000 10,000 10,000
2 安部 空白 空白 研修 5,000 0 0
3 中村 福島 空白 会議 3,000 3,000 0
・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・
氏名が3列に渡っているのを、Sheet2へ下記のように氏名を1列にまとめたいと考えています。
空白のセルは詰めて、まとめたいのですが、自動記録やVBAで一発で並び替える方法はありますか?
番号 氏名 出張名 旅費
1 山本 視察 10,000
1 田中 視察 10,000
1 清水 視察 10,000
2 安部 研修 5,000
3 中村 会議 3,000
3 福島 会議 3,000
・ ・ ・ ・
・ ・ ・ ・
< 使用 Excel:Excel2007、使用 OS:Windows7 >
単純にループ! Sub aaa() Dim a Dim ans Dim i As Long Dim j As Long Dim n As Long n = 2 a = Range("A1").CurrentRegion.Value ReDim ans(1 To UBound(a, 1) * 3, 1 To 4) ans(1, 1) = a(1, 1) ans(1, 2) = Left(a(1, 2), 2) ans(1, 3) = a(1, 5) ans(1, 4) = a(1, 6) For i = 2 To UBound(a, 1) For j = 2 To 4 If a(i, j) <> "" Then ans(n, 1) = a(i, 1) ans(n, 2) = a(i, j) ans(n, 3) = a(i, 5) ans(n, 4) = a(i, j + 4) n = n + 1 Else Exit For End If Next j Next i With Sheets.Add .Range("A1").Resize(UBound(ans, 1), 4).Value = ans End With End Sub
(稲葉) 2015/01/14(水) 15:50
ありがとうございました!
うまく並び替え出来ました^^
(sarara) 2015/01/14(水) 22:40
番号 月日 氏名1 氏名2 氏名3 出張名 旅費 旅費 旅費
1 4/1 山本 田中 清水 視察 10,000 10,000 10,000
2 5/1 安部 空白 空白 研修 5,000 0 0
3 6/1 中村 福島 空白 会議 3,000 3,000 0
↓
番号 月日 氏名 出張名 旅費
1 4/1 山本 視察 10,000
1 4/1 田中 視察 10,000
1 4/1 清水 視察 10,000
2 5/1 安部 研修 5,000
3 6/1 中村 会議 3,000
3 6/1 福島 会議 3,000
(sarara) 2015/01/14(水) 23:10
簡単なループ処理です まずご自身で書き換えてみてください そうすれば仕様変更にも自分で対応できるようになりますよ! 解らなければ、なにをどうしたけど、求める結果を得られなかったなど し質問していただければ、お答えいたします (稲葉) 2015/01/15(木) 07:10
(sarara) 2015/01/15(木) 13:40
Range("A1").CurrentRegion.Value A1を選択して、Ctrl+Shift+: を押したときの動作です。 iは行のループ jは列のループを表しています。
Sub aaa() Dim a Dim ans Dim i As Long Dim j As Long Dim n As Long n = 2 a = Range("A1").CurrentRegion.Value ReDim ans(1 To UBound(a, 1) * 3, 1 To 5) ans(1, 1) = a(1, 1) ans(1, 2) = a(1, 2) ans(1, 3) = Left(a(1, 3), 2) ans(1, 4) = a(1, 6) ans(1, 5) = a(1, 7) For i = 2 To UBound(a, 1) For j = 3 To 5 If a(i, j) <> "" Then ans(n, 1) = a(i, 1) ans(n, 2) = a(i, 2) ans(n, 3) = a(i, j) ans(n, 4) = a(i, 6) ans(n, 5) = a(i, j + 4) n = n + 1 Else Exit For End If Next j Next i With Sheets.Add .Range("A1").Resize(UBound(ans, 1), 5).Value = ans End With End Sub
(稲葉) 2015/01/15(木) 14:06
番号 月日 氏名1 氏名2 氏名3 用務先 出張名 旅費 旅費 旅費
1 4/1 山本 田中 清水 東京 視察 10,000 10,000 10,000
2 5/1 安部 空白 空白 大阪 研修 5,000 0 0
3 6/1 中村 福島 空白 名古屋 会議 3,000 3,000 0
番号 月日 氏名 出張先 出張名 旅費
1 4/1 山本 東京 視察 10,000
1 4/1 田中 東京 視察 10,000
1 4/1 清水 東京 視察 10,000
2 5/1 安部 大阪 研修 5,000
3 6/1 中村 名古屋 会議 3,000
3 6/1 福島 名古屋 会議 3,000
Sub aaa()
Dim a Dim ans Dim i As Long Dim j As Long Dim n As Long n = 2 a = Range("A1").CurrentRegion.Value ReDim ans(1 To UBound(a, 1) * 3, 1 To 6) ans(1, 1) = a(1, 1) ans(1, 2) = a(1, 2) ans(1, 3) = Left(a(1, 3), 2) ans(1, 4) = a(1, 6) ans(1, 5) = a(1, 7) ans(1, 6) = a(1, 8) For i = 2 To UBound(a, 1) For j = 3 To 6 If a(i, j) <> "" Then ans(n, 1) = a(i, 1) ans(n, 2) = a(i, 2) ans(n, 3) = a(i, j) ans(n, 4) = a(i, 6) ans(n, 5) = a(i, j + 4) ans(n, 6) = a(i, 7) n = n + 1 Else Exit For End If Next j Next i With Sheets.Add .Range("A1").Resize(UBound(ans, 1), 6).Value = ans End With End Sub
(sarara) 2015/01/15(木) 16:34
仕様変更がないように、そちらを固めてから再度質問してください。 (稲葉) 2015/01/16(金) 08:28
何度もすみません。
仕様としてはこれが最終の形になります。
コードを見ながら勉強したいと思います。
よろしくお願いいたします。
番号 月日 氏名1 氏名2 氏名3 出張先 出張名 旅費 旅費 旅費
1 4/1 山本 田中 清水 東京 視察 10,000 10,000 10,000
2 5/1 安部 空白 空白 大阪 研修 5,000 0 0
3 6/1 中村 福島 空白 名古屋 会議 3,000 3,000 0
↓
番号 月日 氏名 出張先 出張名 旅費
1 4/1 山本 東京 視察 10,000
1 4/1 田中 東京 視察 10,000
1 4/1 清水 東京 視察 10,000
2 5/1 安部 大阪 研修 5,000
3 6/1 中村 名古屋 会議 3,000
3 6/1 福島 名古屋 会議 3,000
(sarara) 2015/01/16(金) 09:33
Sub aaa() Dim a Dim ans Dim i As Long Dim j As Long Dim n As Long n = 2 a = Range("A1").CurrentRegion.Value ReDim ans(1 To UBound(a, 1) * 3, 1 To 6) ans(1, 1) = a(1, 1) ans(1, 2) = a(1, 2) ans(1, 3) = Left(a(1, 3), 2) ans(1, 4) = a(1, 6) ans(1, 5) = a(1, 7) ans(1, 6) = a(1, 8) For i = 2 To UBound(a, 1) For j = 3 To 5 If a(i, j) <> "" Then ans(n, 1) = a(i, 1) ans(n, 2) = a(i, 2) ans(n, 3) = a(i, j) ans(n, 4) = a(i, 6) ans(n, 5) = a(i, 7) ans(n, 6) = a(i, j + 5) n = n + 1 Else Exit For End If Next j Next i With Sheets.Add .Range("A1").Resize(UBound(ans, 1), 6).Value = ans End With End Sub (稲葉) 2015/01/16(金) 09:48
本当にありがとうございました!
助かりましたm(_ _)m
これを機にVBAの勉強をしたいと思います。
(sarara) 2015/01/16(金) 09:53
解決しちゃいましたけど、手作業的な処理をVBAで書く場合のコードです。
Sub test()
Dim sh1 As Worksheet Dim sh2 As Worksheet Dim i As Long Dim j As Long Dim r As Range
Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2")
Application.ScreenUpdating = False
sh2.UsedRange.Delete
sh1.Range("H1").Value = "旅費1" sh1.Range("I1").Value = "旅費2" sh1.Range("J1").Value = "旅費3"
Set r = sh1.Range("A1").CurrentRegion
j = 1 For i = 1 To 3 sh1.Range("A1:B1").Copy sh2.Range("A" & j) sh1.Range("F1:G1").Copy sh2.Range("D" & j) sh1.Cells(i + 2).Copy sh2.Range("C" & j) sh1.Cells(1, i + 7).Copy sh2.Range("F" & j) r.AdvancedFilter xlFilterCopy, , sh2.Range("A" & j).Resize(, 6) If i > 1 Then sh2.Range("A" & j).Resize(, 6).Delete xlShiftUp End If j = sh2.Range("A1").CurrentRegion.Rows.Count + 1 Next sh1.Range("H1:J1").Value = "旅費" sh2.Range("C1").Value = "氏名" sh2.Range("F1").Value = "旅費" On Error Resume Next sh2.Range("C:C").SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0 sh2.Range("A1").CurrentRegion.Sort _ Key1:=sh2.Range("A1"), Order1:=xlAscending, _ Key1:=sh2.Range("B1"), Order1:=xlAscending, Header:=xlYes
Application.ScreenUpdating = True
End Sub
(ウッシ) 2015/01/16(金) 10:19
ありがとうございます。
皆さんすごいですね!
パッと解決されてしまうので、職場にいてくれたらなあといつも思います。
またよろしくお願いいたします。
(sarara) 2015/01/16(金) 12:16
なるほど 手作業をVBAに表すって方法も面白いですね!
Sub bbb() Dim r As Range Dim LR As Long Dim WS As Worksheet Set WS = ActiveSheet With Sheets.Add WS.Range("A1").CurrentRegion.Copy .Range("A1") Set r = .Range("J2", .Range("A" & Rows.Count).End(xlUp)) r.Copy .Range("A" & Rows.Count).End(xlUp).Offset(1) r.Copy .Range("A" & Rows.Count).End(xlUp).Offset(1) .Range("J2", .Range("A" & Rows.Count).End(xlUp)).Sort .Range("A2"), xlAscending
Set r = .Range("K2:L" & .Range("A" & Rows.Count).End(xlUp).Row) r.Offset(, 0).Resize(, 1).Formula = "=SUBSTITUTE(INDEX(C2:E2,,MOD(ROW()+1,3)+1),""0"","""")" r.Offset(, 1).Resize(, 1).Formula = "=INDEX(H2:J2,,MOD(ROW()+1,3)+1)" r.Value = r.Value .Range("L2", .Range("A" & Rows.Count).End(xlUp)).Sort .Range("K2"), xlAscending .Range(.Range("A" & Rows.Count).End(xlUp), .Range("K" & Rows.Count).End(xlUp).Offset(1)).EntireRow.Delete
LR = .Range("A" & Rows.Count).End(xlUp).Row .Range("C2:C" & LR).Value = .Range("K2:K" & LR).Value .Range("H2:H" & LR).Value = .Range("L2:L" & LR).Value .Range("I:L").Delete .Range("D:E").Delete
.Range("J2", .Range("A" & Rows.Count).End(xlUp)).Sort .Range("A2"), xlAscending End With End Sub
自分には余計難しくなりました・・・ Deleteの処理とかずれる (稲葉) 2015/01/16(金) 13:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.