アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルで一覧表を作っています。
以下のようなことができるか、教えてください。

(例)
Sheet1(シート名:い)
A列  B列  C列     D列  E列  F列
1   田中  2017/3/1
2   鈴木  2017/3/1
3   佐藤  2017/3/5
4   鈴木  2017/3/8
5   佐藤  2017/3/11
6   山本  2017/3/19
7   田中  2017/3/22
8   田中  2017/3/28

Sheet2(シート名:ろ)
A列  B列  C列     D列  E列  F列
1   高橋  2017/3/4
2   山本  2017/3/9
3   高橋  2017/3/12
4   鈴木  2017/3/15
5   高橋  2017/3/17
6   高橋  2017/3/23
7   佐藤  2017/3/26

Sheet3(シート名:は)
A列  B列  C列     D列  E列  F列
1   田中  2017/3/15
2   山本  2017/3/23

例として上記のような表があります。

・シートが3つあり、それぞれ「い」・「ろ」・「は」という名前が付いています。
・A列には通し番号が入ります。
・B列には人の名前が入り、同じ人が何度も登場します。
・C列には時系列で日付が入ります。
 「名前+日付」の組み合わせで重複するものはありません。
・表はこれからも、下にどんどん増えていきます。

この表に、同じ人が時系列で何回目に登場しているのかを
一目で分かるようにしたいのです。
また、前回は“どのシート”の“通し番号何番”だったのかも
併せて分かるようにしたいです。

(例)
Sheet1(シート名:い)
A列  B列  C列     D列  E列  F列
1   田中  2017/3/1  1   -   -
2   鈴木  2017/3/1  1   -   -
3   佐藤  2017/3/5  1   -   -
4   鈴木  2017/3/8  2   い   2
5   佐藤  2017/3/11  2   い   3
6   山本  2017/3/19  2   ろ   2
7   田中  2017/3/22  3   は   1
8   田中  2017/3/28  4   い   7

Sheet2(シート名:ろ)
A列  B列  C列     D列  E列  F列
1   高橋  2017/3/4   1   -   -
2   山本  2017/3/9   1   -   -
3   高橋  2017/3/12  2   ろ   1
4   鈴木  2017/3/15  3   い   4
5   高橋  2017/3/17  3   ろ   3
6   高橋  2017/3/23  4   ろ   5
7   佐藤  2017/3/26  3   い   5

Sheet3(シート名:は)
A列  B列  C列     D列  E列  F列
1   田中  2017/3/15  2   い   1
2   山本  2017/3/23  3   い   6

上記のように、D列には同じ人の中で何回目の登場かを、
E列には同じ人の前回のデータ行があるシート名を、
F列には同じ人の前回のデータ行にある通し番号を、
該当なしにはハイフンが入るようにしたいのですが、
関数だけでこういうことが出来るでしょうか?

よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    早速お答えくださり、ありがとうございます。
    試してみましたところ、最初の「同シート内で何回目か」の所から躓いています。

    「い」のシートではうまくいったのですが、続く「ろ」と「は」では
    #VALUE!の嵐状態になってしまいます。

    どうもIF条件で””=ブランクの結果になると、そこにMAXの数値を足すことができないみたいです。
    もしかしたら、別シートを作成してIF条件とMAXの数値を足すようにすればいいのかもしれません。

    それから書き忘れていましたが、シートの数は3つでよいのですが、
    名前欄に登場する人は、重複を除いても現時点で1000人を超え、これからも増える予定です。
    例示では端的に分かりやすくするために5人しか登場させてません。

    今現在は新しくデータを追加する際に、手動で前回分の通し番号等を入力しています。
    見落とし等のミスが怖いので自動入力化したいのですが、できるでしょうか?

    「複数のシートで散在するデータを日付順にナ」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2017/03/11 11:52
  • うーん・・・

    ありがとうございます。早速試してみました。

    「い」の分はうまくいきました。
    IDもきっちりふれますし、データの増加分も反映されます。

    しかし、「ろ」の分から#NAME?となってしまいます…。
    どうしたらよいのでしょうか?

    「複数のシートで散在するデータを日付順にナ」の補足画像2
    No.2の回答に寄せられた補足コメントです。 補足日時:2017/03/11 14:03
  • うれしい

    自分なりに考えたり調べたりして、名前の抽出は何とかできるようになりました。

    シート名:作業用-名前抽出
    B2=IF(INDIRECT(IF(ROW()-1>MAX(い!A:A),IF(ROW()-1>MAX(い!A:A)+MAX(ろ!A:A),"は!B"&ROW()-MAX(い!A:A)-MAX(ろ!A:A),"ろ!B"&ROW()-MAX(い!A:A)),"い!B"&ROW()))=0,"",INDIRECT(IF(ROW()-1>MAX(い!A:A),IF(ROW()-1>MAX(い!A:A)+MAX(ろ!A:A),"は!B"&ROW()-MAX(い!A:A)-MAX(ろ!A:A),"ろ!B"&ROW()-MAX(い!A:A)),"い!B"&ROW())))

    これで「名前抽出&該当なしには空白」にできました。
    もう少しスマートな式でもできるかもしれません。

      補足日時:2017/03/12 11:25
  • つらい・・・

    「ろ」
    G2=IF($B2=G$1,COUNTIF($B$2:$B2,$B2)+MAX(い!G:G),"")
    「は」
    G2=IF($B2=G$1,COUNTIF($B$2:$B2,$B2)+IF(MAX(ろ!G:G)>0,MAX(ろ!G:G),MAX(い!G:G)),"")

    これで同じ人毎の番号振りまでは、なんとか出来るようになりました。
    しかしそこから先、セル位置表示がうまくできません。
    画像のように「い・ろ・は」シート全てに数字がある人しか表示されません。
    「ろ」か「は」のシートで全行空白だと、うまく拾えないようです。

    ここをクリアできれば、最後までうまく出来そうな気がするのですが…。
    あまり詳しくないのでお手上げ状態です。

    「複数のシートで散在するデータを日付順にナ」の補足画像4
      補足日時:2017/03/12 12:24
  • どう思う?

    「この数式には問題があります。」とメッセージが出ます。

    「複数のシートで散在するデータを日付順にナ」の補足画像5
    No.3の回答に寄せられた補足コメントです。 補足日時:2017/03/12 17:09
  • うーん・・・

    こうなりました。1900年??

    「複数のシートで散在するデータを日付順にナ」の補足画像6
    No.4の回答に寄せられた補足コメントです。 補足日時:2017/03/12 18:35
  • どう思う?

    失礼いたいたしました。
    表示方法を変更したら、こうなりました。

    「複数のシートで散在するデータを日付順にナ」の補足画像7
      補足日時:2017/03/12 18:49
  • うれしい

    すみません。こちらの勘違いでした。
    これでD列はうまくいきました。
    あと残るのは、E列とF列の#VALUE!表示を解決することです。
    お世話になりっぱなしで、申し訳ございません。

    「複数のシートで散在するデータを日付順にナ」の補足画像8
    No.5の回答に寄せられた補足コメントです。 補足日時:2017/03/12 19:33
  • HAPPY

    F列は式の最後に-1を足せば完成

    「複数のシートで散在するデータを日付順にナ」の補足画像9
    No.8の回答に寄せられた補足コメントです。 補足日時:2017/03/12 23:50

A 回答 (8件)

Ⅱ-2がエラーでないのは良かったです。


INDIRECTの中身が範囲指定なので、試してもらう内容としては失敗でした。(汗)
="作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)
と、中身だけを試してもらうべきでした。
しかし、エラーとなっていないのであれば中身も問題ないかと思います。
それよりもⅡ-1が問題ですね。ⅡはⅡ-1を含んでいるので、Ⅱ-1がエラーのせいでエラーなのだと思います。

=INDIRECT("作業用の日付順!"&MATCH(C5,LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1),FALSE)&D5)
がエラーということですが、
Ⅰによって
=LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)は「H」と表示されているということなので、
=INDIRECT("作業用の日付順!"&MATCH(C5,"H",FALSE)&D5)
あぁ…これは明らかにミスってますね。すみません。
ここのMATCHは不要で、
=INDIRECT("作業用の日付順!"&"H"&D5)
となれば問題ないはずなので、

E5=IF(D5=1,"-",LEFT(INDIRECT("作業用のセル位置!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用の日付順!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&D5),INDIRECT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)),1))
ではどうでしょうか?

上手くいったのであれば、F5も
F5=IF(D5=1,"-",RIGHT(INDIRECT("作業用のセル位置!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用の日付順!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&D5),INDIRECT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)),LEN(INDIRECT("作業用のセル位置!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用の日付順!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&D5),INDIRECT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)))-3))
としてみてください。
E5がおかしければ、こちらもおかしいので試さなくていいです。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます! できました!!
本当に出来るものなんですね!

