あああ1
あああ2
いいい1
aa1
あああ3
ab1
ab2
いいい2
ab3
ab4
ab5

以上のようなデータが
縦1列に並んでいます。
これを以下のように抽出するには
どのような数式を組めばいいですか?
ご教授お願いします!

(文字列が)あああ(の最大は)3
(文字列が)いいい(の最大は)2
(文字列が)aa (の最大は)1
(文字列が)ab (の最大は)5

このQ&Aに関連する最新のQ&A

A 回答 (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を活用しました。
    • good
    • 0
この回答へのお礼

ばたばたしていてしばらく来れませんでした。
ご丁寧にありがとうございます!
じっくり読ませていただき
早速勉強させてもらいます!!
本当にありがとうございます!!!

お礼日時:2009/06/09 17:00

この抽出を行うには数式では不可能の様。


残された方法は、この抽出作業を人が行う際の思考手順を「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
「文字列+数字から最大を抽出する関数」の回答画像2
    • good
    • 0
この回答へのお礼

しばらく仕事が忙しくのぞけずにいました。
やっと作業ができそうなので来てみたら
すばらしい回答ありがとうございます!!!
関数で簡単にできそうな気がしていたのですが
私にとっては相当難しい作業です。。。
VBAのほうは本当に初歩の初歩の初心者なので
ちょっと行列を変えようとしただけで
まったく思うように動いてくれなくなりました。。。
そこでご面倒おかけしますが
お時間あるときにでもプログラムの概要
(この行はこんな意味、などざっぱなもので結構です!)
を教えていただけると助かります!
どうぞ宜しくお願いします!

お礼日時:2009/05/28 13:42

こんにちは



えっと、回答するような立場じゃないんだけど、いま質問したついでに他のスレッド見てたら目に入ったので・・・

んで、処理系によって違うし言語も書いてないのであれです、コードは書けませんが、目的の数値を正規表現で抽出して比較関数にぶち込めばいいんでないかと。ま、データは配列格納なのかな。言語が不明なのでわかりません。

当方、WINDOW初心者です。ん?これOSの問題か?
    • good
    • 0
この回答へのお礼

すみません。せっかくなんですけど
まったく意味がわかりませんでした。。。
soudan1989さんが初心者とおっしゃるなら
私まだ生まれてもない赤ん坊以下ですね。。。

お礼日時:2009/05/21 11:03

このQ&Aに関連する人気のQ&A

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


人気Q&Aランキング