dポイントプレゼントキャンペーン実施中!

簡単に見えるのですができなくて困っています。
A列に年月日、B列に会った相手名が入っています。
2020/4/1 山田
2020/4/2 山本
2020/4/3 山田
2020/4/4 山田
2020/4/5 田中
2020/4/6 田中
2020/4/7 加藤
2020/4/8 山田
2020/4/9 加藤 
2020/4/10 山本
問題:4月3日から4月8日の間に、
重複を除くと何人と会ったか?(答え=山田・田中・加藤の3人)
指定期間の始期である2020/4/3をC1セル、
終期である2020/4/8をC2セルに入力した場合、
答えの「3」はどんな関数で求められるのでしょうか。

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

  • この次の作業がありまして・・・。
    C列に、性別を加えます(夫と妻、のイメージです)。
    2020/4/1 山田 男
    2020/4/2 山本 男
    2020/4/3 山田 男
    2020/4/4 山田 男
    2020/4/5 田中 男
    2020/4/6 田中 女
    2020/4/7 加藤 女
    2020/4/8 山田 女
    2020/4/9 加藤 女 
    2020/4/10 山本 女
    問題:4月3日から8日の間に、
    重複を除くと男何人、女何人と会ったか?
    (答え=男は山田・田中の2人、女は田中・加藤・山田の3人)
    同様に始期をD1、終期をD2に入力するとどうなるでしょうか。

      補足日時:2020/05/16 00:08

A 回答 (6件)

続けてお邪魔します。



結局、男女別の個数を知りたいわけですね。
前回の作業列の数式を少し変えるだけで対応できると思います。

↓の画像で作業列E2セルに
=IF((A2>=D$1)*(A2<=D$2),IF(COUNTIFS(INDIRECT("B"&MATCH(D$1,A:A,0)&":B"&ROW()),B2,INDIRECT("C"&MATCH(D$1,A:A,0)&":C"&ROW()),C2)=1,C2,""),"")

という数式を入れフィルハンドルで下へコピー!

結果のH2セルに
=COUNTIF(E:E,G2)

という数式を入れ下へフィル&コピーしています。m(_ _)m
「(エクセル関数)指定期間内で重複を除いて」の回答画像3
    • good
    • 0
この回答へのお礼

重ねてありがとうございます。
成程、「期間中、2回目に同じモノが出現したら無視する」のルールだと、
男・女の2属性でのそれぞれのカウントだけでなく、
居住エリア別など、C列の属性が3以上でも同様に使えますね。
これはたいへん助かります。
手元の仕事のファイル(もう少し複雑な構成ですが)で
応用して確認します。うまくいく期待でワクワクです。
「期間の幅を決めて」という条件をつけることが、
一筋縄でいかない奥深さに触れました。
ご教授にただただ感謝する次第です。

お礼日時:2020/05/16 23:47

★方法2:クエリの追加とカスタム列の追加で抽出する方法


カスタム関数を作るのが面倒というなら テーブル2を少し工夫す
ればいいでしょう。

テーブル2からクエリ作成(接続のみ)
テーブル1からクエリ作成

