プロが教える店舗&オフィスのセキュリティ対策術

Excelで下記の文字列を抽出したいのですがどなたか教えてください
例)
- abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出
-- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出したいのですが宜しくお願いします

A 回答 (4件)

エクセルでは文字列の抽出は関数では複雑になる。


そう答えても質問者には、仕様がないかもしれないが、VBAなら素直に考えたとおりコードを組めばできる面はある。
VBAでは変数と言う一時的なデータを次のステップで使えるから。具体的には始めて見つかったスペースなどの位置を次のステップで使えるが、関数では難しい場合が多い。
>先頭の文字が'-'かブランクで任意の文字を取得でブランクの前
例 データ
A列  B列(答え)
qqq asdf ghasdf
wer-ghj ertyghj
qwe ertu-dfgertu
B1にユーザー関数で =kiridasi(A1," ")
標準モジュールに
Function kiridasi(a, b)
a = Replace(a, "-", " ")
p1 = InStr(a, b)
If p1 = 0 Then
kiridasi = 0
Else
p2 = InStr(Right(a, Len(a) - p1), b)
If p2 = 0 Then
p2 = Len(a) + 1
Else
End If
kiridasi = Mid(a, p1 + 1, p2)
End If
End Function
参考
関数では
=MID(SUBSTITUTE(A1,"-"," "),FIND(" ",SUBSTITUTE(A1,"-"," "))+1,FIND(" ",SUBSTITUTE(MID(A1,FIND(" ",SUBSTITUTE(A1,"-"," "))+1,LEN(A1)-FIND(" ",SUBSTITUTE(A1,"-"," "))),"-"," ")))
色んな場合にこれで正しいか自信がもてない。
ーー
エクセルやそのVBAでは、こういう文字列の切り出しには向いてない。
ーー
「正規表現」などのことは、ややそれを目指している考えのようなので、今後こういう内容の問題を多用するなら勉強してはどうでしょう。
ーー
>-- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出
例 データ
--asd--dfgasd
asd--ghyj--sghyj
sd--ddf--ddf
B1にユーザー関数 =kiridasi2(A1,"--")  と入れる。
ーー
ユーザー関数
Function kiridasi2(a, b)
p1 = InStr(a, b)
'MsgBox p1
'MsgBox Replace(a, b, " ", Count:=1)
p2 = InStr(Replace(a, b, " ", Count:=1), b)
'MsgBox p2
kiridasi2 = Mid(a, p1 + 2, p2 - (p1 + 2))
End Function
VBAのReplace関数には、countという引数で、置き換える文字列の個数を指定出来るので助かる。
エクセル関数には無いようだ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Excelを使用していると、知人からもVBAは覚えるべきだと言われます、作業効率をはかるため、この機会にやりたいと思います。
言語はCOBOLのプログラムを作成したことはあるのですが
手始めに何か良いVBAの入門書があれば教えてください。

お礼日時:2011/04/12 17:13

》 任意の文字,桁も不明で2回目の'--'後の・・・



「任意の文字,桁も不明」なのに「'--'後」と仰ってる!矛盾してませんか?

空白は何個あっても文字列と称さないと仮定すれば、
ご質問の意味は、
左端の文字列の個数が1個なら、1個目の同文字列の直後の文字列を、
左端の文字列の個数が2個なら、2回目の同文字列の直後の文字列を、
左端の文字列の個数が3個なら、3回目の同文字列の直後の文字列を、
左端の文字列の個数がn個なら、n回目の同文字列の直後の文字列を、
ということですか?
それとも、左端の文字列は必ず「-」が1個以上あるので、その個数に応じて抽出位置を計算したいと?

この回答への補足

ありがとうございます
質問の内容ですが、1番目については、先頭の文字が'-'かブランクで任意の文字を取得でブランクの前までを取得したいのです。2番目めは'-'かブランクで2番目の任意の文字桁数でやはりブランクの前の文字列を取得したいのです。宜しくお願いします。

補足日時:2011/04/12 08:10
    • good
    • 0

>- abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出


=TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",100)),100,100))

>-- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出
=TRIM(LEFT(SUBSTITUTE(TRIM(REPLACE(A1,1,FIND("--",A1,FIND("--",A1)+1)+LEN("--"),))," ",REPT(" ",100)),100))
    • good
    • 0
この回答へのお礼

ありがとうございます。
上記内容でやってみました。結果問題なく処理できました。
REPT関数は今回初めて使いました。
関数は煩雑になりやすいのですが、短く応用しやすいので助かりました。

お礼日時:2011/04/12 17:34

>- abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出



 抽出開始位置は解りましたが、どこまでを抽出すれば良いのかが不明です。
 2番目の空白の1文字前まででしょうか?
 それとも最初に現れる"xxxx"の2文字前まででしょうか?
 それとも最初に現れる"----"の部分から数えて後ろから2番目の空白の1文字前まででしょうか?
 質問をなさるのでしたら、条件を明確にして頂く様、御願いします。

 取り敢えず、「最初の空白の1文字後から、2番目の空白の1文字前まで」の場合に関して回答させて頂きます。
 今仮に、元の文字列がA1セルに入力されているものとしますと、抽出結果を表示させるセルには、次の数式を入力されると良いと思います。

=IF(LEN(A1)-LEN(SUBSTITUTE(A1," ",))>1,MID(A1,FIND(" ",A1)+1,FIND(" ",A1,FIND(" ",A1)+1)-FIND(" ",A1)-1),"")


>-- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出

 2番目の"--"の後は、"def"ではなく、" def zzz"だと思います。
 もしかすると、抽出開始位置は2番目の"--"の後ではなく、2番目の"-- "の後からではないでしょうか?
 仮にそうだとしても、どこまでを抽出すれば良いのかが不明です。
 例えば、

-- abc -- def ghi zzz jkl

という文字列の場合は、どこまでを抽出すれば良いのでしょうか?
 " zzz"の直前までと考えて、

def ghi

を抽出すれば良いのでしょうか?
 それとも、最後の空白の直前までと考えて、

def ghi zzz

を抽出すれば良いのでしょうか?
 それとも、"-- "の後で最初に現れる空白の直前までと考えて、

def

を抽出すれば良いのでしょうか?
 此方も、条件を明確にして頂く様、御願いします。

 取り敢えず、「2番目の"-- "の直後から、その後で最初に現れる空白の直前まで」の場合に関して回答させて頂きます。
 今仮に、元の文字列がA1セルに入力されているものとしますと、抽出結果を表示させるセルには、次の数式を入力されると良いと思います。

=IF(ISNUMBER(FIND(" ",A1,FIND("゛",(SUBSTITUTE(A1,"-- ","゛",2)))+LEN("-- "))),MID(A1,FIND("-- ",A1,FIND("-- ",A1)+1)+LEN("-- "),FIND(" ",A1,FIND("゛",(SUBSTITUTE(A1,"-- ","゛",2)))+LEN("-- "))-FIND("-- ",A1,FIND("-- ",A1)+1)-LEN("-- ")),"")
    • good
    • 0
この回答へのお礼

上記内容でやってみました。結果がきちんと出せました。
関数のISNUMBERは今回初めて使いました。
いろいろ応用ができそうです。

ありがとうございます。

お礼日時:2011/04/12 17:24

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