• ベストアンサー

VBAにて文字列の数字を抽出(スペース含まれる)

例(B3セル) ○○商店 1号店 京都 2001/3/24 価格 '07~'08  の「2001/3/24」部分をC3に抽出 *文字列にはスペースを含み、B3からデータのある所(約300行)までの結果をC列に抽出したいと思います。  セル内の並び順はまちまちです。 参考にできるWebなどありましたら宜しくお願い致します。

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

  • ベストアンサー
noname#187541
noname#187541
回答No.5

No.1・3です。 例としてあげている文字列を日付の位置を変えて複数で試してますが、きちんと抽出されます。 含まれるスペースは、例では全角なので全角で処理していますが、実際は半角であるとか、日付部分の前後にはスペースがないとか、実際のデータと例には、何か違いがありませんか?

maki6006
質問者

お礼

再度 回答有難う御座います。 スペース部分ですが、全角に見える所が「半角」X2となっておりました。 >mystr = Split(myrng.Value, " ") 「" "」とし結果OKでした。 お手数お掛けしました。 VBAとてもすっきり気に入っております。

その他の回答 (4)

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

こんばんは。 >○○商店 1号店 京都 2001/3/24 価格 '07~'08 スペースがなくても、どこにあっても構いませんが、年月日はひとつのセルに二つあれば、最初側のものを取得します。 なお、以下のマクロは、年数が3桁の場合は、例えば、201 は、01を取得して、それを年数に変えますから、2001年として扱われます。しかし、年は、4桁のほうが確実です。今のコードでは、2桁は間違った年月日が出る可能性があります。 ユーザー定義関数の前のPrivate キーワードを外して、ワークシートに数式を貼り付ければ、そのまま年月日を取り出すことが可能です。正規表現さえ書ければ、他に取り出すことも可能です。 '------------------------------------------- Sub MacrpTest1() '実行マクロ Dim c As Range Dim buf As Variant  Application.ScreenUpdating = False  With ActiveSheet  '指定範囲  For Each c In .Range("B1:B300")   If VarType(c) = vbString Then     buf = PickUp(c.Value)     If IsDate(buf) Then     c.Offset(, 1).Value = CDate(buf)     End If   End If  Next c  End With  Application.ScreenUpdating = True End Sub Private Function PickUp(strTxt As Variant, Optional Ptn As String = "") Dim buf As String Dim Matches As Object With CreateObject("VBScript.RegExp")   strTxt = Trim(StrConv(strTxt, vbNarrow))   If Ptn = "" Then    .Pattern = "(\d{2}|\d{4})\/\d{1,2}\/\d{1,2}"   Else    .Pattern = Ptn   End If  .Global = False  If .Test(strTxt) Then   Set Matches = .Execute(strTxt)   buf = Matches(0).Value  Else   buf = ""  End If End With   PickUp = buf End Function

maki6006
質問者

お礼

回答有難う御座います。 月数字が「03」の時でも、結果は「3」と表示されますのでとても感動しております。 >年は、4桁のほうが確実です。 元データは常に4桁ですのでよかったです。ご親切に有難う御座います。 ワークシートに貼り付けるとした場合「どこ」から「どこまで」か詳細教えて頂けますと有難いです。素人で申し訳御座いません。

noname#187541
noname#187541
回答No.3

No.1です。 >セル内の並び順はまちまちです。 これを見逃してました。それとB列(連続での入力として)対応にしました。 Dim mystr() As String Dim i As Long Dim tmp As String Dim myrng For Each myrng In Range("B3:B" & Range("B" & Rows.Count).End(xlUp).Row) mystr = Split(myrng.Value, " ") For i = 0 To UBound(mystr) If IsDate(mystr(i)) Then tmp = mystr(i) Next myrng.Offset(, 1).Value = tmp Next 参考にどうぞ。

maki6006
質問者

お礼

