これは関数では難問(ややこしい)と思う。
ーー
VBA向きの課題と思う。
プログラムが組めれば、項目ID(例 氏名、キーワードなど)によって、所定列に振り分けれは済む。ただし、どの人の項目か注意が必要。人によって、データのない項目があるようだから。
ーーー
関数で考えてみた。複雑なので、付いてこれるかな。また件数も多いようなので、関数設定数セル数も多くなるので、エクセルが動かないといった事態もあるかもしれない。
ーー
氏名はデータの1人分の塊の中で、必ずあるものと仮定。
下記で説明している関数式は、99行までの例にしている。5000人なら範囲の終わりを5000x項目数予想数に、そのように修正すること。
ーー
(1)エクセルにデータを読み込み(人手でエクセル操作)
A列のデータになる。
(2)姓と名の間にスペースがあれば、
姓+スペース==>姓+特殊記号(%など)で置換する。質問例では
姓と名は詰まっているようだ。なので下記説明では省略。置き替えた場合は、作業の終了後、氏名列で%-->スペースに置き換えること。下記(3)で姓と名が別列になり、困るのでこういうことをする。
(3)データー区切り位置、の操作で、項目名とデータに分離
(人手でエクセル操作)
A列+B列のデータになる。
(4)項目名について、何番目の人のデータなのか、割り出し番号化
(関数式作成)
(5)Sheet2で(4)の番号を元に、項目を横方向に考え、
データをSheet1のB列から組み替え。(関数式作成)
ーー
例データ
下記は(3)を終わった状態から説明
当初はA列+B列にデータあり。
E-J列は下記で説明する式で出来た結果(を先回り表示した部分)
更新日 氏名 生年月日 所属機関 更新日 キーワード
更新日 2008/9/18 1 1
氏名 両津カンキチ 1
所属機関 亀有公園前派出所 1
更新日 2008/9/18 2 2
氏名 大空翼 2
生年月日 1900/1/1 1
所属機関 ナンカツ小 2
キーワード サッカー 2
更新日 2008/10/18 3 3
氏名 三浦健 3
更新日 2008/10/18 4 4
氏名 三浦勇 4
所属機関 ナンカツ小 4
キーワード 空手 4
ーーーーーー
E1:J1に
氏名 生年月日 所属機関 更新日 キーワード
を入力しておくこと(式の中で参照しているので必須)。更新日を最初にしてないのは、氏名を主にしたことから来る事情によるもの。
E2の式
=IF(MID($A2,1,LEN(E$1))=E$1,MAX(E$1:E1)+1,"")
下方向に式を複写。
結果
上記E列
F2の式
=IF(MID($A2,1,LEN(F$1))=F$1,COUNTIF($A$2:$A2,"氏名"),"")
この式を下方向に式を複写。
G2の式
=IF(MID($A2,1,LEN(G$1))=G$1,COUNTIF($A$2:$A2,"氏名"),"")
H2の式
=IF(MID($A2,1,LEN(H$1))=H$1,COUNTIF($A$2:$A3,"氏名"),"")
I2の式
=IF(MID($A2,1,LEN(I$1))=I$1,COUNTIF($A$2:$A3,"氏名"),"")
それぞれ下方向に式を複写。
結果
上表のとおり。
ーーーーーーーーーーーー
Sheet2に行って
A1:E1に
更新日 氏名 生年月日 所属機関 キーワード
を入れる。項目見出し。
A2に
=INDEX(Sheet1!$A$1:$B$100,MATCH(ROW()-1,Sheet1!$I$1:$I$100,0),2)
B2に
=INDEX(Sheet1!$A$1:$B$100,MATCH(ROW()-1,Sheet1!$F$1:$F$100,0),2)
C2に
=INDEX(Sheet1!$A$1:$B$100,MATCH(ROW()-1,Sheet1!$G$1:$G$100,0),2)
D2に
=INDEX(Sheet1!$A$1:$B$100,MATCH(ROW()-1,Sheet1!$J$1:$J$100,0),2)
E2に
=INDEX(Sheet1!$A$1:$B$100,MATCH(ROW()-1,Sheet1!$I$1:$I$100,0),2)
ト入れて下方向に式を複写。
結果
更新日 氏名 生年月日 所属機関 キーワード
#N/A #N/A 亀有公園前派出所 #N/A #N/A
サッカー 1900/1/1 ナンカツ小 2008/9/18 サッカー
#N/A #N/A #N/A 2008/10/18 #N/A
空手 #N/A ナンカツ小 2008/10/18 空手
#N/A #N/A #N/A #N/A #N/A
ーー
#N/Aを出さないようにするには、長くなるので説明を省くが、
下方向のものはGoogleでimogasi方式で照会すると出てくる
例の中に説明している。
途中の存在しない項目の#N/AはISERRORなどで、エラーを捉え、IF文で判別し、エラーの場合は、空白("")でおき変える。
お礼
Kater_Kurz様、この上ないアドバイスをいただき感謝申し上げます。目からうろこが落ちる思いがいたしました。ご教示いただいた方法で作業をしたいと思います。ありがとうございました。