- ベストアンサー
マクロ 文字の抽出
いつも回答して頂き、とても感謝しています。 A列に、 abcd1 有り。abcd3へ修正。 abcd15有り。abcd18へ修正。 abcd11有り。abcd9へ修正。 abcd6有り。abcd8へ修正。 ・ ・ ・ とあった場合、最初のabcdの後ろの数字のみ抽出したいのですが、どうすればよろしいでしょうか? 宜しくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>『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
その他の回答 (6)
- mt2008
- ベストアンサー率52% (885/1701)
プログラムを作成するときは、提示されたサンプルデータを元にどの様に処理を行うか検討しますので、「実はこんなパターンのデータも……」と後から出されるとまるっきり作りを変える必要がでる事があり、プログラムを作る側らはとても嫌われます(ほんとう)。 嫌ってはいませんが正規表現で数字の塊の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
お礼
何度も考えて下さり、ありがとうございます。 確かに何度もお願いするのは、失礼ですし、時間を無駄に使わせてしまっていますよね。申し訳ありませんでした。質問する前に、いろんなケースを自分で考えられたらいいのですが、自分はそんなに頭が回らない・・・。 この記述で上手くいきました。ありがとうございました。
- mt2008
- ベストアンサー率52% (885/1701)
ANo.4です。 > abcdの後ろに数字のみだけならうまく表示されましたが、数字の後ろに何かが続くとVALUE!になってしまいます。 御呈示の例では、数字の後は半角スペースか「有」しか有りませんでしたが、他のパターンも有るのでしょうか?
お礼
すみません。実際のファイルは会社にあるので、どれくらいバリエーションがあるのか、自分にもわかりません。そのファイルは多人数の人が入力しているので、もしかすると、スペースや文字も半角の場合があったり、全角の場合が有ったりするかもです・・・。
- mt2008
- ベストアンサー率52% (885/1701)
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
お礼
abcdの後ろに数字のみだけならうまく表示されましたが、数字の後ろに何かが続くとVALUE!になってしまいます。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! データは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
お礼
家で条件を入れて試した所、すべての条件で上手くいきました。あとは、会社のファイルですべてうまく抜き取る事が出来るかです。ありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
>最初の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の位置を探すとか、 あなたの事実に即して適切に応用してください。
お礼
返事が遅くなり申し訳ありませんでした。 さっそく貼り付けて確認した所、しゃかしゃか動いてあっという間に完了しました。で、お手数をお掛けして申し訳ないのですが、『abcd123 123』となった場合、123123と表示されてしまいます。どのようにしたら、abcd直後の数字のみ取り出せるようになるのでしょうか?宜しくお願い致します。
- mt2008
- ベストアンサー率52% (885/1701)
関数でも出来そうですが、マクロが良いというのでしたら。 標準モジュールに↓を入れて 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」を削除、さらに余計な空白を除いて数値にしています。
お礼
さっそく貼り付けてみた所、sDataの箇所でコンパイルエラー(変数が定義されてません)が発生しました。どの箇所で変数を宣言したら良いのか分からないです。申し訳ないですが宜しくお願い致します。
お礼
すみません。会社のファイルで実際に動かして気付いた事なんです。家には会社のファイルはお持ち帰りできませんし・・・。で、その時気付いた条件で試した所、全ての条件で、自分が望むすべての数字を抜き取る事が出来ました。 keithinさんには、いつも感謝しています。