• ベストアンサー

エクセル SMALL の機能を文字列でもできないか

数値に対し小さいほうからn番目というのは SMALLで出来ますが、2文字以上(最低15文字くらい まで)の文字列に対しそれを行う方法は無いでしょうか? なんらかの式の組み合わせで出来ないものでしょうか? 要するに名前(よみがな)などを昇順(または降順)に読み込み ソートさせた状態で別表に表示させたいのですが 文字1文字ならCODEで何とかなるのですが 2文字以上となると・・・ VB等のプログラムは一切使わず関数の駆使でなんとかならない ものでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.7

◆先程の回答で、順位を表示させなくてもできます    A       B 1  ああああ  ああ 2  ああ     あああ 3  あい     ああああ 4  あう     あい 5  あいあい  あいあい 6  いいい   あう 7  あああ   いいい B1=IF(COUNTA(A:$A)<ROW(),"",INDEX(A:A,MATCH(ROW(),INDEX(COUNTIF($A$1:$A$10,"<="&$A$1:$A$10),),))) ★下にコピー

s_shi
質問者

お礼

回答ありがとうございます。 こんなに簡単に順位をつけられてしまうなんて、拍子抜けです!! >COUNTIF($A$1:$A$10,"<="&$A$1:$A$10) こんな使い方(特に<=の部分におどろき)が出来るのですね♪ このやり方で何とかなりそうな様相です。 頑張ってみます。 ありがとうございました。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 回答ではないのですが、#7 の回答、感服しました。私が、某所で書いていたころは、誰も解答できませんのでしたの、隔世の感を感じました。 いいわけとしては、あまり長く、関数の世界には留まらなかったので、VBAのユーザー定義関数で、解いてしまいました。どのみち、関数というのものは、人が作ったものですから、そういう既成の枠の中で考えるのが面倒というか、ばかばかしく感じることがあります。確かに、初期の関数のコンセプトを考えた人たちには、敬意を払いますが、現行の関数は、バグが残っていたり、むやみに変更してみたりして、統一性もない関数を使わされるのには、閉口するときがあります。 ご質問者さんには、失礼な回答をしたことをお詫びします。m(__)m

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.6

◆こんな方法はいかがでしょうか     A     B   C 1  ああああ  3  ああ 2  ああ     1  あああ 3  あい     4  ああああ 4  ああ     6  あい 5  あいあい  5  あいあい 6  いいい   7  あう 7  あああ   2  いいい ★B列に順位を表示します B1=IF(A1="","",COUNTIF($A$1:$A$10,"<="&A1)) ★下にコピー ★C列にひらがなを昇順に C1=IF(COUNTA(A:$A)<ROW(),"",INDEX(A:A,MATCH(ROW(),INDEX(COUNTIF($A$1:$A$10,"<="&$A$1:$A$10),),))) ★下にコピー

noname#79209
noname#79209
回答No.5

> 回答ありがとうございます。 > 今回の趣旨とは外れてきます。 > いやぁ、まいった・・・♪ 一応お礼は言われているので、多分他意はないのでしょうが、 最後の八分音符に回答者諸氏を試しているニュアンスを感じましたので、 私は、降ろさせていただきます。

s_shi
質問者

お礼

再度質問に戻って見ていただきありがとうございます。 >回答者諸氏を試している なんていうつもりは全くございません。 そのようなニュアンスに見えましたことをお詫びいたします。 ホントにまいっているため、お礼文面で表現のしようがなかったため 「いやぁ、まいった…♪」と自然に使ってしまいました。 またお目にかかった折にはよろしくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#2 のWendy02です。 >いやぁ、まいった・・・♪ こういう問題を個人の解決のテーマとして持ち続けるのは良いとは思います。 ですが、もう少し、自分の中で冷静に考えてみてください。 まず、関数は、一部は、文字列は、0 とみなすように出来ているのと、そうでないものは、文字列が入るとエラーを出すように作られています。逆にいうと、関数の比較は、数値を処理するために出来ています。 私個人は、その問題を、数年前にユーザー定義関数で解決させてはいますが、しょせん、MSが、お仕着せで作ったものにあやかって、ああでもないこうでもない、というようなプロセスが、ちょっと私には歯がゆいです。VBAを知っていれば、Excelは、もっと自由度が高いと思います。VBAは、分かればとても便利です。VBAを勉強すれば、関数の本質的なことも分かります。 >なんとか文字列の大小が判断できれば成功するのですが 文字というのも、本来は、数字の塊で、プログラムの世界では、本質的には数字とはなんら変わりません。だから、本来は可能なのですが、そうさせないだけなのです。 Excelにも、まだ、私の手の届かないような世界もあります。狭く使えば、また、それは、それまでだと思います。こんなことを書いても、何の役にも立ちませんが。

s_shi
質問者

お礼

ありがとうございます。 関数とは・・・、と言う点については十二分に理解しています。 もちろん文字についても・・・。 そしてVBAについて今後勉強したいと考えております。 ただ今回唐突に質問内容の様ななことが必要となり(1週間ほどで カタをつける必要が…(×_×;) )、何とかならないか と思い質問いたしました。 皆様には色々アドバイスいただき感謝しております。

noname#79209
noname#79209
回答No.3

ちょっと強引ですが、 #1さんが言われているように、「データ」-「並べ替え」を使います。 A列に並べ替えの対象になる文字列が入っているとして、 B列に「=ROW()」と計算式をいれ、A列だけを並び替えを行います。 100行の内、5番目のデータを表示したい場合、表示させたいセルに =INDEX(A1:A100,SMALL(B1:B100,5),1)とします。 ただし、上記100行の中にブランクがあるとうまくいきません。

s_shi
質問者

お礼

回答ありがとうございます。 「データ」-「並べ替え」を手動で利用する時点で 今回の趣旨とは外れてきます。 なんとか文字列の大小が判断できれば成功するのですが 「名前」のような場合によってはカナ10文字以上になりそうな ものでは、CODEで表れた数値を結合して使うなんてことも 桁数的に不可能なので・・・ いやぁ、まいった・・・♪

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 がんばってみるのは良いでしょうね。多少の関数が分かってきたなって思ったら、誰もが一度は、それは挑戦しているはずです。ただ、私の知る限りでは、関数で成功したという話は聞きません。少なくとも私は出来ませんでした。 VBAなら、あれをこうして、とか想像は付きますが、それでも、なかなか難しいような気がします。 もしも、他のセルを使って数値化するのでしたら、文字コードは、左から読むことになりますが、それも、ややこしいでしょうね。

s_shi
質問者

お礼

アドバイスありがとうございます。 かなりいろんなことを思案しているのですが なかなか厳しい状況ですね♪ 1、元データ(関数や式の入っていないタダの値)   ↓ 2、エクセル上で関数や式等を使い出来上がった   なんらかのデータ   ↓ 3、そのデータを引数とし、今回の質問のような   ソート状態にもっていった最終データ(リスト) 今回は3、を自動でしたいと思っていますので 2、のデータを手動でソートしたり あるいは、2、のデータを別に手動で値のみコピーして さらに手動でソートしてということはしたくないのです。 やはりムリなのかなぁ・・・

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

ソートで済むものを、なぜこんあんことをするのか良くわからないし、 >VB等のプログラムは一切使わず関数の駆使でなんとかならない など制約を課すのか 関数では無理ではないかとおもう。 ーー VBAといえなくもないが、ユーザー定義関数を作る。 (1)作業列を使う (2)数行のVBAコーを書く が欠点といえば欠点だが。 標準モジュールに Function cd(a) s = "" For i = 1 To Len(a) s = s & Format(Asc(Mid(a, i, 1)), "000") Next cd = s End Function シートで、A列に半角カナがあるとして B1に=cd(A1)と入れて最下行まで式を複写する。 全データ範囲を指定して並べ替えする。 ソートキーはもちろんB列、昇順。 結果 エノモト 180201211196 オオカワ 181181182220 キムラ 183209215 キムラ 183209215 セキ 190183 タムラ 192209215 ワダ 220192222 姓と名の間のスペースが邪魔化も知れない。 SUBSTITUTE関数で取り除けばようかもしれない。

s_shi
質問者

お礼

回答ありがとうございます。 並び替え自体を自動で行っていないため 今回の趣旨とは根本が異なりますが ユーザー定義関数というものを今回初めて 知りました。 ぜひ勉強させていただきます。 ありがとうございました。

関連するQ&A