let
ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
変更された型 = Table.TransformColumnTypes(ソース,{{"日付", type datetime}, {"氏名", type text}, {"性別", type text}}),
追加されたクエリ = Table.Combine({変更された型, テーブル2}),
並べ替えられた行 = Table.Sort(追加されたクエリ,{{"日付", Order.Ascending}}),
下方向へコピー済み = Table.FillDown(並べ替えられた行,{"日付(から)", "日付(まで)"}),
フィルターされた行 = Table.SelectRows(下方向へコピー済み, each ([氏名] <> null)),
追加された条件列 = Table.AddColumn(フィルターされた行, "カスタム", each if [日付] >= [#"日付(から)"] then if [日付] <= [#"日付(まで)"] then 1 else 0 else 0),
フィルターされた行1 = Table.SelectRows(追加された条件列, each ([カスタム] = 1)),
削除された列 = Table.RemoveColumns(フィルターされた行1,{"日付", "日付(から)", "日付(まで)", "カスタム"}),
削除された重複 = Table.Distinct(削除された列),
グループ化された行 = Table.Group(削除された重複, {"性別"}, {{"件数", each Table.RowCount(_), type number}})
in
グループ化された行

読み込んでおしまい。
「(エクセル関数)指定期間内で重複を除いて」の回答画像6
    • good
    • 0
この回答へのお礼

ありがとうございます!少し難航しましたが再現できました(当たり前ですが)。
シート全体の仕様というか、構成さえ事前に練っていれば(作業スペースとか)、
関数よりもエレガントですね。
同様の作業が発生したら、最初にこの考え方でやってみます。
レベルの低い質問にお手間とお知恵をいただき恐縮です。

お礼日時:2020/05/24 10:35

作業列を作ったり配列で計算したりするよりクエリで集計した方が


簡単だと思いますけど。

★方法1:カスタム関数で抽出する方法

まずテーブル1をクエリとして読み込みカスタム関数に加工

(kara as datetime, made as datetime)=>
let
ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
変更された型 = Table.TransformColumnTypes(ソース,{{"日付", type datetime}, {"氏名", type text}, {"性別", type text}}),
フィルターされた行 = Table.SelectRows(変更された型, each [日付] >= kara and [日付] <= made)
in
フィルターされた行

ひとまず接続として読み込み

続いてテーブル2をクエリとして読み込む。
カスタム関数「テーブル1」を追加
「kara」に「日付(~から)」
「made」に「日付(~まで)」を設定

「氏名」と「性別」列のみ展開
「日付(から)」「日付(まで)」を削除
重複を削除してからグループ化

以上
「(エクセル関数)指定期間内で重複を除いて」の回答画像5
    • good
    • 0

困った事に、




少し 苦戦して、
不本意な ものしか、
出来ませんでしたが。


一応、

中間報告的に 組めましたので、
一旦 提出します。


此方を、

ファイル、
https://1drv.ms/x/s!AjviygfJDgV_30ZSLLcrzwOV5Wfs


動作、

先ずは 基本エンジン構造、 … ①

TRANSPOSE構文にて、
氏名性別データを 横並びに、
変換し、
縦並び元データと 比較させ、
データ上に クロス表を、
作り込み、

MMULT構文による 行列積で、
行単位の 集計を、
実現させています。


次に、

此の①を 用い、

1回だけ 会った人と、
複数回 会った人の、

各々の 人数を、
割り出しています。


元より、

①が 返す、
結果としては、
クロス表ですので、

1回のみの 面会者を、
表す 1と、

複数回の 面談を、
表す、
数値の グループが、
吐き出されます。


ですので、

本式群の 幾つかでは、
単一面会を 表す、
1を、

①の 結果より、
数え 割り出して、

先筆前者の 単一面会者数と、
していますし、


後者、

複数面会者の 人数は、
吐き出された 値が、
同一な ものの、
グルーブ数より 割り出しています。


最後に、

此処までの 2値を、
合算して、

結果として 返させています。


但、

何人 多回数面会者が、
いるかを、
割り出す やり方が、
低信頼度に 過ぎていて。


とっても、

あらら 何ともはや、
と いいたくなるような、

そうした 事態の、
発生が、
予見されて しまいます。


尚、

ファイルは 1度、
ローカルに 別名保存して、
其の保存ファイルを 扱うように、
してくださいね、

別名保存でないと、
意味が 無いですよ。


さすれば、

閲覧も、編集も、
叶うものと 思いますよ。


因みに、

此は 正に、
私が 作成した、
やり方で、

私の 公開以前、
既に、
知られた ものでも、
公開されている ものでも、
ありません。


元より、

私の オリジナルで、

故に、
相応に 誰でも、
勘案し得るものでは、
ない事より、

私に 著作権が、
帰属しています。


当該に付いては、

使用に 際しては、
私の 指定した、
使用上の ルールに、
従う限り、

金品等 一切を、
請求するものでは ありませんが、

真逆に、
従わなかった場合は、
賠償を 請求します。


では、

使用の ルールですが、

此の、
やり方、考え方を、
何時、何処で、
どのIDの ものの、
提示から 知ったか、

使用時には、
誰の 目にも、
灼かに 伺えるよう、
詠う事と、

其れを 見たものが、
此の 義務を、
引き継ぐように 指定する事を、
義務付けます。


使用に 際しては、

此を 怠らない限り、
使用は フリーです。


逆に、

反した場合は 先筆通り、
賠償を 頂きます、

其れだけの 事です。


此、

本来は 履行する方が、
常識な 事なので、

態々 此の様に、
書かないと いけない、

そんな現状が、
狂気的な 異常状態なのです。


然りとて、

書かないと、
誰も 履行しないので、

お目汚しには なるかとも、
思いましたが、

書き込まして 頂きました。


又、

こうでも しておかないと、
間違えた 使用法により、
困惑されているような 事態を、
目の辺りに した時、

「其れ 私が、
作り出した ものなので、
私なら 判りますよ。」
と 投げかけた際に、

狂人扱いを 真面に、
あからさまに されるのですよ、

此は 困るので、
防ぎたいのです。


本来、

賠償等 求めては、
居ませんが、

此の国の 法律体系では、
規制を 個人が、
貼る場合は、

賠償の 形しか、
取れない、

と 思っているもので、
こう しています。


ご理解を 頂けましたなら、
又、
お役に 立てて、
居たならば

幸いです。
    • good
    • 0
この回答へのお礼

お知恵拝借いたしまことに恐縮です。
先達の皆様の限りないトライアルとリファインの成果を
使うことに心新たにする思いです。
行列にすると見晴らしがよく、求めるモノの質がわかりました。
ただ、私にとって使ったことがない関数がありますので、
勉強して理解を深めたいと思います。
もとより商用利用や公開の場での運用はありません。
お手間おかけして心配りいただきありがとうございました!

お礼日時:2020/05/16 23:30

No.1です。



投稿後に補足を拝見しました。
>(答え=男は山田・田中の2人、女は田中・加藤・山田の3人)
とは別々ではなく、トータルの「5」という結果になればよいのですかね。

そうであれば・・・
前回同様作業用の列はE列とし、データはA~C列の2行目以降にあるとします。
作業列E2セルの数式を
=IF((A2>=D$1)*(A2<=D$2),IF(COUNTIFS(INDIRECT("B"&MATCH(D$1,A:A,0)&":B"&ROW()),B2,INDIRECT("C"&MATCH(D$1,A:A,0)&":C"&ROW()),C2)=1,1,""),"")

として、結果表示したいセルを
=SUM(E:E)

としてみてください。m(_ _)m
    • good
    • 1
この回答へのお礼

tom04さんありがとうございます。
いろいろな「教えて」へのご回答、私も何度も助けていただきました。
最初のQ、スッキリしました。データ入力行と同じ行数の作業列が必要、
ということですね。「一発で!」はちょっと贅沢でした。

補足のQ、こちらは「男何人(重複除く)、女何人(同)」を別々に求めたいのです。
男を求める(言い方がナンですが)関数と、女を求める関数の2つです。

在宅ワークでちまちまと集計分析しながらうーん・・・という風景でして、
お知恵さずかりたいへん助かります。ありがとうございます!

お礼日時:2020/05/16 12:50

こんばんは!



1行目は項目行でデータは2行目以降にあるとします。
一発で!という方法ではありませんが・・・

E列を作業用の列とします。
E2セルに
=IF((A2>=C$1)*(A2<=C$2),IF(COUNTIF(INDIRECT("B"&MATCH(C$1,A:A,0)&":B"&ROW()),B2)=1,1,""),"")
という数式を入れフィルハンドルでこれ以上データは増えない!という位まで下へコピー!

表示したいセルに
=SUM(E:E)

ではどうでしょうか?

※ 作業列が目障りであれば、
遠く離れた列にするか非表示にしてください。m(_ _)m
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています