• ベストアンサー

マクロ 文字の抽出

いつも回答して頂き、とても感謝しています。 A列に、 abcd1 有り。abcd3へ修正。 abcd15有り。abcd18へ修正。 abcd11有り。abcd9へ修正。 abcd6有り。abcd8へ修正。   ・   ・   ・ とあった場合、最初のabcdの後ろの数字のみ抽出したいのですが、どうすればよろしいでしょうか? 宜しくお願い致します。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.6

>『abcd123 123』となった場合 実はabcdとか関係なしで、要するに何でもアリということでいいんです。それに応じてマクロを複雑にするだけです。 sub macro2()  dim h as range  dim i as long  dim flg as boolean  dim res as variant  for each h in range("A1:A4")   res = ""   flg = false   for i = 1 to len(h)    if isnumeric(mid(h, i, 1)) then     res = res & mid(h, i, 1)     flg = true    else     if flg then exit for    end if   next i   h.offset(0, 1) = val(res)  next end sub

kero1192kero
質問者

お礼

すみません。会社のファイルで実際に動かして気付いた事なんです。家には会社のファイルはお持ち帰りできませんし・・・。で、その時気付いた条件で試した所、全ての条件で、自分が望むすべての数字を抜き取る事が出来ました。 keithinさんには、いつも感謝しています。

その他の回答 (6)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.7

プログラムを作成するときは、提示されたサンプルデータを元にどの様に処理を行うか検討しますので、「実はこんなパターンのデータも……」と後から出されるとまるっきり作りを変える必要がでる事があり、プログラムを作る側らはとても嫌われます(ほんとう)。 嫌ってはいませんが正規表現で数字の塊の1つ目だけを取り出すように作り変えてみました。 Function fSample(sTarget As String) As Long   Dim oRe, sData   Set oRe = CreateObject("VBScript.RegExp")   With oRe     .Pattern = "[^0-9]"     .IgnoreCase = True     .Global = True     sData = Split(Trim(.Replace(sTarget, " ")), " ")     fSample = CLng(sData(0))   End With   Set oRe = Nothing End Function

kero1192kero
質問者

お礼

何度も考えて下さり、ありがとうございます。 確かに何度もお願いするのは、失礼ですし、時間を無駄に使わせてしまっていますよね。申し訳ありませんでした。質問する前に、いろんなケースを自分で考えられたらいいのですが、自分はそんなに頭が回らない・・・。 この記述で上手くいきました。ありがとうございました。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

ANo.4です。 > abcdの後ろに数字のみだけならうまく表示されましたが、数字の後ろに何かが続くとVALUE!になってしまいます。 御呈示の例では、数字の後は半角スペースか「有」しか有りませんでしたが、他のパターンも有るのでしょうか?

kero1192kero
質問者

お礼

すみません。実際のファイルは会社にあるので、どれくらいバリエーションがあるのか、自分にもわかりません。そのファイルは多人数の人が入力しているので、もしかすると、スペースや文字も半角の場合があったり、全角の場合が有ったりするかもです・・・。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

ANo.1です。 > さっそく貼り付けてみた所、sDataの箇所でコンパイルエラー(変数が定義されてません)が発生しました。 あぁ、という事はモジュールの先頭に Option Explicit があって変数の宣言を強制されているようですね。 Option Explicit を削除するかコードを↓の様に変えてください Function fSample(sTarget As String) As Variant   Dim sData ’ここで変数宣言   sData = Split(sTarget, "有")   sData(0) = Trim(Replace(sData(0), "abcd", ""))   fSample = sData(0) * 1 End Function

kero1192kero
質問者

お礼

abcdの後ろに数字のみだけならうまく表示されましたが、数字の後ろに何かが続くとVALUE!になってしまいます。

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

こんにちは! データはA1セル以降にあり、B列に表示するとします。 コツコツやってみました。 Sub Sample1() Dim i As Long, k As Long, cnt As Long Range("B:B").ClearContents For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row If InStr(Cells(i, "A"), "abcd") > 0 Then k = InStr(Cells(i, "A"), "abcd") + 4 cnt = k Do While Mid(StrConv(Cells(i, "A"), vbNarrow), cnt, 1) Like "[0-9]" cnt = cnt + 1 Loop Cells(i, "B") = Mid(Cells(i, "A"), k, cnt - k) End If Next i End Sub こんな感じではどうでしょうか?m(_ _)m

kero1192kero
質問者

お礼

家で条件を入れて試した所、すべての条件で上手くいきました。あとは、会社のファイルですべてうまく抜き取る事が出来るかです。ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

>最初のabcdの後ろの数字のみ抽出したい sub macro1()  dim h as range  for each h in range("A1:A4")   h.offset(0, 1) = val(mid(h, 5))  next end sub ぐらいで十分です。 例えば実は「abcd」が可変だというなら、5の代わりにlen("abcd") + 1するとか、 たとえば実は「abcdで始まるとは保証できない」なら、instrでabcdの位置を探すとか、 あなたの事実に即して適切に応用してください。

kero1192kero
質問者

お礼

返事が遅くなり申し訳ありませんでした。 さっそく貼り付けて確認した所、しゃかしゃか動いてあっという間に完了しました。で、お手数をお掛けして申し訳ないのですが、『abcd123 123』となった場合、123123と表示されてしまいます。どのようにしたら、abcd直後の数字のみ取り出せるようになるのでしょうか?宜しくお願い致します。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

関数でも出来そうですが、マクロが良いというのでしたら。 標準モジュールに↓を入れて Function fSample(sTarget As String) As Variant   sData = Split(sTarget, "有")   sData(0) = Trim(Replace(sData(0), "abcd", ""))   fSample = sData(0) * 1 End Function 適当なセルに =fSample(A1) これでどうでしょう。 「有」の文字を区切り文字として文字列を分け、分けた先頭の文字列中の「abcd」を削除、さらに余計な空白を除いて数値にしています。

kero1192kero
質問者

お礼

さっそく貼り付けてみた所、sDataの箇所でコンパイルエラー(変数が定義されてません)が発生しました。どの箇所で変数を宣言したら良いのか分からないです。申し訳ないですが宜しくお願い致します。

関連するQ&A