ただ、F列が補足画像のように1多い状態ですので、
式の最後に-1を足しておけば完成でしょうか?

実はもう一つ出来ればいいなと思っていることがあります。

先日「同じ名前の中でランク付けをする方法」という質問をしたのですが、
それに今回の「3つのシートに散在しているデータを時系列で」を
組み合わせたいのです。実はこれが本命でして…。
シートをまたいで日付順にどうこうするということが
実際に出来るとは思っていませんでしたもので。
しかし、今回でそれも実現可能だろうということが分かりましたので
また機会を改めて質問したいと思います。

お忙しい所、長々とお付き合いくださりありがとうございました。

お礼日時:2017/03/12 23:48

E,FはDと別にエラーが出てたわけですね。


※とりあえず先にほぼ下端の方にある☆マークで区切っている行を先に確認してください。
 色々書いた後で気付いたので、それが原因なら前半読む意味なしです。



先程同様かと思いましたが、こちらは()の数は合ってるようですね。
内容を順に検証します。

E2=IF(①D2=1,"-",LEFT(②INDIRECT(③"作業用-セル位置!"&LEFT(④ADDRESS(⑤1,MATCH(⑥B2,$1:$1,FALSE❻),4❺),LEN(⑤ADDRESS(⑥1,MATCH(⑦B2,$1:$1,FALSE❼),4❻)❺)-1❹)&MATCH(④INDIRECT(⑤"作業用-日付順!"&MATCH(⑥C2,LEFT(⑦ADDRESS(⑧1,MATCH(➈B2,$1:$1,FALSE❾),4❽),LEN(⑧ADDRESS(➈1,MATCH(⑩B2,$1:$1,FALSE❿),4❾)❽)-1❼),FALSE❻)&D2❺),INDIRCT(⑤"作業用-日付!"&LEFT(⑥ADDRESS(⑦1,MATCH(⑧B2,$1:$1,FALSE❽),4❼),LEN(⑦ADDRESS(⑧1,MATCH(➈B2,$1:$1,FALSE❾),4❽)❼)-1❻)&":"&LEFT(⑥ADDRESS(⑦1,MATCH(⑧B2,$1:$1,FALSE❽),4❼),LEN(⑦ADDRESS(⑧1,MATCH(➈B2,$1:$1,FALSE❾),4❽)❼)-1❻)❺),FALSE❹)❸),1❷)❶)
①D2=1の時"-"を、違っている場合は
 ②次のデータの左から1文字を抽出する。
  ③セル位置シートの
   ④~⑦B2と一致する列の列名と
   ④~⑩「日付順シートの「B2と一致する列の列名&D2」というセルのデータ」に一致する、
    ⑤~➈日付シートの「B2と一致する列」にあるデータの行番号
今回はE2をE5の例で考え、
B5=鈴木=H列
よってセル位置シートのH&
「「日付順シートのH2=鈴木の1番目のデータの日付=2017/3/1」に一致する、
 日付シートのH列のデータ=セル位置シートによって表示されたセルのデータ」の行番号なので、
結局「セル位置シートのH3=い!C5」の左1文字で「い」となる。
と思ったのですが…

どこでエラーとなっているか、個別に確かめましょう。(E5の式を想定してやります)
あ、シート名も「-」を「の」に変えておきますね

元の式
E5=IF(D5=1,"-",LEFT(INDIRECT("作業用のセル位置!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用の日付順!"&MATCH(C5,LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1),FALSE)&D5),INDIRCT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)),1))


=LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)
これは「H」になるはず


=MATCH(INDIRECT("作業用の日付順!"&MATCH(C5,LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1),FALSE)&D5),INDIRCT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)
これは「3」になるはず

Ⅰは短いですし、まず合ってると思いますので、Ⅱが原因であるとしてもう少し分解。
Ⅱがきちんと3になっていれば、以下の検証は不要です。

Ⅱ-1
=INDIRECT("作業用の日付順!"&MATCH(C5,LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1),FALSE)&D5)


Ⅱ-2
=INDIRCT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1))
ん…ここ、INDIRCTになってる…INDIRECTのミスですね。さてはこれが原因かも…

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

