[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データの整理・集約をしたい』(まろん)
A列 B列 C列 D列 E列 F列 G列 1行目 3 4 5 2行目 年度 担当者 所属 ABC-DE BCD-EF CDE-FG 3行目 1 2010 鈴木 営業 4行目 2 2015 伊藤 総務 3000 2000 5行目 3 2017 山本 販売 2000 6行目 4 2009 佐藤 営業 8000 7行目 5 2007 山田 総務 4000 6000 5000
というデータがあります。
下記のように変更したいのですが、現在、手作業で変更しています。膨大な量があるため、関数もしくはマクロで簡単に出来たらなと思っております。
テレワークになってしまい、アドバイスも受けられず途方に暮れております。
関数でもマクロでもよいので、楽に纏められる方法を教えて頂けると有難いです
A列 B列 C列 D列 E列 F列 G列 年度 担当者 所属 型番 NO. 金額 1行目 1 2010 鈴木 営業 2行目 2 2015 伊藤 総務 BCD-EF 4 3000 3行目 3 2017 山本 販売 ABC-DE 3 2000 4行目 4 2009 佐藤 営業 CDE-FG 5 8000 5行目 5 2007 山田 総務 ABC-DE 3 4000 6行目 5 2007 山田 総務 BCD-EF 4 6000 7行目 2 2015 伊藤 総務 CDE-FG 5 2000 8行目 5 2007 山田 総務 CDE-FG 5 5000
<現在行っている作業>
E列、F列に空白列を追加
E2に"型番”と入力
F2に"NO."と入力
G2で縦方向に「空白以外」でフィルタ
G2をE列(型番の列)にコピペする
G1をF列(数量の列)にコピペする
H2で縦方向に「空白以外」でフィルタ
H2をE列(型番の列)にコピペする
H1をF列(数量の列)にコピペする
H列以外に値が入っていた場合、その行をコピーし、最終行の下に貼付
貼り付けした行のG列以降から、H列以外の値を削除し、H列の値をG列へ貼付
I2で縦方向に「空白以外」でフィルタ
I3以下に値が入っていた場合、
I2をE列(型番の列)にコピペする
I1をF列(数量の列)にコピペする
I列以外に値が入っていた場合、その行をコピーし、最終行の下に貼付
貼り付けした行のG列以降から、I列以外の値を削除し、I列の値をG列へ貼付
G2に"金額"と変更
2行目はH列以降削除
最終的にG列に金額を集約したいです。
※元の表にはは100列、20000行あります
< 使用 Excel:Office365、使用 OS:Windows10 >
ちょっと希望図が腑に落ちないのですが、
こんな風なA列の昇順じゃマズいのですか? ↓ 行 _A_ __B__ ___C___ __D__ __ E __ F __G__ 1 年度 担当者 所属 型番 NO. 金額 2 1 2010 鈴木 営業 3 2 2015 伊藤 総務 BCD-EF 4 3000 4 2 2015 伊藤 総務 CDE-FG 5 2000 5 3 2017 山本 販売 ABC-DE 3 2000 6 4 2009 佐藤 営業 CDE-FG 5 8000 7 5 2007 山田 総務 ABC-DE 3 4000 8 5 2007 山田 総務 BCD-EF 4 6000 9 5 2007 山田 総務 CDE-FG 5 5000
(半平太) 2020/05/09(土) 00:02
ありがとうございます。説明が下手かつ希望図の行数がズレており、分かりにくくて申し訳ありません。
希望図は下記になります
A列 B列 C列 D列 E列 F列 G列 1行目 年度 担当者 所属 型番 NO. 金額 2行目 1 2010 鈴木 営業 3行目 2 2015 伊藤 総務 BCD-EF 4 3000 4行目 3 2017 山本 販売 ABC-DE 3 2000 5行目 4 2009 佐藤 営業 CDE-FG 5 8000 6行目 5 2007 山田 総務 ABC-DE 3 4000 7行目 5 2007 山田 総務 BCD-EF 4 6000 8行目 2 2015 伊藤 総務 CDE-FG 5 2000 9行目 5 2007 山田 総務 CDE-FG 5 5000
実施したい事をもう一度整理してみました。
元々の表
1列目に入っている数字はNO.
E2:G2に入っている数字は型番になります
E3:G7に入っている数字は金額になります
・E,F,G列を追加し、型番、NO. 、金額と入力
・元の表にE3:E7に数字が入っていた場合、元の表から型番、NO.、金額をそれぞれよりコピペ(金額は移動)
・これをF,G列も実施
という順であれば良いのですが、同じ行の別型番にも金額が入っている場合があるので(例 E7:G7)、そこが自分にとって厄介でして、関数もマクロも詳しくないため、どうしたものかと途方に暮れております。
金額が重複して入っている場合は、行を最終行の下へコピペし、型番、NO.を元データからコピペし、金額に関しては元データから移動させたいです。
それと、ご指摘いただいた件、A列で昇順にする必要はないので、そのままで大丈夫ですが、今後のために A列で昇順にする際にどのようなコード(マクロであれば)を追加したら良いか教えて頂けると有難いです。
(まろん) 2020/05/09(土) 07:56
>それと、ご指摘いただいた件、A列で昇順にする必要はないので、そのままで大丈夫ですが、 >今後のために A列で昇順にする際にどのようなコード(マクロであれば)を追加したら良いか教えて頂けると有難いです。
いえ、マクロだと頭から処理して行くので、自然体で上から順に並ぶので 手操作のような結果にする方が大変なんです。
ところで "元の表には100列、20000行" とありますね。
すると、金額が全部埋まっていれば2百万行にもなるでしょうが、 実際はパラパラの印象があり、出来上がりは4、5千行程度のものなのでしょうか?
※処理速度に思いを馳せてお聞きしております。
(半平太) 2020/05/09(土) 08:41
下記マクロは、データ量・処理速度に配慮しておりません。
「元データ」シートの「シート見出」を右クリックして、サブメニューの「コードの選択」を選び VBE画面を出したら、画面中央の白いエリアに 後記マクロコードを貼り付け、F5キー押下で実行する。
希望図はSheet2に作成されます。(無ければ、Sheet2を追加してからマクロ実行してください)
’シートモジュールに貼り付けるマクロ(標準モジュールではない)
Enum fixNum キー = 1 年度 担当 所属 型番 NO 金額 End Enum
Sub Sample() Dim dicT As Object Dim Box(1 To 7) Dim rToProc As Range Dim NoAry, ModelAry Dim RW As Long, CL As Long Dim Key Dim Rightest As Long
Rem データ収集 Set rToProc = Me.Range("A1").CurrentRegion Set dicT = CreateObject("Scripting.Dictionary")
Key = 1 dicT(Key) = [{"","年度","担当者","所属","型番","NO.","金額"}]
NoAry = rToProc.Rows(1).Value ModelAry = rToProc.Rows(2).Value
For RW = 3 To rToProc.Rows.Count
Box(キー) = rToProc(RW, キー) Box(年度) = rToProc(RW, 年度) Box(担当) = rToProc(RW, 担当) Box(所属) = rToProc(RW, 所属)
Rightest = Me.Cells(RW, rToProc.Columns.Count + 1).End(xlToLeft).Column
If Rightest < 5 Then '金額皆無 Key = Key + 1 Box(型番) = Empty Box(NO) = Empty Box(金額) = Empty dicT(Key) = Box Else For CL = 5 To Rightest If Not IsEmpty(rToProc(RW, CL)) Then Key = Key + 1 Box(型番) = ModelAry(1, CL) Box(NO) = NoAry(1, CL) Box(金額) = rToProc(RW, CL)
dicT(Key) = Box End If Next CL End If Next RW
Rem 出力 With Sheets("Sheet2") .Cells.ClearContents .Range("A1").Resize(dicT.Count, 7) = Application.Index(dicT.items, 0, 0) End With
dicT.RemoveAll End Sub
(半平太) 2020/05/09(土) 09:42
ありがとうございます。
実行出来ました。感動です!
A列は昇順で構いませんので、楽になりました。
マクロを実際の項目名に修正したり、項目名を増やしたりする時は、
Enum fixNum キー = 1 年度 担当 所属 型番 NO 金額 End Enum
dicT(Key) = [{"","年度","担当者","所属","型番","NO.","金額"}]
Box(キー) = rToProc(RW, キー) Box(年度) = rToProc(RW, 年度) Box(担当) = rToProc(RW, 担当) Box(所属) = rToProc(RW, 所属)
以上3か所の文字列を変更するという認識で大丈夫でしょうか?
それと、実際のデータも全部埋まっている訳ではなく、パラパラと入っています。
最終的な行数ですが、現時点ではまだ手作業が終わっていないため正確ではありませんが、もし金額が何も入っていない行があった場合(入力漏れなどで)、その行を削除するという事をすれば行数は少なくなるのかなと思いますが、空白行を残した場合は3-40,000行ほどかと思います。
(まろん) 2020/05/09(土) 10:13
>マクロを実際の項目名に修正したり、項目名を増やしたりする時は、
項目名の修正は、dicT(Key)の1文だけでいいんですが、 平仄がとれてないとわざわざEnumを書いた意味がなくなるので、 他も一緒に変更した方がベターでしょうね。
項目の追加は、他にも下文の決め打ち数値にも影響が出ます。 ※ 具体的にどんな追加なのか分からないので、こちらでは明言しかねます。
Dim Box(1 To 7) If Rightest < 5 Then '金額皆無 For CL = 5 To Rightest .Range("A1").Resize(dicT.Count, 7) = Application.Index(dicT.items, 0, 0)
(半平太) 2020/05/09(土) 10:36
ありがとうございます。
返信が遅くなり申し訳ありません。
追加で教えて頂ければ幸いです。
例ですと元の項目名がA-D列にしか入っていないのですが、実際のデータは項目名が26個(Z列まで)あります。
27(AA)列目以降の金額データを見て、同じ動作をさせたいですが、マクロの構文に項目名を26個入力する方法以外に何か方法はありますでしょうか?
お手数をおかけしますがよろしくお願い致します。
(まろん) 2020/05/09(土) 14:42
>27(AA)列目以降の金額データを見て、同じ動作をさせたい
同じ動作と言われましても、こちらでは推測の域を出ません。
具体的に希望図はどうなるんですか?
(半平太) 2020/05/09(土) 15:08
こんにちは! ちょっと書いてみました。。。 一応↓みたいな感じになりました。。。 データが多いということなのであらかじめ大きめに確保する方法にしました。 あまり空白が多いと足らない時があるかも(^^; その辺はお勉強して応用して頂けると助かります。。。
年度 担当者 所属 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 型番 NO. 金額 1 2010 鈴木 営業 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 2 2015 伊藤 総務 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 BCD-EF 4 3000 2 2015 伊藤 総務 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 CDE-FG 5 2000 3 2017 山本 販売 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 ABC-DE 3 2000 4 2009 佐藤 営業 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 CDE-FG 5 8000 5 2007 山田 総務 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 ABC-DE 3 4000 5 2007 山田 総務 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 BCD-EF 4 6000 5 2007 山田 総務 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 CDE-FG 5 5000
Option Explicit Sub てすと() Dim MyA As Variant Dim MyB As Variant Dim v As Variant Dim 項目 As Variant Dim i As Long Dim j As Long Dim n As Long Dim k As Long Dim q As Long With Sheets("Sheet1") MyA = .Range("A1").CurrentRegion.Resize(, 5).Value MyB = Intersect(.Range("A1").CurrentRegion, .Range("F:I")).Value 項目 = .Range("A2").Resize(, UBound(MyA, 2)).Value End With 'vの二次元方向を MyA+"型番", "NO.", "金額" の3つにする ReDim v(1 To UBound(MyB, 2) * UBound(MyA, 1), 1 To UBound(MyA, 2) + 3) For j = LBound(項目, 2) To UBound(項目, 2) v(1, j) = 項目(1, j) Next 項目 = Array("型番", "NO.", "金額") For j = LBound(項目) To UBound(項目) v(1, UBound(v, 2) - 2 + j) = 項目(j) Next k = 1 For i = LBound(MyA, 1) + 2 To UBound(MyA, 1) n = Application.CountA(Application.Index(MyB, i, 0)) If n > 0 Then For n = 1 To n k = k + 1 For j = LBound(MyA, 2) To UBound(MyA, 2) v(k, j) = MyA(i, j) Next For q = LBound(MyB, 2) To UBound(MyB, 2) If MyB(i, q) <> "" Then v(k, UBound(v, 2) - 2) = MyB(2, q) v(k, UBound(v, 2) - 1) = MyB(1, q) v(k, UBound(v, 2)) = MyB(i, q) MyB(i, q) = "" Exit For End If Next Next Else k = k + 1 For j = LBound(MyA, 2) To UBound(MyA, 2) v(k, j) = MyA(i, j) Next End If Next With Sheets("Sheet2") .Cells.Clear .Range("A1").Resize(k, UBound(v, 2)).Value = v End With Erase MyA, MyB, v, 項目 End Sub (SoulMan) 2020/05/09(土) 16:22
PCの具合が悪くなってしまい、返信が遅くなり申し訳ありません。
また、お願いしておきながら説明が不足になってしまい、申し訳ありませんでした。
>具体的に希望図はどうなるんですか?
希望図はSoulMan様に書いて頂いた図と同じになります。
元々の表
1列目に入っている数字はNO.
型番はE2:Z2に入っている
金額はAA3以降に入っている(AA列から約100列)
1.Z列の右に3列追加し、それぞれに 型番、NO. 、金額と入力
2.元の表27列目に金額が入っていた場合、元の表から型番、NO.、金額をそれぞれよりコピーし、1で追加した列に貼り付け(金額は移動)
3.これをAB列以降も実施
以上が実施したいことになります。
今後、項目列が増える可能性もあるため、項目名を入力する以外の方法があれば教えて頂けると有難いです。
よろしくお願い致します。
(まろん) 2020/05/11(月) 08:32
すみません、希望図を貼るのを忘れておりました
SoulMan様の表をお借りしたました
年度 担当者 所属 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 型番 NO. 金額 1 2010 鈴木 営業 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 2 2015 伊藤 総務 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 BCD-EF 4 3000 2 2015 伊藤 総務 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 CDE-FG 5 2000 3 2017 山本 販売 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 ABC-DE 3 2000 4 2009 佐藤 営業 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 CDE-FG 5 8000 5 2007 山田 総務 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 ABC-DE 3 4000 5 2007 山田 総務 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 BCD-EF 4 6000 5 2007 山田 総務 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 CDE-FG 5 5000 (まろん) 2020/05/11(月) 08:41
ありがとうございます。
PCの具合が悪くなり、返信が遅くなってしまい申し訳ありませんでした
希望図はSoulMan様が書いてくださった通りになります
説明不足で分かりにくい文章だったかと思いますが、ご理解頂きありがとうございます。
教えて頂いたマクロで試してみたところ、AA-AC列では希望する動作が得られたのですが、AD列以降のデータが反映されませんでした(実際のデータはAA列以降 約100列ほど型番・金額が入っています)
今後項目が増えたり、型番が増える可能性もあるため、教えて頂いたマクロのどの部分を修正すれば良いかご教授頂けると有難いです。
よろしくお願い致します
(まろん) 2020/05/11(月) 08:44
項目を26から増やす場合、下記を26から別の値へ変更
MyA = .Range("A1").CurrentRegion.Resize(, 26).Value
型番数を増やした場合、Range("AA:AC"))のACを別の列番号(ANなど)を変更
MyB = Intersect(.Range("A1").CurrentRegion, .Range("AA:AC")).Value
試しに変更してみたのですが、上手く行きませんでした。
上記以外にも変更する箇所はありますでしょうか?
(まろん) 2020/05/11(月) 10:00
度々申し訳ございません。
項目を26から増減する場合、下記を26を別の値へ変更
MyA = .Range("A1").CurrentRegion.Resize(, 26).Value
その上で、
MyB = Intersect(.Range("A1").CurrentRegion, .Range("AA:AC")).Value
のRange("AA:AC"))部分を変更
というところまでは理解でき、Resize(, 26)を別の値へ、Range("AA:AC"))を別の列番号に修正してもマクロは動きました
しかしながら、Range("AA:AC"))を3列以上にした場合(AA:AG、G:Pなど)、「エラー9 インデックスが有効範囲にありません」と表示されてしまい、マクロが動きませんでした
(まろん) 2020/05/11(月) 10:28
こんばんは! 日中はほとんど見れませんので極端にレスポンスが悪くなります。すみません。 そんな中で上のコードに注釈を入れておきましたので参考にしてみて下さい。 >しかしながら、Range("AA:AC"))を3列以上にした場合(AA:AG、G:Pなど)、「エラー9 インデックスが有効範囲にありません
結論から言いますと、、現状のコードのままでは最初の前提条件が変わってくるので離れた範囲を指定することは出来ません。 離れた範囲を指定する時は別途違う変数をもう一つ用意する必要があります。
まぁ、、ここからは応用なので是非チャレンジして欲しいのと所詮は他人が書いたコードだという事です。 こういった掲示板でコードをもらうのはいいのですがここからが書いてもらった人への「礼」になると思うのです。 私に 様 はいりません。。 さん で十分です。
それはさておきそんな私からのアドバイスをいくつか。。。 1.変数名は自分自身がわかりやすい名前に置き換える(この場合出来るだけ置換を使う) 2.小手先でいじるのではなく自分自身のコードに書き直す 3.コードは書いて書いて書きまくる
老婆心的な小言はこれくらいでしょうか。。。。頑張ってくださいとしか言えませんが。。。。 また、、どこかで会えることを願っています。。。
では、、では、、また。。。 (SoulMan) 2020/05/11(月) 19:52
Enumは廃止します
元データのシートモジュールに貼り付け
Sub Sample() Dim dicT As Object Dim Ans, DefaultCol Dim Box Dim rToProc As Range Dim NoAry, ModelAry Dim RW As Long, CL As Long Dim Key Dim Rightest As Long Dim LastItemCol As Long
Rem 項目最終列を照会する DefaultCol = Split(Cells(1, Me.[MATCH(TRUE,ISNUMBER(A1:SF1),0)-1]).Address, "$")(1) Ans = InputBox("項目最終列のアルファベットを入力" & vbLf & "例:Z", , DefaultCol) If Ans = "" Then Exit Sub Else LastItemCol = Range(Ans & 1).Column End If
Rem データ収集 Set rToProc = Me.Range("A1").CurrentRegion Set dicT = CreateObject("Scripting.Dictionary")
'タイトル処理 Box = Me.Range("A2").Resize(1, LastItemCol + 3).Value Box(1, LastItemCol + 1) = "型番" Box(1, LastItemCol + 2) = "NO" Box(1, LastItemCol + 3) = "金額"
Key = 1 dicT(Key) = Box 'タイトル書き込み
NoAry = rToProc.Rows(1).Value ModelAry = rToProc.Rows(2).Value
For RW = 3 To rToProc.Rows.Count '順次データ読み込み Box = rToProc.Rows(RW).Resize(1, LastItemCol + 3)
Rightest = Me.Cells(RW, rToProc.Columns.Count + 1).End(xlToLeft).Column
If Rightest <= LastItemCol Then '金額皆無 Box(1, LastItemCol + 1) = Empty '型番 Box(1, LastItemCol + 2) = Empty 'NO Box(1, LastItemCol + 3) = Empty '金額
Key = Key + 1 dicT(Key) = Box Else For CL = LastItemCol + 1 To Rightest '金額在り If Not IsEmpty(rToProc(RW, CL)) Then Box(1, LastItemCol + 1) = ModelAry(1, CL) '型番 Box(1, LastItemCol + 2) = NoAry(1, CL) 'NO Box(1, LastItemCol + 3) = rToProc(RW, CL) '金額
Key = Key + 1 dicT(Key) = Box End If Next CL End If Next RW
Rem 出力 With Sheets("Sheet2") .Cells.ClearContents .Range("A1").Resize(dicT.Count, LastItemCol + 3) = Application.Index(dicT.items, 0, 0) End With
dicT.RemoveAll End Sub
(半平太) 2020/05/12(火) 08:49
ありがとうございます。
すみません、「離れた範囲」という事が理解できないので教えて頂きたいのですが、
項目が5つ、金額データが3列あった場合、Resize(, 26)をResize(, 5)へ、そしてRange("AA:AC")をRange("F:H"))へ修正することでマクロは動きました
しかしながら、項目を5つのままで、金額を4列Range("F:I"))にした場合、エラーになってしまいました
項目は5つ(E列まで)、その隣のF列から 4列分のI列までの金額データを参照しているので、離れているという認識では無かったのですが、やはり離れた範囲として別の変数を追加するのでしょうか?
初心者の質問で申し訳ないのですが、教えてください。よろしくお願いします。
(まろん) 2020/05/12(火) 12:52
ありがとうございます。
何度も曖昧な質問をしてしまい、申し訳ありませんでした。
お陰様でリストが希望図になりました。
今まで手作業で行っていたものが、こんな一瞬でリスト化されて本当に有難いです。
(まろん) 2020/05/12(火) 13:06
解決されて良かったです。。。 >すみません、「離れた範囲」という事が理解できないので教えて頂きたいのですが、 というのは↓の様なことを指すと思っていました。 >しかしながら、Range("AA:AC"))を3列以上にした場合(AA:AG、G:Pなど) どうも話がかみ合ってないです。。。
もうこのことを論じても意味がないですし、、その労力もありませんのでここまでとします。
>しかしながら、項目を5つのままで、金額を4列Range("F:I"))にした場合、エラーになってしまいました 上のコードを直しておきましたが、どこも止まらなかったので私のデータとデータが違っているのかもしれませんね。。。 (SoulMan) 2020/05/12(火) 19:52
あっ、↓vの一次元方向が 3* UBound(MyA, 1)(3列×MyAの上限)の決め打ちしていたので列を増やして足らなくなったのですね。。。 >ReDim v(1 To UBound(MyB, 2) * UBound(MyA, 1), 1 To UBound(MyA, 2) + 3) まぁ、、もうどうでもいいですけど。。。 (SoulMan) 2020/05/12(火) 20:12
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.