『降順リストにおいて「検査値以下で最大の値」を得る法 』(はんにゃ) 課題 が 元[[20081107152709]] から ずれてきましたので 新規にしました。 現在 入力用セルで データ>入力規則>リスト>ドロップダウンリスト(DDL)により 入力をするように設定しました。 このDDLは年号です。それは現状が古い年号から昇順で書かれているために 最近年の入力が多いので 頻繁にスクロールをしないといけない。 そこで リストの記載を"平成”と元年西暦”1989”のリストを頭にした 降順にしました。  (目的は このDDLでの表示の順序を降順にするためです)  さて 既に 先の昇順リストを用いて最古の西暦年nnから 年表を作成していて、 そこでは 以下のように各西暦年を順に和暦年号と和暦年  Private Sub np(y, nn, nr, sr) '年表記載  2009/10/17 コンボボックス用に年号対応表を逆順にした 'y:年表の配列(A和暦年号、B和暦年、C西暦)nn:最古年 nr:和暦元号配列 sr:その元年西暦年配列 Dim i As Long, ti As Long  ' 昇順方向の元のコード  y(1, 3) = nn '最古年の西暦年   ti = Application.Match(y(1, 3), sr) '照合の型を省略すると、1 を指定、検査値以下の最大の値が検索 y(1, 1) = Application.Index(nr, ti) '最古年数の元号 y(1, 2) = nn - Application.Index(sr, ti) + 1 '最古年- 最古年元号年+1=年数を得る For i = 2 To UBound(y, 1) y(i, 3) = y(i - 1, 3) + 1 '元年の年数 ti = Application.Match(y(i, 3), sr) '西暦データ y(i, 2) = y(i, 3) - Application.Index(sr, ti) + 1 '年数を得る If y(i, 2) = 1 Or y(i, 2) Mod 10 = 0 Then y(i, 1) = Application.Index(nr, ti) '元号を得る End If If y(i - 1, 2) = 1 Then '年数判定 y(i - 1, 2) = "元年" End If Next  以上で 年表の方は正常に書かれています。  そこで 上のti の箇所を ti = Application.Match(y(1, 3), sr, -1) '最古年の元号元年の西暦、降順に 並べ替えたため 検査値以上の最小の値が検索 ti = Application.Match(y(i, 3), sr, -1) '西暦データは、降順に並べ替えたため   と書き換えました。 が、正常にうごきません。 y(1, 2) = nn - Application.Index(sr, ti) + 1 で Application.Index(sr, ti) が nn値より大きくなる。 Match関数では降順の場合は最後の引数を-1に設定すると指示があります。 しかし これでは 「検査値以上の最小の値」が検索されるので 例えば nn=1928の場合 検索値は1989 なり、平成元年を出します。 nr sr 平成 1989 昭和 1926 大正 1912 期待するは 1926の昭和元年です これを降順での「検査値以下で最大の値」を得る関数とか 簡単な既成のコードはありませんでしょうか? よろしく ご助言をおねがいします。 ---- ご検討頂いていれば ありがたいです。が ない物ねだりの感もします。 そこで年表をつくるための年号対応表のデータ(昇順)と  入力をいれるためのドロップダウンリスト(コンボボックスではなかった)のリストデータ(降順)とは 別別に用意して それぞれで使えば 特別の工夫をしないですむだろうと  いま考え作業中です。多分問題ないとおもいます。 (言い訳ですが 大昔は容量がすくなくデータをできるだけ少なくするくせがついていた。) また不都合があれば相談します。 (はんにゃ ---- 御質問内容だけで有れば [A] [B] [1] nr sr [2] 平成 1989 [3] 昭和 1926 [4] 大正 1912 [5] [6] 検索値 場所 [7] 1925 3 ↑=IF(A7>B2,1,MATCH(A7,B2:B4,-1)+1-COUNTIF(B2:B4,A7)) こんな数式で可能かとは思います。 ただし、表の変更によって 他の部分の変更も必要に成ってきそうに思います。 前スレでみやほりんさんが >逆順のリストを別に作っておくのが早いです。 >元号なんだから、それほど頻繁な更新はないですよね。 と書いて居られるように、たびたび変更が有る様な物でも無いと思いますので もう一つリストで使用するために参照する表を 作成するのが無難に思います。 「作り始めの段階」とは、既に状況が違うと思いますので。 それと、ご自身の投稿文でない限り 質問内容が似ていても なるべく新規で質問して下さるのが良いと思います。 後でそのスレを見たときに、話が分からなくなる可能性が有りますし 現行でも「はんにゃさんへのコメントは○○さんの名前のスレでやってるぞ」 なんて、今回関係無い ○○さん の名前も覚えておく必要が出てくるので。 (HANA) ---- おせわになります。 まず、事例で検索値が 1925の場合は 大正14年ですから 元号として大正が出ないといけないので 3ではなく 4がでてくることを期待しています なお、元号、和暦年、西暦年の表記のSub関数コードはHANAさんに以前教授して頂いたまま変わりません。 他の部分(年表を書き込むコードで)も変える必要を避けるため、 データリストを昇順と降順で別別につくって 降順のリスト範囲を名前>定義ずけ、 そして 入力規則>リスト>リスト名 ドロップダウンするリストにして  現状正常に 入力窓で 平成以下新しい順で表示され 入力操作は動きました。 この間の工夫で コード自体は一切変えないで入力の簡便・誤書き込み回避をえることができました。 お陰で大量入力でもと、要望があるのを期待しています。 (はんにゃ   ---- なお  西暦も年号のひとつとして 年号対応表に以下のように西暦を追加しても 正常に動作します。(空欄は西暦としてあつかったまま) A1和暦 元号 B1 元年 西暦 C1 時代 D1  西暦   元年 E1 和暦 元号 西暦 1 1 西暦 長徳 995 平安時代(794→) 995 長徳 長保 999 999 長保 そしてドロップダウンリストとして G1 以下のリストはデータ表で年号を入れるための 挿入>名前>定義した年号リストである G2 ?は配偶者以外使用不可。推定年号を記入、年欄半角?.ピリオッドを記入 G3 西暦 平成 昭和 大正 明治 慶応 途中略  慶長 江戸以前の元号は年号対応表よりコピー入力で。案内に従い進んでください。    リストはここまで としてあります  (はんにゃ ---- >まず、事例で検索値が 1925の場合は 大正14年ですから 元号として大正が出ないといけないので >3ではなく 4がでてくることを期待しています この辺りは調整だけの問題なんですけどね。 数式を =IF(A7>B2,2,MATCH(A7,B1:B4,-1)+1-COUNTIF(B1:B4,A7)) とか =IF(A7>B2,2,MATCH(A7,B2:B4,-1)+2-COUNTIF(B2:B4,A7)) とか、マクロがどうなっているのか分かりませんが 合わせてもらえばよいと思います。 それと、たぶん [[20090627150504]]『西暦〜和暦の変換 あるいは系譜図の作成 改題』(はんにゃ) ===↓引用開始↓===  まず、和暦→西暦 と 西暦→和暦 の対応表が必要です。  「対応表」というシートに  A,B列を使用して 和暦→西暦 の表   A列に、和暦   B列に、元年が対応する西暦  を入力して下さい。  年に依っては、和暦が二つ有る場合が有りますが  Sheet1にどちらで入力されるか決まっていない場合は  両方記述して下さい。  C列を一列空けて、D,E列に 西暦→和暦 の表   D列に、西暦   E列に、和暦  を入力して下さい。  こちらの表は、D列が昇順に成っている必要が有ります。 ===↑引用終了↑=== ですから、A:B列の方は並びはどうでも良くて しかも、和暦も揃っていますから(南北朝時代は両方の年号が載っている) こちらを降順にして、リストの範囲として使用すれば 良かったような気がします。 ・・・記憶が曖昧なので、駄目だったら諦めてください。 (HANA) ---- ありがとうございます =IF(A7>B2,2,MATCH(A7,B2:B4,-1)+2-COUNTIF(B2:B4,A7))   ^            ^  平成元年より新しい処理、 下に一つづらして                最後のCOUNTIFは元年の場合1を引く をマクロ化するということですね。 なるほど これなら 降順でもOKですね ひとつ 西暦を元号として ドロップダウンリストの  最初に出したい(空欄でもOKですが 説明抜きでわかるにはこれを使いたい) ときは それだけ 降順では 例外になるので  コードをさらに判定のために追加しないといけないのと ?もあるので やはり別々のリストにして処理することにします。 (はんにゃ