プロが教える店舗&オフィスのセキュリティ対策術

クラス毎にシートがあり、振込日と振込額の列があります。このシートが8シート(8クラス)あります。
別のシートに、全クラスの振込日順に並び替えたいのですが、どうすればよいでしょうか?
よろしくお願いします。

名前 振込日 振込額
○○  12/26 \10,000
△△  12/27 \20,000

のようなシートが8シートあります。

A 回答 (8件)

No1です。

VBA案です。
仮に
350名のデータが入っているシート名が Sheet1
振込み日が B1(B列)だとして

並び替えた結果を表示したいシートの名前のタグを右クリック
コードの表示をクリック
VBエディターが起動したら
Private Sub Worksheet_Activate()
Sheets("Sheet1").Cells.Copy
Cells.Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess
End Sub
をコピーしてみてください。
簡単に説明しますと
Private Sub Worksheet_Activate() は、ほかのシートからこのシートを選択した時に実行される
Sheets("Sheet1").Cells.Copy Sheet1という名前のシートをコピー
Selection.Sort Key1:=Range("B2"), ・・ B列を基準に並び替えです。
必要に応じて
Sheet1とRange("B2")の部分は変更して使ってみてください。
並び替えを表示したいシートを選択すると勝手に実行されますので
見た目では関数を配置したような感覚で使えるはずです。

この回答への補足

補足
ありがとうございます。やってみたところ、
実行時エラー!'1004'
アプリケーション定義またはオブジェクト定義のエラーです。
と出てしまいます。(Q_Q)↓
新しいシートにコピーは出来ますが、ソートは出来ません。

実際に使ったコードは、
Private Sub Worksheet_Activate()
Sheets("会計用").Cells.Copy
Cells.Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Sort Key1:=Range("M2"), Order1:=xlAscending, Header:=xlGuess
End Sub
です。
会計用シートのB2からN338までデータが入っていて、ソートキーはM列です。1行目は項目名になっています。

頼りきりで申し訳ないのですが、どうかこの先も教えてください。

補足日時:2011/01/01 20:52
    • good
    • 4
この回答へのお礼

ありがとうございました。何とか、運用に間に合いました。
上手くいかないことも有りましたが、VBAエディタも調べたりして、似たのがあったので勉強もしました。(というほどでもありませんが。)今回のお陰で実際の入金の管理も助かったし、個人的には新しいことも学べて助かりました。また何かあればよろしくお願いします。

お礼日時:2011/01/15 14:19

回答番号:ANo.2です。



>こちらに質問をしている間に、当方の仕様が変わってしまいました。

 1つのシートにまとまっている方が簡単になります。
 今仮に、
Sheet1のA2以下にクラス名のデータ
Sheet1のB2以下に出席番号のデータ
Sheet1のC2以下に名前のデータ
Sheet1のD2以下に振込日のデータ
Sheet1のE2以下に振込額のデータ
が入力されているものとします。
 又、適当な列(ここでは仮にSheet3のA列とします)を作業列として使用し、
Sheet2のA2以下に振込日順に並べ替えたクラス名のデータ
Sheet2のB2以下に振込日順に並べ替えた出席番号のデータ
Sheet2のC2以下に振込日順に並べ替えた名前のデータ
Sheet2のD2以下に振込日順に並べ替えた振込日のデータ
Sheet2のE2以下に振込日順に並べ替えた振込額のデータ
を表示させるものとします。

 まず、Sheet3のA2セルに次の数式を入力して下さい。

=IF(ISNUMBER(Sheet1!$D2),Sheet1!$D2+COUNTIF(Sheet1!$D$1:$D2,Sheet1!$D2)/COUNTIF(Sheet1!$D:$D,Sheet1!$D2),"")

 次に、Sheet3のA2セルをコピーして、Sheet3のA3以下に貼り付けて下さい。
 次に、Sheet2のA2セルに次の数式を入力して下さい。

=IF(ROWS($1:1)>COUNT(Sheet1!$D:$D),"",INDEX(Sheet1!A:A,MATCH(SMALL(Sheet3!$A:$A,ROWS($1:1)),Sheet3!$A:$A,0)))

 次に、Sheet2のA2セルをコピーして、Sheet2のB2~E2の範囲に貼り付けて下さい。
 次に、Sheet2のD2セルの書式設定を「日付」として下さい。
 次に、Sheet2のA2~E2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。

 以上です。
    • good
    • 0

>B2に入れたコード


=IF($A2="","",VLOOKUP($A2,会計用!$A:$N,COLUMN(M2),0))

VLOOKUP関数の第3引数の「COLUMN(M2)」の部分は参照したい列番号を指定するのですから、そのセルに入力する場合も2列目なら2を参照する「COLUMN(B2)」などにしてください。

横方向にオートフィルコピーで対応しなくてもよいなら、もちろん列ごとに「2」や「3」のように直接数字を入力してもOKです。
    • good
    • 1

1枚のシートになっているなら、以下の式で日付の大きい順に(一番上のセルがもっとも最近のデータ)並べ替えることができます。



元データがSheet1ならA2セルに以下の式を入力して下方向にオートフィルします。

INDEX(Sheet1!A$2:A$350,MATCH(LARGE(INDEX(Sheet1!$B$2:$B$350-ROW($B$2:$B$350)/10000,),ROW(A1)),INDEX(Sheet1!$B$2:$B$350-ROW($B$2:$B$350)/10000,),0))&""

=B2セルには以下の式を入力して右方向に1つおよび下方向にオートフィルします。

=IF($A2="","",VLOOKUP($A2,Sheet1!$A:$C,COLUMN(B2),0))

日付の若い順に並べ替えるなら、A2セルに以下の式になります。

INDEX(Sheet1!A$2:A$350,MATCH(SMALL(INDEX(Sheet1!$B$2:$B$350+ROW($B$2:$B$350)/10000,),ROW(A1)),INDEX(Sheet1!$B$2:$B$350+ROW($B$2:$B$350)/10000,),0))&""

この回答への補足

ありがとうございます。やってみたところ、
実行時エラー!'1004'
アプリケーション定義またはオブジェクト定義のエラーです。
と出てしまいます。(Q_Q)↓
新しいシートにコピーは出来ますが、ソートは出来ません。

実際に使ったコードは、
Private Sub Worksheet_Activate()
Sheets("会計用").Cells.Copy
Cells.Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Sort Key1:=Range("M2"), Order1:=xlAscending, Header:=xlGuess
End Sub
です。
会計用シートのB2からN338までデータが入っていて、ソートキーはM列です。1行目は項目名になっています。

頼りきりで申し訳ないのですが、どうかこの先も教えてください。

補足日時:2011/01/01 20:50
    • good
    • 0
この回答へのお礼

すみません。補足内容を間違えました。
以下がMackyNo1さんへの補足です。

実際に入れたコードは以下の通りで、B2セルに#N/Aが出てしまいます。(Q_Q)↓
何がいけないのでしょうか?
教えてください。

A2に入れたコード
INDEX(会計用!A$2:A$338,MATCH(LARGE(INDEX(会計用!$B$2:$B$338-ROW($B$2:$B$338)/10000,),ROW(A1)),INDEX(会計用!$B$2:$B$338-ROW($B$2:$B$338)/10000,),0))&""

B2に入れたコード
=IF($A2="","",VLOOKUP($A2,会計用!$A:$N,COLUMN(M2),0))

お礼日時:2011/01/01 21:05

手作業で


8シートすべての値をCSV形式で保存、メモ帳ででもいいので合体。1つになったCSVを開いてエクセル形式に戻して保存。


シートを操作して1シートにまとめるのはサンプルもあります。

月1回の定例作業なら、マクロ化のが良いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。説明不足でございました。
振込期間は2週間ぐらいで、その間、常に日付順のシートと、振込者別シートが同時に更新されていることが理想です。

お礼日時:2010/12/28 16:48

シート数が多いこと、かつ日付順に並べ替えることの条件があると、ご希望の操作は実質的に関数で対応することはできません。



以下のページを参考にして複数のシートを1つにまとめるマクロを実行します。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …

このシートで日付順に並べ替える操作を行えばご希望の操作になりますが、これも自動化したいなら、この操作をマクロの記録で実行して、そのコードを上記のコードの最後に追加します。

この回答への補足

ありがとうございます。ご紹介いただいたサイトはわかりやすくて良さそうです。
ところで、申し訳ないのですが、こちらに質問をしている間に、当方の仕様が変わってしまいました。
元のクラス順の8シート(8クラス)は一つのシートに変更になりました。(1クラス~8クラスが縦に長く続いています。)元の質問と違うのですが、こちらでお世話になっているので、改めてお伺いさせていただいてよろしいですか?
改めて質問します。一つのシートにクラス順に出席番号順に350人分の、「振込日」と「振込金額があります。それを別のシートに全クラスのデータを「振込日別」に並べたいのです。
厚かましいですが、よろしければご教示ください。

補足日時:2010/12/28 16:55
    • good
    • 0
この回答へのお礼

ありがとうございました。ベストアンサーに選んだ方法のシートごとのマクロだけでは、そのシートの編集(合計を追加したり、ところどころに空白行や小計を入れたり)ができなかったので、MackyNo1さんのアイデアもお借りして、無事、運用にこぎ着けました。初めは、いろいろなことが上手くいかなかったのですが、この際、大変勉強になりました。今後ともどうぞよろしくお願いします。

お礼日時:2011/01/15 14:23

 今仮に、クラスのデータが入力されている各Sheetにおいて、


名前のデータが入力されている列がA列、
振込日のデータが入力されている列がB列、
振込額のデータが入力されている列がC列、
であり、各列の1行目にはそれぞれ、

