- ベストアンサー
ExcelでIDごとの日付を一覧表にする方法
- ExcelでIDごとに日付が入った元データがあります。そのデータを元に、IDごとの日付を一覧表にしたいです。
- 具体的には、一人一行でIDごとに日付を並べた表を作成したいです。
- IDを元に氏名を取得するにはVLOOKUP関数を使用しましたが、日付部分にどのような関数を使用すればいいかわかりません。Excelは2000を使用しています。
- みんなの回答 (10)
- 専門家の回答
その他の回答 (9)
- merlionXX
- ベストアンサー率48% (1930/4007)
No5 merlionXXです。 > 出来るかな…。 書いた手順どおりやってくれれば簡単にできますよ。 > でもこれってデータ内容が変わった時もそのまま使えるんでしょうか? データがSheet1のABC列にあり、転記用のSheet2が存在するのならOKです。 別にデータがIDや名前でソートされていない状態でもだいじょうぶです。
お礼
せっかく教えて頂いたのでこちらもぜひやってみようと思います。 これを気にVBAも勉強します。 ありがとうございました。
[No.6この回答への補足]へのコメント、 》 最初の判定の条件で何故COLUMN関数を使っているのでしょうか? 当該式を入力したセル G2 中の COLUMN(A1) は 1 を返すことはお分かりでしょうか? この式を右隣にドラッグ&ペーストすると COLUMN(A1) だったところは COLUMN(B1) に変化します。 COLUMN(B1) は 2 ですね。 セル I2 では COLUMN(C1) となって 3 になります。 つまり、右へ右へで 1、2、3、… なる連続数値を得るために「COLUMN関数を使っている」のです。 》 列位置も省略できるものなんでしょうか? 良い質問ですねぇ! =INDEX(array,row_num,column_num) 上式で column_num が 1(1列)の場合は =INDEX(array,row_num,1) でも =INDEX(array,row_num,) でも =INDEX(array,row_num) でもOKです。
お礼
なるほど!! 特に意味があるってわけでもないんですね。 要は使いよう、アイデアってことですか! ん~納得!すごい!これはテクニックですね。 ぜひこれから使って行きたいと思います。 INDEX関数そういうことだったんですね。 調べはしたものの、そこまで分かってませんでした。 これも理由が分かってスッキリしました。 解説までして頂いて、ほんとにありがとうございました。 おかげさまで仕事もはかどり、周りからすごいと言われました。 私の力じゃないけど…(^^;
- layy
- ベストアンサー率23% (292/1222)
>思っていたよりややこしくなるんですね(^^; そう感じるのは当然でしょう。 数式なんてのは ○○の結果でXXして、さらに△△して□□して・・・と 途中何が起きているか見えないので、 それを整理できないと、馴れるまではいざ一気に(1行で)は書けないもの。 作業用D列を用意して | ID | 氏名 | 日付 |順 | 11 | ○○○ | 20110105 |1 | 11 | ○○○ | 20110208 |2 | 11 | ○○○ | 20110812 |3 | 22 | △△△ | 20110319 |1 | 22 | △△△ | 20110525 |2 これがあるだけでも見方が変わります。 それに、 回答は、 結果が出るだけで理屈までは説明がないのがほとんど・・・。 使われている関数を復習して調べるまでしないと力になりません。
お礼
回答ありがとうございます。 なるほど。順位を付けておいてもできるんですね。 奥が深いです。
- MackyNo1
- ベストアンサー率53% (1521/2850)
>配列数式…初めて聞きました(^^; 配列数式の概要は、以下のページを参考にしてください。 http://pc.nikkeibp.co.jp/pc21/special/hr/ 配列数式は、複雑な計算が補助列なしに計算ができ、数式を簡略化するには極めて有効な手段ですが、オートフィルコピーなどで配列数式のセルが多くなると(例えば数式セルが100を超えるような場合)、再計算に時間がかかり、シートの動きが重くなることもありますので、ケースバイケースで使用されるとよいと思います。 ちなみに、今回提示した数式はCtrl+Shift+Enterで確定しない数式もありますが、いずれも配列数式です。
お礼
なるほど!配列数式…恐るべしです。便利!! 私はいつも補助列使いまくりです。 私のような初心者にはまだまだ慣れが必要そうですね。 これを機会に配列数式やVBAを勉強したいと思います。 ありがとうございました。
- merlionXX
- ベストアンサー率48% (1930/4007)
データはSheet1のABC列にあるものとします。 Sheet2に転記するVBAを組んでみました。 手順は以下のとおりです。簡単ですよ。 1.エクセルの画面から、AltキーとF11キー同時に押し(以下Alt+F11キーと記述)て Visual Basic Editor を呼び出します。 2.Visual Basic Editor のメニューから「挿入」、「標準モジュール」で出てきたコードウィンド(右側の白い広い部分)に以下のコード(Sub~End Sub)をコピペします。 '********これより下********** Sub test01() Dim myRng As Range, myC As Range Dim myDic As Object Dim myV Dim i As Long Set myDic = CreateObject("Scripting.Dictionary") With Sheets("Sheet1") Set myRng = .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) For Each myC In myRng If Not myDic.Exists(myC.Value) Then myDic.Add myC.Value, myC.Offset(, 1).Value End If Next ReDim myV(1 To myDic.Count, 1 To 3) For i = 1 To myDic.Count myV(i, 1) = myDic.Keys()(i - 1) myV(i, 2) = myDic.Items()(i - 1) Next i myDic.RemoveAll For Each myC In myRng If Not myDic.Exists(myC.Value) Then myDic.Add myC.Value, CStr(myC.Offset(, 2).Value) Else myDic(myC.Value) = myDic(myC.Value) & "@" & CStr(myC.Offset(, 2).Value) End If Next For i = 1 To myDic.Count myV(i, 3) = myDic.Items()(i - 1) Next i End With With Sheets("Sheet2") .Range("A1").Resize(myDic.Count, 3).Value = myV .Columns("C:C").TextToColumns Destination:=Range("C1"), Other:=True, OtherChar:="@" End With Set myDic = Nothing Set myRng = Nothing End Sub '********これより上********** 3.Alt+F11キーでワークシートへもどります。 4.Alt+F8キーで出てきたマクロ名(test01)を選択して実行します。 これでSheet2にご希望の形で展開されたと思います。
お礼
わざわざプログラムを書いて頂いてありがとうございます。 VBAは使ったことないのでなんか難しそうです。(^^; 出来るかな…。 でもこれってデータ内容が変わった時もそのまま使えるんでしょうか?
- MackyNo1
- ベストアンサー率53% (1521/2850)
No3の回答の補足です。 もし、Sheet2のリストから重複のないID番号を自動取得したいなら(データを変更すると自動的にその番号だけ表示される)、A列のセルに以下のような関数を入力して下方向にオートフィルしてください。 =INDEX(Sheet2!B:B,SMALL(INDEX((MATCH(Sheet2!$A$2:$A$200&"",Sheet2!$A$2:$A$200&"",)<>ROW($A$2:$A$200)-1)*1000+ROW($A$2:$A$200),),ROW(A1)))&"" なお、上記のROW($A$2:$A$200)-1)の「200」の入力されている部分はデータ範囲よりも少し大きめに範囲指定して、「-1」の部分はデータの開始行によって適宜調節してください(2行目からなら2-1で「1」)。 また表示シートのC列の数式は、例えば「=IF(A2="","",元の式)」のような数式にすると良いかもしれません。
お礼
補足までして頂いてありがとうございます。m(__)m
- MackyNo1
- ベストアンサー率53% (1521/2850)
元データがSheet2にあり、日付が8桁の数字で入力されているなら、直接C列を参照する以下のような配列数式で表示できます。 =IF(COUNTIF(Sheet2!$A:$A,$A2)>COLUMN(A1),SMALL(IF(Sheet2!$A$2:$A$200=$A2,Sheet2!$C$2:$C$200,""),COLUMN(A1)),"") 上記の式はCtrl+Shift+Enterする必要がありますが、以下のような数式にすれば、そのまま入力するだけで表示できます・ =IF(COUNTIF(Sheet2!$A:$A,$A2)>COLUMN(A1),SMALL(INDEX((Sheet2!$A$2:$A$200<>$A2)*10^9+Sheet2!$C$2:$C$200,),COLUMN(A1)),"") 日付の数字を文字列で表示してもよいなら以下のような数式が簡単です。 =INDEX(Sheet2!$C:$C,SMALL(INDEX((Sheet2!$A$2:$A$200<>$A2)*1000+ROW($A$2:$A$200),),COLUMN(A1)))&""
お礼
配列数式…初めて聞きました(^^; Excelはそこそこに使ってきてますが、全然知りませんでした。 そういうものがあるんですね。 どういった時に使えるものなんでしょう? いまいちどういうものか理解できませんが…。 書いて頂いた数式はNo.1の方のと似ていますね。 試してみたいと思います。 ありがとうございました。
- layy
- ベストアンサー率23% (292/1222)
名前単位で1つ目2つ目と連番があれば、別シートへ転記するときに、連番1はC列、2はD列、3はE列という仕組みはできます。VBAとコントロールブレイクの知識が必要です。 アクセスあれば、クロス集計クエリが使えます。
お礼
VBAというレベルではないので関数でしたく思っています。 今回はExcelでという質問なのですが…。
- mu2011
- ベストアンサー率38% (1910/4994)
一例です。 仮にSheet1に元表、Sheet2のC2に以下の数式を入力(入力完了時にshift+ctrl+enterキーを同時押下)、縦横に必要分コピー =IF(COUNTIF(Sheet1!$A:$A,$A2)>=COLUMN(A1),INDEX(Sheet1!$C:$C,SMALL(IF(Sheet1!$A$1:$A$100=$A2,ROW(Sheet1!$A$1:$A$100),9999),COLUMN(A1))),"")
お礼
ご回答ありがとうございます。 思っていたよりややこしくなるんですね(^^; 早速試してみたいと思います。
お礼
おぉ!画像まで貼って頂いてなんて分かりやすい! 早速試してみたいと思います。 ありがとうございました。m(__)m
補足
回答ありがとうございました。 おかげさまで簡単に思っていた通りの表を作ることができました。 ただ、COLUMN関数やINDEX関数に慣れておらず初めて使ったので、 もしよろしければNo.様、関数の意味を教えて頂けないでしょうか? まず、最初の判定の条件で何故COLUMN関数を使っているのでしょうか? そして後ろのINDEX関数は「INDEX(範囲,行位置,列位置 [,領域番号])」 となると思うのですが、今回の場合は列位置がない状態に思えます。 領域番号だけでなく、列位置も省略できるものなんでしょうか? 基本的なことかもしれませんが、もしよろしければ教えて下さい。 初心者ですみません。