>お正月休暇を使って作ってみましたが、 出来ましたら、確認に長時間掛る場合は、その旨のレスを付けて頂くと 回答で作成した環境を維持しておきますのでので助かります。
>設定の、B2のセルに式を入れても、9.53595E+11のような結果にしかなりません。 それで正しいのですが・・・・各数式の意図は理解されましたか?
>間違っているのでしょうか、 >参照しているセルはA2のふりがなのところでよろしいんですよね? >別シートの名簿の方でしょうか? 難解な数式でしたでしょうか?
こちらで、前回回答を新規ブックで設定して確認しましたが 入力の振り仮名で『あいうえお』順に表示されますので 回答内容に問題は無いはずなのですが・・・・?
一応、各数式の処理内容を補足しておきます 【全体像】 1)『元データ』シートのA列の氏名の読みを、 『作業』シートのA列にPHONETIC関数でカタカナで取り出す 2)取り出したカタカナを1文字毎にCODE関数で 文字コード(1文字最大4桁の数字)に変換 3)EXCELの数値の有効桁はMax15桁なので3文字(4桁×3文字=12桁)毎に数値化する --->最大27文字を想定しているので27/3で9列の作業列を使用 4)昇順に並べる為にRANK関数で昇順の順位を求める 5)4で求めた順位を3列分まとめて数値化し、更にRANK関数で順位を計算 --->9列/3列で3列の作業列を使用 6)5で求めた順位を3列分まとめて数値化し、更にRANK関数で順位を計算 --->この順位が最終の表示順になる 7)『氏名順』シートに6で求めた表示順にデータを表示する
>■■作業■■ >以下の数式を2行目に入力後、3〜1000行へコピー
>・A2:=PHONETIC(元データ!B2) >・B2:=IF($A2="","", > VALUE( > TEXT(IF(MID($A2,(COLUMN(A1)-1)*3+1,1)="",0,CODE(MID($A2,(COLUMN(A1)-1)*3+1,1))),"0000")& > TEXT(IF(MID($A2,(COLUMN(A1)-1)*3+2,1)="",0,CODE(MID($A2,(COLUMN(A1)-1)*3+2,1))),"0000")& > TEXT(IF(MID($A2,(COLUMN(A1)-1)*3+3,1)="",0,CODE(MID($A2,(COLUMN(A1)-1)*3+3,1))),"0000") > )) A列(振り仮名)が空白なら空白の文字列""をセット A列が空白でない時は 先頭から1文字目を取り出し空白でなければCODE関数で文字コードを4桁の数字で求める 同様に、2文字目・3文字目も空白かを確認の上文字コードを求め 3文字分の文字コードを&で文字連結して、最終的にVALUE関数で数値化する
>・C2〜J2:B2をセルコピー B列の数式をコピーする事で、取り出す文字位置が変化します ★1文字目MID($A2,(COLUMN(A1)-1)*3+1,1) B列では MID($A2,(COLUMN(A1)-1)*3+1,1) ---> MID($A2,(1-1)*3+1,1) ---> MID($A2,1,1) C列では MID($A2,(COLUMN(B1)-1)*3+1,1) ---> MID($A2,(2-1)*3+1,1) ---> MID($A2,4,1) D列では MID($A2,(COLUMN(C1)-1)*3+1,1) ---> MID($A2,(3-1)*3+1,1) ---> MID($A2,7,1) ・・・ J列では MID($A2,(COLUMN(I1)-1)*3+1,1) ---> MID($A2,(9-1)*3+1,1) ---> MID($A2,25,1)
★2文字目MID($A2,(COLUMN(A1)-1)*3+2,1) B列では MID($A2,(COLUMN(A1)-1)*3+2,1) ---> MID($A2,(1-1)*3+2,1) ---> MID($A2,2,1) C列では MID($A2,(COLUMN(B1)-1)*3+2,1) ---> MID($A2,(2-1)*3+2,1) ---> MID($A2,5,1) D列では MID($A2,(COLUMN(C1)-1)*3+2,1) ---> MID($A2,(3-1)*3+2,1) ---> MID($A2,8,1) ・・・ J列では MID($A2,(COLUMN(I1)-1)*3+2,1) ---> MID($A2,(9-1)*3+2,1) ---> MID($A2,26,1)
★3文字目MID($A2,(COLUMN(A1)-1)*3+3,1) B列では MID($A2,(COLUMN(A1)-1)*3+3,1) ---> MID($A2,(1-1)*3+3,1) ---> MID($A2,3,1) C列では MID($A2,(COLUMN(B1)-1)*3+3,1) ---> MID($A2,(2-1)*3+3,1) ---> MID($A2,6,1) D列では MID($A2,(COLUMN(C1)-1)*3+3,1) ---> MID($A2,(3-1)*3+3,1) ---> MID($A2,9,1) ・・・ J列では MID($A2,(COLUMN(I1)-1)*3+3,1) ---> MID($A2,(9-1)*3+3,1) ---> MID($A2,27,1)
>・K2:=IF(A2="","",--(TEXT(RANK(B2,B:B,2),"0000")&TEXT(RANK(C2,C:C,2),"0000")&TEXT(RANK(D2,D:D,2),"0000"))) A列が空白の時は空白の文字列をセット 空白でない時は、現在行のB列・C列・D列の値が、各列内で何番目に小さいかを RANK関数で求め、TEXT関数で各々4桁の数字にした上で&で文字連結し、 その結果を空演算(--)することで数値化(--()はVALUE()と同じ動作をします)
>・L2:=IF(A2="","",--(TEXT(RANK(E2,E:E,2),"0000")&TEXT(RANK(F2,F:F,2),"0000")&TEXT(RANK(G2,G:G,2),"0000"))) >・M2:=IF(A2="","",--(TEXT(RANK(H2,H:H,2),"0000")&TEXT(RANK(I2,I:I,2),"0000")&TEXT(RANK(J2,J:J,2),"0000"))) K2と同様の処理をL列ではE〜G列を対象に、M列ではH〜J列を対象に行う K〜M列は各々、1〜9文字目、10〜18文字目、19〜27文字目を纏めた事になる
>・N2:=IF(A2="","",--(TEXT(RANK(K2,K:K,2),"0000")&TEXT(RANK(L2,L:L,2),"0000")&TEXT(RANK(M2,M:M,2),"0000"))) K2と同じ処理を、K〜M列の結果に対して行う ここまでで、全27文字を数値化したことになる
>・O2:=IF(A2="","",RANK(N2,N:N,2)*10000+ROW()) 同一文字が有る場合を想定して、N列をRANK関数で順位付けした値を 10000倍(最大件数が1000件なので)して、現在行番号『ROW()』を加算することで 順位に重み付けをする
>・P2:=IF(A2="","",RANK(O2,O:O,2)) O列で重み付けした順位で再度昇順順位を計算 この値が、『名前順』シートでの表示順番になります >・Q2:=ROW() 現在行番号(すなわち『元データ』での行位置)をセットします
>■■氏名順■■ >1)A1に =COUNT(作業!P:P) 『作業』シートのP列の数値セル数をカウントすることで 表示するデータが何件有るかを求める
>2)B1に以下の数式を入力してC1以降必要列にコピー > =元データ!A1 項目行のセット B1〜E1に 社番・名前・住所・年齢 が表示される
>3)A2に以下の数式を入力してA3〜A1000へコピー > =IF(ROW(A1)>$A$1,"",VLOOKUP(ROW(A1),作業!P:Q,2,FALSE)) ・現在表示するデータ件数『ROW(A1)』が、総表示件数『$A$1』を 超過した場合は、表示データ無しなので空白の文字列をセット ・それ以外のときは、表示データが有るので VLOOKUP関数で、表示順位で『作業』シートのP列を検索し Q列の値(『元データ』シートの該当データの行番号)を抽出
>4)B2に以下の数式を入力してB2〜E1000(最終列の1000行まで)へコピー > =IF($A2="","",IF(INDEX(元データ!A:A,$A2)="","",INDEX(元データ!A:A,$A2))) INDEX関数で、目的の『元データ』の列から、指定した行番号のデータを参照 参照結果が空白のセルの場合0が表示されるのを防ぐため IF関数で空白かをチェックし、空白の場合は空白の文字列をセット そうで無いときは、再度INDEX関数でデータを参照。
|