No.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という引数で、置き換える文字列の個数を指定出来るので助かる。
エクセル関数には無いようだ。
ありがとうございます。
Excelを使用していると、知人からもVBAは覚えるべきだと言われます、作業効率をはかるため、この機会にやりたいと思います。
言語はCOBOLのプログラムを作成したことはあるのですが
手始めに何か良いVBAの入門書があれば教えてください。
No.3
- 回答日時:
》 任意の文字,桁も不明で2回目の'--'後の・・・
「任意の文字,桁も不明」なのに「'--'後」と仰ってる!矛盾してませんか?
空白は何個あっても文字列と称さないと仮定すれば、
ご質問の意味は、
左端の文字列の個数が1個なら、1個目の同文字列の直後の文字列を、
左端の文字列の個数が2個なら、2回目の同文字列の直後の文字列を、
左端の文字列の個数が3個なら、3回目の同文字列の直後の文字列を、
左端の文字列の個数がn個なら、n回目の同文字列の直後の文字列を、
ということですか?
それとも、左端の文字列は必ず「-」が1個以上あるので、その個数に応じて抽出位置を計算したいと?
この回答への補足
ありがとうございます
質問の内容ですが、1番目については、先頭の文字が'-'かブランクで任意の文字を取得でブランクの前までを取得したいのです。2番目めは'-'かブランクで2番目の任意の文字桁数でやはりブランクの前の文字列を取得したいのです。宜しくお願いします。
No.2ベストアンサー
- 回答日時:
>- 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))
ありがとうございます。
上記内容でやってみました。結果問題なく処理できました。
REPT関数は今回初めて使いました。
関数は煩雑になりやすいのですが、短く応用しやすいので助かりました。
No.1
- 回答日時:
>- 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("-- ")),"")
上記内容でやってみました。結果がきちんと出せました。
関数のISNUMBERは今回初めて使いました。
いろいろ応用ができそうです。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- その他(プログラミング・Web制作) Chromeのデベロッパーツール プログラム 2 2022/06/21 20:27
- Excel(エクセル) SUMIF関数について 4 2023/06/14 13:13
- Excel(エクセル) Excel>マクロ>特定のセルで同じ情報が登録されている行を1行にまとめたい(文字連結) 6 2023/01/05 16:30
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで、抽出したデータだ...
-
ACCESSのクエリー抽出条件にIIF...
-
PDFファイルから特定の文字を検...
-
ACCESSのフォームからレポート...
-
Accessの選択クエリの抽出条件...
-
「パラメータが少なすぎます。3...
-
AccessのWHERE句において、変数...
-
Excel 文字列から6桁の数値の抽出
-
X-Ripperというフリーウェアに...
-
【AccessVBA】レコードセットOp...
-
エクセルで色の付いたセルを抽...
-
PDFファイル/抽出許可され...
-
Access2003 式ビルダでのLike...
-
Access チェックボックスを利用...
-
取り込んだ画像からのスポイト...
-
Acccess クエリで演算結果を抽...
-
Access クエリ抽出条件の「Bet...
-
未審査請求包袋抽出表作成とは...
-
awkでスラッシュがある動的変数...
-
Accessで複数のクエリの抽出条件
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、抽出したデータだ...
-
PDFファイルから特定の文字を検...
-
「パラメータが少なすぎます。3...
-
未審査請求包袋抽出表作成とは...
-
PDFファイル/抽出許可され...
-
Excel 文字列から6桁の数値の抽出
-
ACCESSのクエリー抽出条件にIIF...
-
X-Ripperというフリーウェアに...
-
エクセルで色の付いたセルを抽...
-
Accessの選択クエリの抽出条件...
-
AccessのWHERE句において、変数...
-
アクセス 同じフィールド(テキ...
-
エクセル関数で住所から丁目番...
-
ACCESS クエリ 条件以外のレ...
-
access クエリ yes/no型のクエ...
-
エクセル VBA メール本文に指定...
-
【AccessVBA】レコードセットOp...
-
Access チェックボックスを利用...
-
Accessで○ヶ月前以前を抽出する...
-
Access フォームコンボボック...
おすすめ情報