E5=IF(D5=1,"-",LEFT(INDIRECT("作業用のセル位置!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用の日付順!"&MATCH(C5,LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1),FALSE)&D5),INDIRECT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)),1))

E5がこれで直れば、F5も↓のように直して下さい。
直らなければ、↑のⅠ及びⅡ-1がどのように表示されるか試してください。

F5=IF(D5=1,"-",RIGHT(INDIRECT("作業用のセル位置!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用の日付順!"&MATCH(C5,LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1),FALSE)&D5),INDIRECT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)),LEN(INDIRECT("作業用のセル位置!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用の日付順!"&MATCH(C5,LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1),FALSE)&D5),INDIRECT("作業用の日付!"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B5,$1:$1,FALSE),4))-1)),FALSE)))-3))
    • good
    • 0
この回答へのお礼

ありがとうございます。早速試してみました。

Ⅰは「H」になりました。
Ⅱは「#VALUE」です。
Ⅱ-1も「#VALUE」です。
Ⅱ-2はDIRECTにした所、ブランクになりました。

お礼日時:2017/03/12 21:32

>後ろのほうの「)」と黒丸数字の数が合っていないような?


合ってない事を確認するために数字を入れたわけです。
なので、 →「)」が多いですね。… となったわけです。

>D列・E列・F列、全て#REF!と表示されます。
というのは、①とかを入れた式の話ですかね?であれば、エラーが出て当然なわけですが…
分かり辛い書き方をしてしまい申し訳ないです。

その次の段落で書いている式の方は日付表示になった時の式から余分な「)」を2つ減らした式なわけですが、そちらがエラーになったのでしょうか?
    • good
    • 0
この回答へのお礼

申し訳ございません。タッチの差で補足記事を投稿したところでした。
D列の式は合っています。
ありがとうございます。

残るは、E列とF列の#VALUE!です。

お礼日時:2017/03/12 19:37

それは表示形式が日付になっているだけで、中の値は1ですね。


=LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1))
がGなら…ん??
=MATCH(①C2,INDIRECT(②"作業用-日付順!"&LEFT(③ADDRESS(④1,MATCH(⑤B2,$1:$1,FALSE❺),4❹),LEN(④ADDRESS(⑤1,MATCH(⑥B2,$1:$1,FALSE❻),4❺)❹)-1❸)❷)&":"&LEFT(②ADDRESS(③1,MATCH(④B2,$1:$1,FALSE❹),4❸),LEN(③ADDRESS(④1,MATCH(⑤B2,$1:$1,FALSE❺),4❹)❸)-1❷)❶)),FALSE)-1
すいません。「)」が多いですね。間違えたままコピーして更に増えたようです。

=MATCH(C2,INDIRECT("作業用-日付順!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)),FALSE)-1
これでどうでしょう?
式を自動修正する必要がなくなったので表示はでなくなるかな?
この回答への補足あり
    • good
    • 0
この回答へのお礼

エラーメッセージは出ませんでしたが、
D列・E列・F列、全て#REF!と表示されます。

=MATCH(①C2,INDIRECT(②"作業用-日付順!"&LEFT(③ADDRESS(④1,MATCH(⑤B2,$1:$1,FALSE❺),4❹),LEN(④ADDRESS(⑤1,MATCH(⑥B2,$1:$1,FALSE❻),4❺)❹)-1❸)❷)&":"&LEFT(②ADDRESS(③1,MATCH(④B2,$1:$1,FALSE❹),4❸),LEN(③ADDRESS(④1,MATCH(⑤B2,$1:$1,FALSE❺),4❹)❸)-1❷)❶)),FALSE)-1

後ろのほうの「)」と黒丸数字の数が合っていないような?

お礼日時:2017/03/12 19:13

「い」のD2は