2度の回答有難う御座います。 VBA実行後、何も変化なしとなってしまいました。 一度確かめて頂けますと助かります。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! お役に立てるかどうか分かりませんが・・・ VBA以外で無理矢理って感じの方法になってしまいますけど 「価格」の前に「月日」が「2009/7/26」のように入力されている場合限定ですが、 C3セルを =IF(B3="","",MID(B3,FIND("200",B3)-1,11)) としてオートフィルで下へコピーではダメでしょうか? 尚10月以降2桁の月もあるためこのような数式にしましたが、 万一、1桁(~9月)までの月の場合は 年月日の次にスペースがない場合はスペースの次の文字も拾い出してしまいます。 そして、月日が2010年以降とか1999年だとエラーになります。 また、年月日以外に「200」という数値があれば 希望通りの表示になるかどうか分かりません。 以上、参考にならなかったら無視してくださいね。m(__)m

maki6006
質問者

お礼

有難う御座います。 質問事項に添わないのですみません。

noname#187541
noname#187541
回答No.1

こんばんは。 文字列の内容がすべて同じ規則、つまり、スペースで区切られていて抜き出す日付が4番目にあるのであれば、Split関数で出来ます。 Dim mystr() As String mystr = Split(Range("B3").Value, " ") Range("C3").Value = mystr(3) Split関数の第2引数は区切り文字の指定ですが、提示の文字列のスペースが全角のスペースなので、全角スペースにしています。

