『A列のIDごとの、B列のIDの最大値を求めたい』(訓練中)
A列 B列
001 001
001 002
001 003
001 004
002 001
002 002
003 001
003 002
003 003
003 004
003 005
003 006
004 001
004 002
・ ・
・ ・
というデータから
E列 F列
001 004
002 002
003 006
004 ・
005 ・
006 ・
という様にA列のIDごとに、
B列のIDの最大値を取得したいですが、どのようにしてよいかわかりません。
E列はUNIQUE関数でできるのですが、
「UNIQUE関数で返ってきた配列に対して、B列のMAX値を求めたい」
がうまくできません。
どなたかご教授くださいますよう、よろしくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
MAXIFS関数というある条件での最大値を求める関数がある。
F1セルに =MAXIFS(B:B,A:A,E:.E) で、どうだろうか?
これでA列がE列の値の場合のB列の最大値を求められる。 (ねむねむ) 2026/10/16(金) 17:23:20
E1セルに
「=UNIQUE(A1:A100)」
F1セルに、ご教授していただいた
「=MAXIFS(B:B,A:A,E:.E)」
を入力しましたが、
F1〜F4まで全て「0」ゼロが返ってきてしまいます。
E列のUNIQUE関数の範囲に合わせてMAXIFSをしても同じです。
F2セル:「=MAXIFS($B$1:$B$100,$A$1:$A$100,E1)」
と入力後、F4までオートフィル
E列のUNIQUE関数を
「=UNIQUE(A:.A)」にしても、ゼロしか返ってきません。
自分のどこが間違えているのか教えていただけると助かります。
よろしくお願いいたします。
(訓練中) 2026/10/16(金) 17:59:19
文字列だからでしょうか。
こんな書き方があるかも知れません。
(1)
F1セルに
=LET(
a,MAX(IF(A:A=E1,--B:B)),
IF(a=0,"",TEXT(a,"000"))
)
として下にコピーします。
(2)
もし、無理やり一つの式で書くなら、
G1セルに
=BYROW(E:.E,
LAMBDA(e,
LET(
a,MAX(IF(A:A=e,--B:B)),
IF(a=0,"",TEXT(a,"000"))
)
)
)
(xyz) 2026/10/16(金) 18:08:46
E1; =LET(ids,UNIQUE(A:.A),HSTACK(ids,MAXIFS(B:.B,A:.A,ids))) (jindon) 2026/10/16(金) 18:29:45
そもそも最大値を云々するのであれば、 B列のセルの値は数値にしておき、表示形式を000などとすれば、 ねむねむさん提示の簡潔標準的な数式で済むと思います。 そういう方向もあると思います。
(xyz) 2026/10/16(金) 18:44:52
a,MAX(IF(A:A=E1,--B:B)),
IF(a=0,"",TEXT(a,"000"))
)
で一時対応して、求めている結果が返ってきました。
緊急対応のため、サクッとできないかな?っという感じです。
後ほどVBAのコードで全体的な業務改善ツールにするつもりのものです。
その時は、Accessのテーブルにデータを入れ、集計クエリのSQL文で実行できるようにする予定です。
Accessのテーブルに入れるときに文字列に変換して入れてもよいのでしょうが、
他のツールも、Accessのテーブルの形式に合わせた書式にしているので、
"001"というデータにっているので、このような事態になりました。
説明が不足していたため、不要な誤解をさせてしまい、
申し訳ございません。
ご回答してくださった方、閲覧してくださった方、
ありがとうございました。
(訓練中) 2026/10/16(金) 20:07:28
■1
>F1〜F4まで全て「0」ゼロが返ってきてしまいます。
既に回答があるように、B列が数値ではなく文字列だから0になってしまうようですね。
ということで、一旦VALUE関数を噛まして数値にしたあと、文字列に直すという方向で考えてみました。
=TEXT(MAX(IF(A1:A14=E1,VALUE(B1:B14))),"000")
■2
さらにChatGPTに聞いたところ、MAP関数を使えばスピルできるようです。
=MAP(E1#,LAMBDA(条件,TEXT(MAX(IF(A1:A14=条件,VALUE(B1:B14))),"000")))
■3
>LAMBDAというワークシート関数
私もわからなかったのでChatGPTに聞いたところ「Excelの LAMBDA関数は、数式の中で独自の関数を定義するための関数です。」とのことでした。(あっているのかは不明です)
■4
一部重複するコメントがありますが、作業列を用いて一旦数値に変換することが許容されるなら、シンプルにすることは可能かと思います。
C1セル =B1:B14*1 ←作業列 F1セル =TEXT(MAXIFS(C1#,A1:A14,E1#),"000")
(もこな2) 2026/10/16(金) 21:20:24
屋上屋を架す話で恐縮です。
LAMBDA関数というのは、関数を定義するものです。従来の関数とは趣が違うので戸惑うのは当然かと思います。 関数を定義?とかピンとこないと思われますし、 歴史的経緯(lambda calculus)から妙な名前がついていたりしてなじみにくいのは確かです。 これらは、MAP関数、BYROW関数、BYCOL関数、SCAN関数、REDUCE関数などとともに使われることが多いようです。 これらの使い方を簡単な例で使ってみると、とっかかりになるとは思います。 https://excel-ubara.com/excel1/EXCEL672.html とその周囲の記事が参考になると思います。
MAXIFS関数の第一引数は、 ・数値セルの ・参照であること が求められます。(SUMIF(S)関数などと同じかと思います) --B:Bとかいった形で数値に変換しても、そうした配列を第一引数に取ることはできません。 つまり、第一引数は参照でなければなりません。 これについては、 「COUNTIF関数とスピルは相性が悪い」 http://officetanaka.net/excel/function/tips/tips115.htm が参考になるかと思います。(参照型関数は8つしかない)
(xyz) 2026/10/16(金) 21:45:39
【過去ログ】 [[20250904113619]] 『LAMBDA関数について教えてください。』(訓練中)
よく調べてみたら↑で、調べておられましたね。
既に学習済みかとおもいますので、私の「LAMBDA関数」に関するとこは、読み飛ばしてください。
(もこな2) 2026/10/16(金) 22:28:56
=BYROW(E:.E,
LAMBDA(e,
LET(
a,MAX(IF(A:A=e,--B:B)),
IF(a=0,"",TEXT(a,"000"))
)
)
)
について私なりの解釈をしてみます。
「BYROW(E:.E,」
E列の下の空欄セルを除いた行数分繰り返しなさい
LAMBDA関数はLAMBDA(パラーメータ又は計算式, [パラーメータ又は計算式]…)
となっているので、
「 LAMBDA(e,LET〜」
「e」がパラメータ(引数)で、LET以降が計算式となる
「e」にはBYROW関数によって、E列の下の空欄セルを除いた1行目の値が入る
「LET(a,MAX(IF(A:A=e,--B:B)), IF(a=0,"",TEXT(a,"000")))」
は
A列の1つ目の値とBYROWで返ってきた値(E列の下の空欄セルを除いた行の1つ目)を比較し、
同じならB列の1つ目の値を数値化した値を返す。
返ってきた戻り値のMAX値を戻り値として「a」という変数に入れる。
変数「a」の値が、「0」の時は長さ0の文字列を、「0」以外の時は、
変数「a」の値を、"000"形式にして戻り値として返して、
その値をセルに代入する。
という感じでなのかな、と思います。
また、LAMBDA関数を調べると、サンプルが
「=LAMBDA(a, b, a+b)(3, 7)」
というように出てきます。
こちらは、BYROWと違ってLAMBDA関数の後から
パラメータの値を代入しているように見えます。
このようにいろいろな使い方ができるから便利なのでしょうが、
私にはこの辺りが難しく、自分で1から組み立てて使うようなことができずにいます。
一方でVBAは、上記の解釈を変数を使いながら、
1行ずつの命令にして記述していけばよいので、
私にとっては難易度が低く感じているのです。
いつかは、LAMBDA関数を使いながら自分で組み立てらるよう、
教えていただいたことを少しずつ訓練していこうと思います。
(訓練中) 2026/10/17(土) 10:07:02
LAMBDA関数で解決したんですか。
(らんばだ) 2026/10/17(土) 12:02:14
今回は
=LET(
a,MAX(IF(A:A=E1,--B:B)),
IF(a=0,"",TEXT(a,"000"))
)
で一時解決して業務用のものはいったん解決とし、
コピーを作って練習用でLAMBDAを使っても同じ結果が得られました。
結果、どちらでも解決したことになりますが、
LAMBDA関数は現在勉強中のため、
このような掲示板での教えを一つずつ試しているところです。
=BYROW(E:.E,
LAMBDA(e,
LET(
a,MAX(IF(A:A=e,--B:B)),
IF(a=0,"",TEXT(a,"000"))
)
)
)
に対する私の解釈であっているのでしょうか。
間違っている場合などご指摘いただけるとありがたいです。
よろしくお願いいたします。
(訓練中) 2026/10/17(土) 12:19:42
解釈はあっているように思います。
BYROWよりMAPを使うべきでしたね。
> また、LAMBDA関数を調べると、サンプルが > 「=LAMBDA(a, b, a+b)(3, 7)」 > というように出てきます。 > こちらは、BYROWと違ってLAMBDA関数の後から > パラメータの値を代入しているように見えます。
これは関数と言うものの説明としてありうるのですが、 質問者さんにとっては、VBAのFunctionプロシージャと同じ機能なので、なじみ深いでしょう。 Functionプロシージャは明確な関数名を使いますが、 その例では関数名は使用しない、いわゆる無名関数というものです。そこに違いがあります。 よく使用する関数をLAMBDA関数として名前定義しておけば、 VBAのFunctionプロシージャと同様に、ユーザー定義関数として使いまわせます。 (尤も、その例では、 ・普通は + を使いますし(2項演算子をあえて無名関数にしたところで余り有難くない) ・関数を定義して、その場で関数を使用するという使い方は余りしません。 )
むしろ、重要なのは、「関数を別の関数の引数として指定できる」のが、 こうした関数言語的パラダイムの特徴のひとつです。 VBAのような命令型言語では、こうしたことはできません。
・MAP(配列, 関数) とすると、配列の各要素に関数を適用した結果(これは配列と同じ大きさ)を返します。 MAP関数は関数を引数に取る関数なので、高階関数などとも呼ばれます。 ・SCAN(初期値, 一次元配列, 関数)は 繰り返し計算の各回の結果を返します。 引数中の関数は (累積結果,配列のn番目の要素, 計算式)と言う形のLAMBDA関数です。 ・REDUCE(初期値, 配列, LAMBDA関数(累積値,配列のn番目の要素, 計算式)) は、繰り返し計算の最後の結果を返します。 などが典型的な例です。
こうした関数群は日常的に必須ということではないでしょうが、 こうした質問掲示板での利用例を見ていると、 なるほどそうした使い方もあるのかと思わされることがあります。 じっくりと取り組まれたらよろしいかと思います。(過去ログを検索してみるのも良いかも知れません)
なお、最後に付記するとすれば、LET関数にも注目していただきたいという点です。 これは、式のなかで同じ計算を複数回記述せざるを得なかった場合には、 変数を使いまわすことで複数回記述を避けることができます。 また、変数を適宜使うことで、従来の読み取りにくい長い式を、見やすくすることもできます。 これは案外効果があるように思います。苦労して長い式を完成した時点では記憶していますが、 時間が経つと、ちょっと見では何をしているのか分かりにくい、といったことはあるように思います。 なお、LET関数を使って、LAMBDA関数を変数に代入して、使いまわすこともできます。
# 各関数の内容の記述は正確性を欠いている所があるかもしれません。関数ヘルプで確認ください。 (xyz) 2026/10/17(土) 12:48:34
BYROW、MAP、SCAN、REDUCE、いづれも使用したことはありませんが、
これらを少しでも使いながら、LAMBDA関数の訓練をしていこうと思います。
また、
・普通は + を使いますし(2項演算子をあえて無名関数にしたところで余り有難くない)
・関数を定義して、その場で関数を使用するという使い方は余りしません。 )
についても、訓練して使ってみて、「有難くない」や「使い方は余りしません」を
自分自身で体感できれば、理解が進むような気がするので、少しずつやってみます。
(訓練中) 2026/10/17(土) 13:33:47
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.