- 締切済み
EXCELで入力と同時に昇順表示がしたい
お世話になります、エクセル初心者です。 氏名を入力と同時に、昇順表示にしたいのですが ネットでいろんな所を探しても分かりません。 こちらでも探してみたのですが見つからず、お知恵拝借させていただければと思い 投稿させていただきました。 仕事で、ひと月の実績を昇順で氏名をリスト作成しているのですが 空き時間に実績がある方を入力できれば、少しでも効率化が図れるので助かります。 (現在ある2種類のシート) (1)氏名入力をすると住所が自動表示されるようにVLOOKUPで関数を入れたシート。 (2)(1)にデータが飛ぶようにするための、指名・住所の一覧 これとは別に氏名入力をしていくだけで、そのつど昇順になるシートができれば (1)のシートに氏名貼り付けをして、住所を引っ張ってこれるようにしたいのです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1には(1)の表が有って、シート2にはデータベースとして氏名と住所の表が有るとします。 シート1ではA列に氏名を入力すればB列にVLOOKUP関数でその方の住所が表示されるとします。そこで例えばC列から右の列には何かの実績を示す数値が入力されるとします。それらのデータに基づく氏名などのデータを昇順で並べたものを自動的にシート3に表示させるとしたら次のようにします。 なお、シート1では1行目は項目名でそれぞれのデータは2行目から下方に入力されているとします。 シート3のA1セルには、例えばシート1のC列でのデータを昇順で並べたときの表を作るとしたらシート1のC1セルに入力された項目名を入力します。 シート1の例えばJ列とK列には作業列を設けます。J2セルには次の式を入力して下方にドラッグコピーします。 =IF(OR(A2="",Sheet3!A$1=""),"",RANK(INDEX(A:I,ROW(),MATCH(Sheet3!A$1,A$1:I$1,0)),INDEX(A:I,2,MATCH(Sheet3!A$1,A$1:I$1,0)):INDEX(A:I,1000,MATCH(Sheet3!A$1,A$1:I$1,0)),1)+ROW(A1)/10000) K2セルには次の式を入力して下方にドラッグコピーします。 =IF(J2="","",RANK(J2,J:J,1)) シート3のA1セルにはシート1で昇順で並べたい項目名を入力します。 2行目にはシート1での1行目をコピーして貼り付けます。 A3セルには次の式を入力してI3セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(Sheet1!$K:$K),"",IF(INDEX(Sheet1!$A:$I,MATCH(ROW(A1),Sheet1!$K:$K,0),COLUMN(A1))="","",INDEX(Sheet1!$A:$I,MATCH(ROW(A1),Sheet1!$K:$K,0),COLUMN(A1)))) これでシート3のA1セルにシート1の1行目に入力された項目名を入力することでその項目名で昇順で並べられた表が自動的に表示されます。勿論、シート1でデータが下行に追加されることが有ればそのデータを自動的に取り込んでデータが昇順で並べられます。
- neKo_deux
- ベストアンサー率44% (5541/12319)
> 申し遅れましたが、セルの結合をして作表しておりました 結合したセルはソートできません。 であれば、根本的にやり方を見直す必要があるのでは? > どこを変更すればよいのかが分かりません・・・ 一度、やりたい並べ替えの手順をマクロで記録してみると良いです。 左下のステータスバーの「マクロの記録」をクリックして記録開始。 マクロ名はデフォルトのMacro1、保存先は作業中のブック やりたいソートを実施。Sheet3のA2~C5の範囲を選択、並び替え。 マクロの記録終了。 Alt+F11でVBAを開くと、対象ブックのModule1に、Macro1が記録されています。 説明のために行番号を付加して、こんな感じのハズ。 01:Sub Macro1() 02:' 03:' Macro1 Macro 04:' 05: 06: Range("A2:C5").Select 07: ActiveWorkbook.Worksheets("Sheet3").Sort.SortFields.Clear 08: ActiveWorkbook.Worksheets("Sheet3").Sort.SortFields.Add Key:=Range("A2"), _ 09: SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 10: With ActiveWorkbook.Worksheets("Sheet3").Sort 11: .SetRange Range("A2:C5") 12: .Header = xlNo 13: .MatchCase = False 14: .Orientation = xlTopToBottom 15: .SortMethod = xlPinYin 16: .Apply 17: End With 18:End Sub コメントや空行は削除。 06行目は、並べ替えの際にセルの選択は必須で無いので削除。 07~09行目はソート条件のクリア、条件設定ですが、10~17行目のソート実施があれば不要なので削除。 15行目はソートにふりがなを使う/使わないですが、差し当たり関係ないと判断して削除。 結果、記録したSheet3の指定範囲をソートする処理は、 Sub Macro1() With ActiveWorkbook.Worksheets("Sheet3").Sort .SetRange Range("A2:C5") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .Apply End With End Sub って事になるハズ。 処理の本体を、必要な場所のモジュールに貼り付けします。
お礼
遅くなりましたが、 色々と教えていただき感謝いたします★ 今回の表には、今の私の技術で生かすことができませんでしたが、 これから色々とExcelで作表していく中でぜひ、今回のお知恵を 活用できるよう、メモを取らせていただきました。 お忙しいところ、本当に有り難うございました!
補足
改めまして、再コメントありがとうございます。 なかなか難しいもんですね(T△T) 最初に教えていただいたところからVBAっていうのを開きましたが、 「こんな感じのハズ」とおっしゃったようになっていませんでした・・・ 私は途中で何をしてしまったのか・・・ VBAプロジェクトのSheet3をクリックして、右側に 「General」と「Macro1」というのがあって、その下に Sub Macro1() With ActiveWorkbook.Worksheets("Sheet3").Sort .SetRange Range("A2:C5") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .Apply End With End Sub をコピペしてみたけど、これが 「処理の本体を、必要な場所のモジュールに貼り付け」ってことなのか・・・ なんせ、エクセル初心者なものでモジュールっていうのすらわからずで(涙) VLOOKUPなども、ネットでやり方探してなんとかやりこなしている程度なもんで、 せっかく詳しく解説してくださったのに残念な結果で申し訳ないです。 理解ができなくてすみません。。。 でも、親切にお答えいただき本当にありがとうございます★☆
- neKo_deux
- ベストアンサー率44% (5541/12319)
> これとは別に氏名入力をしていくだけで、そのつど昇順になるシートができれば マクロで入力があった際に並べ替えするとかなら割と簡単です。 ・入力終了と同時に並べ替えされるので、どこに入力したか分からなくなります。 ・間違って入力したものも並べ替え、どこに行ったか探さなきゃならないので、修正が面倒です。 ・マクロの実行はさむとundo出来ません。 など、問題あると思いますが。 手順は、 Alt+F11でVBAを表示。 Sheet1を並べ替えたいとして、Sheet1を右クリック-[コードの表示]。 A列を並べ替えするとして、以下のコードをコピペ。 Private Sub Worksheet_Change(ByVal Target As Range) With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A:A") .Orientation = xlTopToBottom .Apply End With End Sub
補足
●neKo_deux様● 迅速な回答をありがとうございます! 操作手順分かりやすい文章で助かります。 さっそく試してみたところ、動じず・・・ 申し遅れましたが、セルの結合をして作表しておりましたm(__)m 貼り付け先を、エクセルを駆使して枠を作ったもので・・・ 作成しているエクセルでは sheet3で、 セルA~Cの3列 縦に2~5の4列 に氏名入力する表になっておりました。 そこで、以下を入力して試したところです。 どこを変更すればよいのかが分かりません・・・ お忙しい所誠に恐れ入りますが、助けていただけると幸いです。 Private Sub Worksheet_Change(ByVal Target As Range) With ActiveWorkbook.Worksheets("Sheet3").Sort .SetRange Range("A:A") .Orientation = xlTopToBottom .Apply End With End Sub
お礼
KURUMITO様、お返事遅くなりましたが、お知恵をありがとうございました! やはり初心者の私にはちょっと理解が難しく^^; もうちょっと勉強しなければ! でも、今後使い慣れていく段階で活用させていただける日がくると思いますので メモをとらせていただきます★ ありがとうございました★☆