[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『多量の複数行・列データーの並び替え方法』(爺さん)Excel20003 WindowsXP
母の俳句を次のように1行目が季語、2行目が俳句で24行目まで入力しました。約2000句ありますが、これを季語別に並べ替えたいのですが、エクセルは初心者です。詳しく御教示お願いします。
A B C D E………→IV
1 季 秋 花 初 語 火 夏 2 俳 秋 夕 そ 句 深 空 よ ・ し に 風 ・ ↓ 23 季 梅 白 藪 語 菊 椿 24 俳 つ 亡 山 句 ぼ 夫 合 み い
並べ替えた形が連想できません。 どのような形にしたいのでしょう? (seiya)
横方向(列方向)には256列しかないので行方向に並び替えます。 24行×256列の範囲を指定「コピー」A31を指定、「形式を選択して貼り付け」「行列を入れ替える」にチェックOK。 貼り付け結果を確認、元のデータを削除。30行を削除します。 貼り付け後のデータがA1:X256にあるとして、 A257:=C1 A2500まで下へコピー。A257:A2500をV列までフィルコピー。 A1:B2500を指定、コピー、値貼り付け。すべてのデータはA:B列に集中されます。B列以降を削除。 A:B列をA列をキーに並び替えます。
想像だけど、最終的にまとめる形としては、あくまで横方向に A1からIV1まで、次の項目からは A3からIV4まで、次はA5からIV6まで・・・・ これを季語順に並べたいということなんだろうと。
上で(名前なし)さんがいっているようにエクセルの列数には限界があるので、やるとすれば ・別シートのA列、B列に(名前なし)さんのコメントにあるような縦横入れ替えの転記をする。 (めんどうだけどね。)転記先、最初は1行目、次が257行目・・・・ ・で並べ替え ・こうしてできた別シートから、今度はもとのシートに、縦横逆の転記を行っていく。
自分なら、ちゃっちゃっちゃとVBA書いて処理するな。
10:07 並べかえを追加
ぶらっと立ち寄り
まずA列に季語、B列に季節、C列に俳句というシートを2000 行まで作ります。 (この形式なら他の列に作成日やメモなどいろいろと書くこともできます。)
それを別シートに今の形で表示するようにしたらどうでしょうか。 上記の形が Sheet1にある場合、 Sheet2 で A1=INDIRECT(ADDRESS(COLUMN()+INT(ROW()/22)*256,1,,,"Sheet1")) A2=INDIRECT(ADDRESS(COLUMN()+INT(ROW()/22)*256,3,,,"Sheet1")) として A1:IV2 にコピー、同じくA23:IV24 にコピー で今の形が出ると思います。
2行目の高さを長くして、3行おきくらいに書いた方が楽な気もしますが。 (Mook)
とりあえず解決?ということで、蛇足。 Mookさんのコメントのように、データは別形式で持っておいて、今のような形が必要な場合は作表するという 運用がベストだと思いますね。
ただ、現在は今の形でデータがあり、当面、これに追加していくことになるんだろうと思う。 上で自分も含めてアップした方法は、作業も大変かもしれないし、そのあと追加した俳句をまた並び替えるにも 作業が必要になってくるので、面倒? ということなら、今の形のままで、並び替えをするVBAを。 保険(?)としてアップ。充分なテストはしていないので不具合あったらごめん。
Sub Sample() Dim n As Variant Dim i As Long, j As Long, k As Long Dim y As Long, x As Long, z As Long Dim v() As Variant, w() As Variant Dim vv As Variant Dim sh As Worksheet
Application.ScreenUpdating = False
Set sh = Sheets("Sheet1") x = sh.Columns("IV").Column ' sh.Columns.Count が妥当だけど、今2010で作業しているので。 y = sh.Range("A" & sh.Rows.Count).End(xlUp).Row z = y / 2 * (x - 1) ReDim v(1 To z, 1 To 2) For i = 1 To y Step 2 For j = 2 To x k = k + 1 v(k, 1) = sh.Cells(i, j).Value v(k, 2) = sh.Cells(i + 1, j).Value Next Next
Sheets.Add Range("A1").Resize(UBound(v, 1), 2).Value = v Columns("A:B").Select Columns("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal vv = Range("A1").CurrentRegion.Value Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True
ReDim w(1 To y, 1 To x - 1)
i = 1 j = 1 For k = 1 To UBound(vv, 1) If k <> 1 And (k - 1) Mod (x - 1) = 0 Then i = i + 2 j = 1 End If w(i, j) = vv(k, 1) w(i + 1, j) = vv(k, 2) j = j + 1 Next
sh.Range("B1").Resize(UBound(w, 1), UBound(w, 2)).Value = w Set sh = Nothing Application.ScreenUpdating = True MsgBox "並べ替え完了です"
End Sub
ぶらっと立ち寄り
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.