関連するQ&A

  • エクセル 文字列から数字だけを抽出

    エクセル2016の操作について教えて下さい。 セル内の文字列から数字だけを抽出したいです。 例えばAの列にこのような文字列が入っているとします。 高度5km 高度10.1km この中の数字だけを取り出して隣のB列の同じ行に数字だけを表示させる方法がありましたら教えて下さい。 宜しくお願いします。

  • スペースを含んだ文字列から文字列の抽出

    エクセルバージョン2007 スペースを含む文字列で、A列に文字列がある時、以下の式を組んで文字列を抽出しています。 先頭にIDの数字が有る場合は、それぞれの目的に合った文字列を抽出しています。 B1=LEFT(A1,SEARCH(" ",A1,1)-1) C1=LEFT(MID(A1,SEARCH(" ",A1,1)+1,LEN(A1)-SEARCH(" ",A1,1)),SEARCH(" ",MID(A1,SEARCH(" ",A1,1)+1,LEN(A1)-SEARCH(" ",A1,1)),1)-1) 3 3df-32654-10 CCCCHH 10 1ab-12345-00 AAABBBB この文字列の場合、B列に3と10が表示、C列に 3df-32654-10 1ab-12345-00が表示されます。 先頭に、IDの無い文字列は以下の様な構成です。 6rt-95132-00 PPPKKK この文字列の場合、B列に6rt-95132-00、C列にPPPKKKが表示されてしまい、この場合、IDの数字が無い場合はB列には表示させない又は、C列に6rt-95132-00させたいと思っています。 ご教授頂ければ幸いです。 以上、宜しくお願い致します。

  • 文字列の抽出について

    A列に 500行位の文字列があり、 その行の中から以下を抽出したいです。 ただ、抽出したい文字列は、0123456で始まり、abcdという文字列まで。 しかも改行されています。 ※抽出したい文字列 【A列 0123456 ~ B列 abcd】という文字列 【F列 0123456 ~ B列 abcd】という文字列 A列 0123456 B列 xxxx abcd C列 1111 D列 2222 E列 3333 F列 0123456 G列 xxxx abcd H列 4444 I列 5555 J列 6666 宜しくお願い致します。

  • エクセルで文字列の抽出方法についてお尋ねします。

    宜しくお願いします。 エクセルを使用して条件付の文字列の抽出をしたいと思っています。 A列のセルに2つの文字列がスペースを挟んで50行ほど入っています。 また、その中にはひとつの文字列しか入っていないものもあります。 イメージ的には以下のようなものです。 | A | B ------------------------------------- 1|エクセル マウス| -------------------------------------- 2|エクセル ペン | -------------------------------------- 3|エクセル ノート | ------------------------------------- 4|エクセル    | ------------------------------------- 上記の例では「エクセル」という文字はひとつのセルですが コレが多くあります。 ここで、2つの文字列の組み合わせだけをB列に表示させることは 出来ますか? また、このパターンが終わった後に、「エクセル」という文字列の代わりに 「ワード」という文字列のものが51行目から続きます。 ここでも2つの文字列の組み合わせと「ワード」単体のものとが あるので、出来れば2つの文字列の組み合わせだけをB列に表示し なおかつ上の方へ詰めて表示したいのです。 分かりづらい質問で申し訳ありません。 宜しくお願いします。

  • 表の中でもっとも多く使用されている文字(数字)を抽出するには

     |A|B|C|D| -------------- 1|あ|い|う|え| -------------- 2|お|あ|あ|か| -------------- 上記は1行目に左から「あ」「い」「う」「え」が入力されていることを表しています。 この表の中から、一番多く入力されている文字だけを別のセルに抽出させるにはどのようにしたら良いでしょうか。 上記の例を使用すると、A列の5行目(任意のセル)に「あ」と抽出するようにしたいです。 いろいろと調べてみましたが、このように表の中で最も多く入力されている、「文字」または「数字」だけを抽出するという処理方法がみつかりませんでした。 マクロなら可能でしょうか? このような処理ができる関数もなさそうなので、無理なのかな。 アドバイスを御願い致します。

  • Excel 文字列の抽出

    Excel初心者です。 1つのセルに以下のデータが入力されています。 A:文字列B:文字列C:文字列D:文字列 このセルの「C:」から「D:」の間にある文字列を 他のセルに抽出する方法を教えてください。 宜しくお願いいたします。

  • エクセル 文字列の中から数字を抽出する方法

    エクセル 文字列の中から数字を抽出する方法 以前 QNo.5823420 で質問させて頂いたんですが 再度質問させてください。 "オーダー番号"+"半角スペース"+"部品型番"+"半角スペース"+"個数"+"半角スペース"+"部品名" というような文字列の中から個数の数のみを抽出する方法を教えてください。 "文字列"+"半角スペース"+"文字列"+"半角スペース"+・・・と文字列の繋がる数は決まってませんので 個数は何番目のスペースの後にくるかは不定です。 数量の半角"ケ"とその前の半角スペースまでの間の数字を抽出したいです。 例1)文字列 :ABC110 XXYYZZ5566 2ケ ****   抽出文字:2 例2)文字列 :ABC XYZ 5566 DDEE11 3ケ FFGG   抽出文字:3 よろしくお願いします。

  • EXCELで文字列内のスペースの抽出

    EXCEL2000を使用しています。 A列に文字列が300行ほど入力されています。 ある条件で、各文字列の先頭にスペース(空白)が0個~3個ついています。 いま、文字列の先頭にあるスペースの数をB列に表示させたいのですが、 どのような関数を使えば良いでしょうか。 ご存じの方、ご教授下さい。

  • エクセルの文字列の抽出方法について

    ★★エクセルの文字列の抽出方法について★★ 下記の「対象セルの内容」のような感じで1つのセルの中に複数行の文字列が入っているのですが、 下から3行とか4行とかを指定して文字列を抽出したいと考えています。 ■対象セルの内容 [改行] [改行] [改行] a/b/r1.php[改行] a/b/r2.php[改行] a/b/r3.php[改行] a/b/r4.php ■抽出したい値 a/b/r2.php[改行] a/b/r3.php[改行] a/b/r4.php 何かしらうまい方法はないでしょうか。 ご教授なにとぞよろしくお願いいたします。

  • 【excel2003 vba】指定した文字列が入力されている「セル範囲」の表示方法?

    ◎Sheet1  A B C D E 1○○○-- 2○○○×× 3---×× 4×○--- ※「-」は空白 上記のようにセルに「○」「×」が入力されている「Sheet1」シートがあります。(例として○×の2種類を使っていますが、本当はもっとたくさんの種類の文字列があります。) vbaを使って、以下の一覧表を「List」シートに作成するコードを作成できませんでしょうか? ◎List  A     B 1○     ×  '文字列の種類 2A1:C2  D2:E3 '文字列の範囲  3B4     A4  '同上 【ToDo】 (1)1行目に文字列(○、×)を入力する (2)1行目に入力してある文字列が入力されているすべての「セル範囲」を2行目以降の各列に抽出する。 **1セル内に「○」「×」の両方が入力されているものもある。**  ⇒例えば、A1セルに「○×」と入力されていたら、「Rist」シートのA列B列の両方に「A1」が抽出されるようにしたい。 1セルごとのセル番地(○:A1,A2,B1,…)を一覧化することはできるのですが、同じ文字列をまとめた「範囲」の抽出ができないのです。 どなたかお力添えをお願いできませんでしょうか? 宜しくお願い致します。

専門家に質問してみよう