=MATCH(C2,INDIRECT("作業用-日付順!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1))&":"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1))),FALSE)-1
でしたか。

C2の日付に一致する「日付順のシートの田中さんの列にあるデータ」の行番号-1を表示させる式ですね。
文字式から数字を抽出して計算に用いているのですが、設定によって注意が出たのかもしれません。
エラーチェックか何かの設定を変えれば消える気がします。
それよりも、内容が=1+1で2となっている事が気になります。
2行目がヒットして2が返って来るので、2-1=1が表示されるはずなのですが…

=MATCH(C2,INDIRECT("作業用-日付順!"&"G"&":"&"G"),FALSE)-1
としたらどうなりますか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

補足画像を間違えてしまいました。

1900/1/1は「1」
1900/1/3は「3」
1900/1/4は「4」になっています。

お礼日時:2017/03/12 18:52

昨晩は仕事だった為返事が遅くなり申し訳ないです。



セル位置の
G2=IF(ROW()-1>MAX(は!G:G),"",IF(ROW()-1<MIN(ろ!G:G),"い!C"&MATCH(ROW()-1,い!G:G,FALSE),IF(ROW()-1>MAX(ろ!G:G),"は!C"&MATCH(ROW()-1,は!G:G,FALSE),"ろ!C"&MATCH(ROW()-1,ろ!G:G,FALSE))))
の式で該当セルの無いシートが含まれている人にエラーが出るのですね。

G2=「は」のG列最大値(4)が1より大きければ空白(今回は違う)、「ろ」のG列最小値(0)が1より大きければ…(今回は違う)、「ろ」のG列最大値(0←☆該当が無いため0となっているのが問題☆)が…
同様に最初の「は」のG列最大値も、該当ない場合は0となってしまっている。
この2箇所を、該当が無い場合はそれより前のシートを参照して最大値を比較できるようにしましょう。


G2=IF(ROW()-1>IF(MAX(は!G:G)>0,MAX(は!G:G),IF(MAX(ろ!G:G)>0,MAX(ろ!G:G),MAX(い!G:G))),"",IF(ROW()-1<MIN(ろ!G:G),"い!C"&MATCH(ROW()-1,い!G:G,FALSE),IF(ROW()-1>IF(MAX(ろ!G:G)>0,MAX(ろ!G:G),MAX(い!G:G)),"は!C"&MATCH(ROW()-1,は!G:G,FALSE),"ろ!C"&MATCH(ROW()-1,ろ!G:G,FALSE))))

これでどうでしょう?
「は」の最大値のところを、「は」の最大値が0より大きい(つまり該当がある)場合にはそのまま、
該当が無い場合は「ろ」の最大値で同様に比較し、該当があればそれを、
無い場合は「い」の最大値を、比較対象とした。
「ろ」の最大値のところは、これの後半と同じ。

「は」のG2も同様の理由で間違えてたようですね。ご自分で訂正されたようで、ありがとうございます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

お忙しい所、申し訳ございません。お答えくださりありがとうございます。

実の所、先の補足記事を投稿してからも自分なりに試行錯誤いたしまして
日付順に並べる所まではできるようになりました。

ちなみにシートの名前ですが、”-”が付いていると色々面倒ですので
「作業用の~」と変更しています。

シート:作業用のセル位置
G2=IF(MAX(は!G:G)=0,IF(MAX(ろ!G:G)=0,IF(ROW()-1>MAX(い!G:G),"","い!C"&MATCH(ROW()-1,い!G:G,FALSE)),IF(ROW()-1>MAX(ろ!G:G),"",IF(ROW()-1<MIN(ろ!G:G),"い!C"&MATCH(ROW()-1,い!G:G,FALSE),"ろ!C"&MATCH(ROW()-1,ろ!G:G,FALSE)))),IF(MAX(ろ!G:G)=0,IF(ROW()-1>MAX(は!G:G),"",IF(ROW()-1<MIN(は!G:G),"い!C"&MATCH(ROW()-1,い!G:G,FALSE),"は!C"&MATCH(ROW()-1,は!G:G,FALSE))),IF(ROW()-1>MAX(は!G:G),"",IF(ROW()-1<MIN(ろ!G:G),"い!C"&MATCH(ROW()-1,い!G:G,FALSE),IF(ROW()-1>MAX(ろ!G:G),"は!C"&MATCH(ROW()-1,は!G:G,FALSE),"ろ!C"&MATCH(ROW()-1,ろ!G:G,FALSE))))))

yuji3690さんのご提示くださった式と比べて、異常に長くて不細工ですね。
それはそれとして、本題です。

「い」のシートのD2、E2、F2にご提示くださった式を入力しますと
補足画像のようなエラーメッセージが出たり、#VALUE!の嵐になります。
シート名を変更してもエラーメッセージが出ます。

ちなみに、D9に入っている「1」は手入力したものです。ハイフンが反映されます。
しかし「2」と入力すると、E列・F列共に#VALUE!になります。

お礼日時:2017/03/12 17:08

あぁ…早速失敗してましたね(汗


MAXを加えるのはIFの中でした。
G2=IF($B2=G$1,COUNTIF($B$2:$B2,$B2)+MAX(い!G:G),"")
G2=IF($B2=G$1,COUNTIF($B$2:$B2,$B2)+MAX(ろ!G:G),"")
ですね。

名前を自動抽出させる方法ですね。
「作業用ー名前抽出」とでもしてシートを作ってみましょう。
まずは3つのシート全ての名前を1列に羅列させ、
その名前が初めて出てきた場合にIDを振るようにすれば、
IDにヒットしたものを抽出することで自動化が可能と思います。
ただこの場合、「い」→「ろ」→「は」の順で羅列することになるので、
今の例だと1:田中、2:鈴木、3:佐藤、4:山本、(次から「ろ」)5:高橋…となりますが、
「い」の9に新しくAさんが加わった場合、5:A、6:高橋…
と、間に差し込まれる形になります。
問題ないとは思いますが念のため。

B2=INDIRECT(IF(ROW()-1>MAX(い!A:A),IF(RO()-1>MAX(い!A:A)+MAX(ろ!A:A),"は!B"&MAX(い!A:A)+MAX(ろ!A:A),"ろ!B"&ROW()-MAX(い!A:A)),"い!B"&ROW()))
「い」「ろ」「は」にあるデータの数だけコピーしてください。
事前に入れておきたい場合は、
B2=IF(ROW()-1>MAX(い!A:A)+MAX(ろ!A:A)+MAX(は!A:A),"",式)
とし、式の部分には先ほどのINDIRECT(~)を入れてください。
これで、3つのシートのデータ数を超えた場合は空白となるので、事前に入れておいても問題はありません。ただし、データが追加されていった時点で、事前に入れておいた数を超えた場合に気付けない可能性があります。それを避けるには、明らかに超えないように大量に設定しておくか、越えた時点でエラーが表示されるような設定を組み込む必要があります。

これによりB列には人の名前が「い」→「ろ」→「は」の順で羅列されました。
次はA列に名前のIDを振り分けていきましょう。
A2=IF(B2="","",IF(COUNTIF(B$2:B2,B2)=1,MAX(A$1:A1)+1,""))
これにより、B列のデータがB列の2行目からその行までに1個しかない(つまり初めて出てきた)場合に、A列の1行目からそのセルの上までで一番大きな数字に1加えて表示する(つまりID番号を振る)ことができます。A1は空白にしておいてくださいね。
そして同様に必要なデータの数だけコピーしましょう。B列が空白なら空白としているので、事前に入力しておいても問題ありません。

これでIDが振り終わったので、あとはVLOOKUPでそのIDの名前を抽出するだけです。
「い」のG1=IF(COLUMN()-COLUMN($F1)>MAX(作業用-名前抽出!$A:$A),"",VLOOKUP(COLUMN()-COLUMN($F1),作業用-名前抽出!$A:$B,2,FALSE))
これはG列を1番目としているので、COLUMN()-COLUMN($F1)によってF列より右に何列目であるかを計算し、その数字にヒットするIDを持った名前をVLOOKUPで抽出しています。
これを必要なだけ右にコピーしてください。
COLUMN()-COLUMN($F1)がMAX(作業用-名前抽出!$A:$A)を越えれば空白となるので、
空白になるまで貼り付けできてれば問題ありません。
データが新しく増えた場合は先ほど同様に式の数が足りているかチェックする必要があります。
この回答への補足あり
    • good
    • 0

シートは3つでよいのですね?


(簡易化で3つと言っているだけで、実際は10も20もシートがあるなら面倒だと思うので)

「い」・「ろ」・「は」のシートの1行目に行を挿入します。
(A列の通し番号は行番号とはずれてしまいますが、あくまで通し番号としての表示を重視で)
G列以降は空いているとして、
G1~に人の名前を入れます。
例:G1=田中、H1=鈴木、I1=佐藤…
(当然「ろ」のG1=い!G1としてコピーする方が、全部手入力より早く、ミスもないので良いです)
そして「い」の各列の2行目~データの最終行には、
G2=IF($B2=G$1,COUNTIF($B$2:$B2,$B2),"")
これを人の名前の数だけ横に、データの数だけ下に、コピーしてください。
これで、その列の1行目に書かれた人の名前とB列のデータが一致すれば、その人がこのシートの2行目からその行までに何回出てきたかを表示するようになります。

「ろ」には
G2=IF($B2=G$1,COUNTIF($B$2:$B2,$B2),"")+MAX(い!G:G)
「は」には
G2=IF($B2=G$1,COUNTIF($B$2:$B2,$B2),"")+MAX(ろ!G:G)
とりあえずこれで人毎に番号は振れました。(順番はまだです)

「作業用-セル位置」というシートを作ってください。(シート名は自由に変更してかまいません)
G1~には同様に人の名前を入れてください。(特に使いませんが、見て分かるように)
G2=IF(ROW()-1>MAX(は!G:G),"",IF(ROW()-1<MIN(ろ!G:G),"い!C"&MATCH(ROW()-1,い!G:G,FALSE),IF(ROW()-1>MAX(ろ!G:G),"は!C"&MATCH(ROW()-1,は!G:G,FALSE),"ろ!C"&MATCH(ROW()-1,ろ!G:G,FALSE))))
G2を人の名前の数*データの数コピーしてください。
これでさきほど表示させた番号によって、そのセルの「行番号-1」がどのシートにあるか判別し、その行のC列(つまりそのデータの日付)のセル番地を表示します。
例の場合、G1が田中さんなので、G2には田中さんの(2-1=)1番目。つまり「い」の2行目(1行目は新しく挿入したので、該当するデータは2行目にある)であるから、「い!C2」と表示されているハズです。

「作業用-日付」というシートを作ってください。(同)
G1~には同様に人の名前を入れてください。(同)
G2=IF(作業用-セル位置!G2="","",INDIRECT(作業用-セル位置!G2))
G2を同様にコピーしてください。
これにより、先ほど表示させたセル位置に入っているデータ(つまり日付)を表示します。

「作業用-日付順」というシートを作ってください。(同)
G1~には同様に人の名前を入れてください。(同)
G2=IF(作業用-日付!G2="","",SMALL(作業用-日付!G:G,ROW()-1))
同様にコピーしてください。
これにより、先ほど表示させた日付を、小さい順に並び替えて表示します。

では、やっと「い」「ろ」「は」に戻って、D列から。
D2=MATCH(C2,INDIRECT("作業用-日付順!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1))&":"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1))),FALSE)-1
3つのシートそれぞれで必要な行数分コピーしてください。
これにより、「先ほどの日付順のシートの「B列のデータと一致する名前の列(田中ならG)」で、C列のデータと一致する日付が何行目にあるか」から1引いたもの、つまり古い方から何番目か、を表示します。

続いてE列です。
E2=IF(D2=1,"-",LEFT(INDIRECT("作業用-セル位置!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用-日付順!"&MATCH(C2,LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1),FALSE)&D2),INDIRCT("作業用-日付!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)),FALSE)),1))
これを同様にコピーしてください。
D2が1なら-を、他の場合は、1つ前の日付を「作業用-日付順」から取得し、それに一致する行番号を「作業用-日付」から取得し、「作業用-セル位置」のその位置にあるデータから、該当するシートを表示させているはずです。
(シート名が実際は違っている場合、1文字しか抜き出さない事になっているので要修正)

F2=IF(D2=1,"-",RIGHT(INDIRECT("作業用-セル位置!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用-日付順!"&MATCH(C2,LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1),FALSE)&D2),INDIRCT("作業用-日付!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)),FALSE)),LEN(INDIRECT("作業用-セル位置!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)&MATCH(INDIRECT("作業用-日付順!"&MATCH(C2,LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1),FALSE)&D2),INDIRCT("作業用-日付!"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)&":"&LEFT(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4),LEN(ADDRESS(1,MATCH(B2,$1:$1,FALSE),4))-1)),FALSE)))-3))
同様にコピー
E2とほぼ同じなのですが、シート名は左から1文字取ればよかったです。
行番号を取るには、右から?文字取らなければなりません。
?=そのセルの文字数-3(シート名1文字、!で1文字、Cで1文字、の3文字引いてます)です。
そのセルの文字数というのはLEN(セル番地)でできるのですが、その番地を再度関数で求める為、ほぼ倍の長さになってます。

書いてる間に眠くなってきたので結構間違えてるかも…
試してないので、動かなければ、どこまで正常に動いたかと、どんなエラーになったかを合わせて教えてください。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!