A1セルに  名前
B1セルに  振込日
C1セルに  振込額

という様に項目名が並んでいて、実際のデータは、2行目以降に入力されているものとします。
 更に、B列には日付が連続して入力されていて、途中に文字列データが入力されているセルや、空欄は存在していないものとします。

 又、適当なSheetを作業用Sheetとして使用するものとします。
 ここでは仮に、Sheet9を作業用Sheetとします。
 まず、Sheet9のB1セルから下に向かって、

B1セルに  Sheet1
B2セルに  Sheet2
B3セルに  Sheet3
B4セルに  Sheet4
B5セルに  Sheet5
B6セルに  Sheet6
B7セルに  Sheet7
B8セルに  Sheet8

という具合に、クラスのデータが入力されている各SheetのSheet名を、間を空けずに入力して下さい。(並べ方が順不同でも正常に動作しますが、なるべくならクラス順に並べて下さい)
 次に、Sheet9のC1セルに次の数式を入力して下さい。

=IF($B1="","",COUNT(INDIRECT($B1&"!B:B")))

 次に、Sheet9のC1セルをコピーして、Sheet9のC2~C8の範囲に貼り付けて下さい。
 次に、Sheet9のA1セルに

0

と入力して下さい。

 次に、Sheet9のA2セルに次の数式を入力して下さい。

=IF($B1="","",SUM($C$1:$C1))

 次に、Sheet9のA2セルをコピーして、Sheet9のA3~A8の範囲に貼り付けて下さい。
 次に、Sheet9のE1セルに次の数式を入力して下さい。

=IF(ROW()>SUM($C:$C),"",INDIRECT(VLOOKUP(ROW()-1,$A:$B,2)&"!R"&ROW()-VLOOKUP(ROW()-1,$A:$A,1)+1&"C"&COLUMNS($A:A),FALSE))

 次に、Sheet9のD1セルに次の数式を入力して下さい。

=IF($F1="","",$F1+COUNTIF($F$1:$F1,$F1)/COUNTIF($F:$F,$F1))

 次に、Sheet9のE1セルをコピーして、Sheet9のF1セルとG1セルに貼り付けて下さい。
 次に、Sheet9のD1~G1の範囲をコピーして、同じ列の2行目以下に、(全てのクラスの合計人数を上回る行数になるまで)貼り付けて下さい。

 次に、別Sheet(並び替え結果を表示するSheet)のA2セルに次の数式を入力して下さい。

=IF(ROWS($1:1)>COUNT(Sheet9!$D:$D),"",VLOOKUP(SMALL(Sheet9!$D:$D,ROWS($1:1)),Sheet9!$D:$G,COLUMNS($A:B)))

 次に、別SheetのA2セルをコピーして、別SheetのB2セルとC2セルに貼り付けて下さい。
 次に、別SheetのB2セルの書式設定を[日付]にして下さい。
 次に、別SheetのA2~C2の範囲をコピーして、同じ列の3行目以下に、(全てのクラスの合計人数を上回る行数になるまで)貼り付けて下さい。

 以上です。

 尚、クラスのデータが入力されている各Sheetにおいて、実際のデータが入力されているのが、2行目からではなく、例えば3行目からである場合には、Sheet9のE1セルに入力する数式中の

+1

と記述されている箇所を、

+2

に変更して、

=IF(ROW()>SUM($C:$C),"",INDIRECT(VLOOKUP(ROW()-1,$A:$B,2)&"!R"&ROW()-VLOOKUP(ROW()-1,$A:$A,1)+2&"C"&COLUMNS($A:A),FALSE))

として下さい。

この回答への補足

ありがとうございます。詳しく細かく丁寧に書いていただいて、大変恐縮です。

ところで、申し訳ないのですが、こちらに質問をしている間に、当方の仕様が変わってしまいました。
元のクラス順の8シート(8クラス)は一つのシートに変更になりました。(1クラス~8クラスが縦に長く続いています。)元の質問と違うのですが、こちらでお世話になっているので、改めてお伺いさせていただいてよろしいですか?
改めて質問します。一つのシートにクラス順に出席番号順に350人分の、「振込日」と「振込金額があります。それを別のシートに全クラスのデータを「振込日別」に並べたいのです。
厚かましいですが、よろしければご教示ください。

補足日時:2010/12/28 16:59
    • good
    • 0

一回きりの作業であれば手作業で


それぞれのシートのデータをコピーして別シートの最後の貼り付けて
最後に並び替えします。
毎回発生する作業であれば
VBAの力をかりてプログラムを作成して
その作業のたびにボタンを押すということになると思います。
もしよければこれを機械にVBAについて勉強して見られては如何でしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。短期間に毎日、金額をチェックしたいのです。しかも使用者は私ではなく、別の者がしますので、何もしなくてもソートされている状態が理想です。
VBAは面白そうですので、今後機会があれば、挑戦したいと思います。

お礼日時:2010/12/28 16:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています