- ベストアンサー
文字列+数字から最大を抽出する関数
あああ1 あああ2 いいい1 aa1 あああ3 ab1 ab2 いいい2 ab3 ab4 ab5 以上のようなデータが 縦1列に並んでいます。 これを以下のように抽出するには どのような数式を組めばいいですか? ご教授お願いします! (文字列が)あああ(の最大は)3 (文字列が)いいい(の最大は)2 (文字列が)aa (の最大は)1 (文字列が)ab (の最大は)5
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。OkWAveの文字数制限により詳しくは説明しきれません。概略説明になります。 No2にて回答のVBAの概略は以下の通りです。 1行→test: この処理に名づけたVBAの名前、VBAの処理内容にマッチした好きな名前を付けられます。 2~4行→Dim はVBAで使う変数の種類を定義する挨拶文 Dim とAs の間は、VBAで使われる変数名で何を指しているか推測しやすい文字を採用します。2行の”r”はシート内の行番号(row)のイニシャル”r”を採っています。 Long、 Integer、Stringは変数の種類で、夫々、大きな数値、整数、文字を示しています。 5行→C~E列の内容を消去 6行→1行、C~E列に項目名(「文字列」etc)を書き込む 7行~25行→Excelシートの2行からB列の最終行の各行について順次1行ずつVBAの8行から 17行までの処理を繰り返し行いなさいの意味 8行→dtは B列の各セルに書かれたデータ、su=0は変数suに”0”を代入(リセット)を行う。因みにsuはデータ内の数値部分を抽出し格納する変数。 9行~15行→”dt” の1文字目から最終文字目(Len(dt))までVBAの10行から 14行までの処理を繰り返し行いなさいの意味、Len(dt)はB列の各セルに書かれたデータの文字数 10行→B列の各セルに書かれたデータに数字があったら11行目の処理をしなさい 11行→数字を数値化、Ex. dt=”○○123”ならsuは順次 “1”→”1×10+2” →”(1×10+2)×10+3”=123のように変化し、最後は数値”123”となる 12行”dt”内が数字以外なら13行の処理を行う 13行→”dt”内の左側文字部分を抽出し変数”moji”に代入する。 16行→C列に文字部分”moji”を書く 17行→D列に数値部分”su”を書く 19行~20行→文字部分昇順、数値部分降順に並び替え 23行→文字列が前の行と異なったら、その文字列の数値部分が最大を示す故E列に”◎”を記入 26行→A列の昇順に並べ替えを行い、元のデータ並びに戻す 27行→VBA処理の完了 詳しくは、VBAのHELP画面で勉強されますよう希望します。 <HELP画面の表示方法> Moduleに貼りつけたVBAのコード内のスペース文字で区切られた単語 (Ex.”Dim”))内の任意の位置にマウスの「I」カーソルを合わせ「F1」キーを押すと、HELP画面が表示され、その語の説明と用例が表示されます。 小生は、この様にしてHELP画面を見ながら少しずつ用例を覚え、ホストコンピュータからExcel にダウンロードしてもらった1万件以上の受注データの分析にVBAを活用しました。
その他の回答 (2)
- pc_knight
- ベストアンサー率66% (52/78)
この抽出を行うには数式では不可能の様。 残された方法は、この抽出作業を人が行う際の思考手順を「VBA」というExcelなどで働くプログラム言語で表現し、そのプログラムの起動操作を人が行い、抽出作業をプログラムに行わせる方法です。 その為には (1)プログラム言語をExcel内に書く方法を知ること (2)そのプログラムを起動する方法を知ること (3)「VBA」なるプログラム言語を知ること が必要です。 (1) は、http://excelvba.pc-users.net/fol1/1_1.html等を参考に(2) はhttp://www.officepro.jp/excelvba/ini/index3.html等を参考にしたら容易に習得できます。 (3) は自身にあった本を探して根気強く学習するのが良いでしょう。しかし(3)は、長期間を要しますから、当質問に対するプログラム例を以下に参考に掲げます。コピー&貼り付けしてお試し下さい。 Sub test() Dim r As Long Dim p, su As Integer Dim dt, moji As String Columns("C:E").ClearContents Cells(1, "C").Value = "文字列": Cells(1, "D").Value = "数値": Cells(1, "E").Value = "抽出" For r = 2 To Range("B65536").End(xlUp).Row dt = Cells(r, "B"): su = 0 For p = 1 To Len(dt) If IsNumeric(Mid(dt, p, 1)) = True Then su = su * 10 + Val(Mid(dt, p, 1)) Else moji = Left(dt, p) End If Next p Cells(r, "C").Value = moji Cells(r, "D").Value = su Next r Columns("A:E").Sort Key1:=Range("C2"), Order1:=xlAscending, Key2:=Range("D2") _ , Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=True For r = 2 To Range("B65536").End(xlUp).Row If Cells(r, "C") <> Cells(r - 1, "C") Then Cells(r, "E").Value = "◎" End If Next r Columns("A:E").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess End Sub
お礼
しばらく仕事が忙しくのぞけずにいました。 やっと作業ができそうなので来てみたら すばらしい回答ありがとうございます!!! 関数で簡単にできそうな気がしていたのですが 私にとっては相当難しい作業です。。。 VBAのほうは本当に初歩の初歩の初心者なので ちょっと行列を変えようとしただけで まったく思うように動いてくれなくなりました。。。 そこでご面倒おかけしますが お時間あるときにでもプログラムの概要 (この行はこんな意味、などざっぱなもので結構です!) を教えていただけると助かります! どうぞ宜しくお願いします!
- soudan1989
- ベストアンサー率0% (0/2)
こんにちは えっと、回答するような立場じゃないんだけど、いま質問したついでに他のスレッド見てたら目に入ったので・・・ んで、処理系によって違うし言語も書いてないのであれです、コードは書けませんが、目的の数値を正規表現で抽出して比較関数にぶち込めばいいんでないかと。ま、データは配列格納なのかな。言語が不明なのでわかりません。 当方、WINDOW初心者です。ん?これOSの問題か?
お礼
すみません。せっかくなんですけど まったく意味がわかりませんでした。。。 soudan1989さんが初心者とおっしゃるなら 私まだ生まれてもない赤ん坊以下ですね。。。
お礼
ばたばたしていてしばらく来れませんでした。 ご丁寧にありがとうございます! じっくり読ませていただき 早速勉強させてもらいます!! 本当にありがとうございます!!!