- 締切済み
エクセルの関数?
シート1に氏名と性別と生年月日を入力したデータがいっぱいあるとします。このデータは毎日増えていきます。 そこで、シート1の並べ替えを行なわずシート2に生年月日順に並べ替えたデータが並ぶようにする方法ってありますか?
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- jindon
- ベストアンサー率43% (50/116)
気持ちは理解できますが。関数ですと退院日が同じ患者さんに問題が有ります。 この際、VBAで管理するのが一番だと思います。 書き込まれたコードを選択してそのままコピーして、所定の場所に貼り付けるだけです。 Private Sub Worksheet_Activate() Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") ws1.Cells.Copy With ws2.Cells .PasteSpecial .Select Application.CutCopyMode = False Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal End With Application.CutCopyMode = False ws2.Cells(1, 1).Select Set ws1 = Nothing Set ws2 = Nothing End Sub これですべて終わりますよ。
- imogasi
- ベストアンサー率27% (4737/17069)
現在使っているブックのカラクリが不思議で、それについての質問らしいですね。 並び変っているシートに関数式が全セルに入ってなければ 絶対VBAでソートされています。 関数でやれば、全セルにびっしり関数式を埋めこまないと もとシートからデータが移りません。関数はデータを受ける側で書かねばならないのが、大鉄則だからです。 VBE(VisualBasicEditor)を開き ModuleXXなどが無いか見れば、またその中に MacroXやSub XXX()が無いか見ればわかります。 (1)その時入力と同時に並べ替えが行われたり、Bookを閉じて開いた時に並べ替えが行われるのなら、イベントというキッカケを使っている筈です。 (2)ソートそのものは、マクロの記録を取ればわかるように、範囲.sort Key1:=列のセルで済みます。 #6の回答例のように。
- tinu 2000(@tinu2000)
- ベストアンサー率40% (147/366)
> 作った人がやめて聞けずにいます。 という事は、VBAが分かると見て。 =IF(Sheet1!A1="","",Sheet1!A1) をシート2のA1に貼り付け、 これを、横にG1までコピーします。 さらにA1~G1を縦に予想される行数までコピーする。 つまり、シート2の各セルはシート1の各セルを参照するようにする。 シート2で、ツール→マクロ→Visual Basic Editor の画面で、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Worksheets(2).Range("A1:C65536").Sort Key1:=Worksheets(2).Range("D1") End Sub を貼り付ける。 "A1:G65536" のGは横の数に合わせて下さい。 "A1:G65536" の65536は予想してコピーした縦の行数。
補足
すみません。私の頭がパニくってきました。 VBAは殆ど分かりません。 前に作ったやつがVBAを知っていたとは思えないんですが、VBAを使わないと出来ないんでしょうか?
- jindon
- ベストアンサー率43% (50/116)
#3+#4です。 D列で並べ替えですね? コード中の Selection.Sort Key1:=Range("A2"),,,,, の A2 を Selection.Sort Key1:=Range("D2"),,,, D2 に変えてください。
- jindon
- ベストアンサー率43% (50/116)
#3です。 元データの入ったシートをSheet1、 Sheet2に並べ替えます。 Sheet1のA列(A2より)に生年月日ということで、 VBAで 1.excel画面から Alt+F11 でVBEを起動します。 2.画面の左側のSheet2のアイコンをダブルクリック。 3.右画面に下のコードをコピー+ペースト Private Sub Worksheet_Activate() Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") ws1.Cells.Copy With ws2.Cells .PasteSpecial .Select Application.CutCopyMode = False Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal End With Application.CutCopyMode = False ws2.Cells(1, 1).Select Set ws1 = Nothing Set ws2 = Nothing End Sub 4.Alt+F11でexcel画面に戻る Sheet2を選択する度に、Sheet1をSheet2にコピーして A列で昇順に並べ替えます。
補足
回答有難うございます。 ちょっと難しすぎて私じゃ手におえなそうなかんじですね(TT)もうちょっと簡単なやり方みたいなのはありませんでしょうか?すみません。
- jindon
- ベストアンサー率43% (50/116)
関数でも、マクロでも出来ますが Sheet1のレイアウトが無いと具体的にかいとうできません。
補足
では具体的にシート1のレイアウトです。 A B C D E ・ ・ 1 1 ああ 2 1 いい 3 1 うう 4 1 ええ 5 1 おお ・ 2 かか ・ 2 きき ・ 2 くく A列は1が入院中で2が退院した人。 B列は氏名。C列は生年月日。D列は入院月日。E列以降は備考的欄です。 この形でシート2には入院月日順に並び変わったシートが出来上がっているんですよね。
- SAKURAMYLOVE
- ベストアンサー率30% (162/533)
yayu168さんの意に添っていないかもしれませんが、左端に1から通し番号をつけておき、生年月日順で並び替えを行い、シート2にコピーし、戻す時は通し番号を第一優先にして並び替えれするのではだめですか。
補足
回答有難うございます。シート2へのコピー作業はなしなんですよ。私もその方法とかを考えていたんですが、実際に自動に並び変わるもんでどうなってるのかなやんでるんですよね。
- sanakazu
- ベストアンサー率18% (43/230)
シート2はシート1の内容を参照(例;=Sheet1!A1)、シート2の生年月日が入力されている列を選んで「昇順で並び替え」ではいけませんか?
補足
シート2での並べ替え手順なしでシート2には自動的に並び替わっているのがいいんですよ。実は私が貰っているデータが自動的に並び変わっていて作った人がやめて聞けずにいます。ど~考えても、何かシート自体に命令をかけているとしか思えないような感じがするんですよね。
補足
回答有難うございます。セルにはシート1を見に行ってる関数くらいで大した関数は入っていません。やはりVBEなんですね。VBEのところをみても何かよく分からないし、今の私にはど~も手におえる代物ではなさそうなので自分なりにやりやすい方法でする事にします。 皆様、有難うございました。