[[20180418102736]] 『Excel VBA 文字列の数字抽出』(マクロン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Excel VBA 文字列の数字抽出』(マクロン)

Excel VBAでご質問です

A列に文字列が入っています。

文字+数字(文字列)+文字

文字数は変動します。
文字列で入っている数字を抽出したいです

そこで下記の構文を作成したのですが正しく作動しません
訂正方法をご教示願います。

Dim myData As Variant

myData = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")

Range("B1:B" & Range("A" & Rows.Count).End(xlUp).Row).Formula = "=MID(RC[-1],myData,13)"

Excel VBA を作成しているのでVBA以外の回答はご遠慮下さますようお願い申し上げます

< 使用 Excel:Excel2013、使用 OS:Windows8 >


そんな事をおっしゃっても、間違えているのは数式部分ですよ? まずは、数式をシートに手入力して式が正しいか確認してから、マクロで自動代入するようにしましょう。

現状では、myDataはマクロ内の配列でしかないですし、しかもMIDの第2引数は取り出したい文字位置なので、何をしたいのか判りません。 数字が何文字目か決まっていて、それは13文字固定なのでしょうか? でもそれだと配列にしようとしている意味が無いですし…。 どういう文字列を対象にすると、どういう結果にしたいのかを説明していただくのが手っ取り早いでしょう。
(???) 2018/04/18(水) 10:43


 文字列内にある数字のみ抜き出す、ということでしょうか。
 ユーザー定義関数を作成してみましたのでご参考になれば。
 とりあえず、半角数字が含まれている場合のみ。

 Function GetNumeral(tmp As String)
    With CreateObject("VBScript.RegExp")
        .Pattern = "[^0-9]"
        .Global = True
        GetNumeral = .Replace(tmp, "")
    End With
 End Function
(ろっくん) 2018/04/18(水) 10:57

では私は現状の数式代入部分を活かした案を。
代入する式を以下のようにすると、文字検索して見つかった位置から13文字抜き出すようにできますが、それがやりたかった事かどうかは判りません。 myDataは不要。
 "=MID(RC[-1],MIN(FIND({0,1,2,3,4,5,6,7,8,9},RC[-1]&""0123456789"")),13)"
(???) 2018/04/18(水) 11:04

Sub main()
    Dim c As Range, n As Variant, i As Long
    For Each c In Range("A:A").SpecialCells(xlCellTypeConstants)
        c.Offset(, 1).Value = ""
        For i = 1 To Len(c.Value)
            For Each n In Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
                If Mid(c.Value, i, 1) = n Then c.Offset(, 1).Value = c.Offset(, 1).Value & n
            Next n
        Next i
    Next c
End Sub
(mm) 2018/04/18(水) 11:07

 Option Explicit
Sub main()
    Dim sh01 As Worksheet
    Dim i As Long, j As Long, k As Long
    Dim buf As String
    Set sh01 = Worksheets("Sheet1")
    Dim myData As Variant
    With sh01
    myData = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
    For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
        For j = 1 To Len(.Cells(i, 1))
            For k = 0 To UBound(myData)
                If Mid(.Cells(i, 1), j, 1) = myData(k) Then
                    buf = buf & Mid(.Cells(i, 1), j, 1)
                End If
            Next
        Next
        .Cells(i, 2) = buf
        buf = ""
    Next
    End With
End Sub
(隠居じーさん) 2018/04/18(水) 11:20

VBA でやるならこんなとか。。。

Sub test001()

    Dim v As Variant
    Dim s As String
    Dim i As Long
    Dim n As Long

    v = Range("A1").CurrentRegion
    For i = LBound(v) To UBound(v)
        s = v(i, 1)
        For n = 1 To Len(s)
            If Mid(s, n, 1) Like "#" Then
                s = Val(Mid(s, n))
                Exit For
            End If
        Next
        v(i, 1) = s
    Next

    Range("A1").CurrentRegion.Offset(, 1).Value = v
End Sub

所詮数式をマクロで入れていて、その数式が違うから期待通りの答えが得られないだけなら、
まず数式をちゃんと勉強すべき。。。ですよね?
とげのある言い方をしたら質問する側が損するだけですよ。

すみませんが、数式は苦手なので、それは他の人の回答を参考に。
(まっつわん) 2018/04/18(水) 12:03


回答でなくて便乗で教えて下さい。

まっつわんさんの
If Mid(s, n, 1) Like "#" Then
↑でLike演算子でナンバー記号と比較してますが、これで数字であるかが判定できるということでしょうか?
すぐにExcel起動できないので、もし余力があればご教授ください。>All
(もこな2) 2018/04/18(水) 12:16


http://officetanaka.net/excel/vba/tips/tips35.htm
>これで数字であるかが判定できるということでしょうか
みたいですよ。

私も知りませんでした。今調べてわかりましたです。 ^^

(隠居じーさん) 2018/04/18(水) 12:28


Sub main2()
    Dim c As Range, i As Long
    For Each c In Range("A:A").SpecialCells(xlCellTypeConstants)
    Do
        If Val(Mid(c.Value, i + 1)) > 0 Then c.Offset(, 1).Value = Val(Mid(c.Value, i + 1)): Exit Do
        i = i + 1
    Loop
Next c
(mm) 2018/04/18(水) 12:45

なるほど!

だから、ナンバー記号って言うんですね。
私のなかで、89へぇ 今週トップの豆知識にランクイン!!

>マクロンさんへ
便乗質問、スレ汚し失礼しました。
(もこな2) 2018/04/18(水) 12:47


皆様
ありがとうございました!!!見事できるようになりました。

他の部、他の人からの依頼でVBAを作成しておりますので、VBA以外の フィルターでとか
Wordの方が早いとかそういった回答をいただいても手間ばかりおかけしてしまうので。

また、Excel自体も自分で作成していないので、結合はしないで作成しなおすとか
次回よりこういった書式でとかの指定もできないのが実情です。
他部門よりこのExcelデータの加工をVBAで構文を作成しろとの依頼でやっております。

なので、初めに条件はVBAでと指定したかったのですが「とげ」のあるとのご指摘があり
次回よりVBA限定で回答をもらいたい場合どういった書き方をすれば皆様に失礼にならないか
そちらもご教示いただけると助かります。
(マクロン) 2018/04/18(水) 15:33


 >Excel VBA を作成しているのでVBA以外の回答はご遠慮下さますようお願い申し上げます

 今回は「.Formula」と数式に絡んだ質問なので話が込み入っちゃいますが、一般論として)

 日本語としては非常に丁寧な表現ですので、言葉使いの問題じゃないでしょうね。

 わざわざ、VBA以外で回答する人を想定して、出てくるな、と言ったニュアンスがあるからでしょう。

 単に「VBA限定でお願いします」の方が、不思議に「とげ」がないです。

 どう書いたところで、数式案がいいと判断されれば、数式案は出てきます。
 それは(迷惑には違いないが)止められないです。

 ここが有料サイトで、マクロンさんが客の立場なら、また受け取られ方も違ってきます。

(半平太) 2018/04/18(水) 16:13


>どういった書き方をすれば皆様に失礼にならないか

ワイワイガヤガヤだれでも参加できる掲示板で、参加者を限定するような言い方をしなければ、
失礼にならないかなと思います。
出てきた情報は、そちらで取捨選択すればいいのでは?

そんなことより、
>皆様
>ありがとうございました!!!見事できるようになりました。
いろいろな案が出てますが、
どのような理由でどの案を採用された、
あるいは応用されましたでしょうか?

マクロンさんもそうでしょうが、みんなも情報が欲しくて、みんな寄り集まっていると思います。
その中で、知っていることがあれば情報を提供しますし、
当然他の回答も参考にしたいですよね?
また、どうやったら質問の事柄を実現できるかを、勉強した結果を、
共有しようと書き込む人も居るでしょう。
なので、どうやって解決したかの情報もフィードバックしたら、
またみんなに参考になると思いませんか?
そうやってみんなで情報を共有できたらいいと思いませんか?

たしかに、質問側は受け身なので謙った態度を示すほうが得策ですが、
謙り過ぎても一周回って上から目線に感じる場合もあります。
(僕はどうしても「お疲れ様」という挨拶になじめないのですが^^;
疲れてないしね^^;)
単に、
「○○するには、どうすればいいですか?」
と聞けばよくないですかね?
あとは、返ってくる答えを取捨選択して、自分の状況に合わせればいいと思いますが、
いかがでしょうか?
お腹いっぱいのところにたくさんの情報が出てきてパニックになりそうになるから、
回答を限定したいのは解らなくもないですが、
回答を限定するのも損だと思うのですよね。
目から鱗の情報はどこから出てくるかわからないので、
いろんな情報を広く受け付けるのも悪くないと思いますが、いかがでしょう?

そんなことより、もっと見過ごせない発言が!!!

>他部門よりこのExcelデータの加工をVBAで構文を作成しろとの依頼でやっております。
みんなは無報酬で情報を提供しているのに、
マクロンさんは、業務の中で報酬をもらっているのですか!!!!
これは聞き捨てならない!
今まで書いたサンプルの著作権を主張せねば!!!

となるので、そういうことは書かない方がいいです。
仕事のできない上司から無理難題を押し付けられている体で、
質問すればよいかとwww

あと、掲示板はここだけじゃないので、
VBA限定の掲示板に書けば、少しはVBA限定の話しにはなると思います。

(まっつわん) 2018/04/18(水) 17:39


 VBAしか期待していないのに、なんでも参考にする雰囲気を出すのもどうなんですかねぇ。

 実は、それ以外の回答は見向きもしないつもりなら、あれこれ考えた人が馬鹿を見ると思うけどなぁ。

 明確な限定意思があるなら(私は)明示して欲しい。 

(半平太) 2018/04/18(水) 18:41


皆様 いろいろご意見ありがとうございました。

今回は

 "=MID(RC[-1],MIN(FIND({0,1,2,3,4,5,6,7,8,9},RC[-1]&""0123456789"")),13)"
を使用させていただきました。その他の構文もそれぞれいろいろな場面で使用させていただきたいと
思っております。

またExcel VBA専用 掲示板があるとは知らなかったので大変良い情報をありがとうございました。
こちらと併用で利用させていただきたいと思います。
(マクロン) 2018/04/19(木) 19:24


遅ればせながら参加します。

言葉って難しいですよね・・・あんまり丁寧に書きすぎても慇懃無礼に思われることもありますし。
私も最初のメッセージを拝見したときに、「私の望む回答以外はするな!」という感じに受け取ってしまいました。

どのような質問の仕方が〜もいろんな意見あるとおもいますが、個人的にはこのような掲示板って、たしかに質問者さんの質問に答えるという形ではありますけど、ある意味みんなでQ&A集を作っていくような意味もあるんじゃないかなって思ってます。

そういった意味では質問者さんは求めてない回答なのかもしれませんが、同じような悩みを持って訪れた方の役に立つかもしれませんし、今は必要としてなくても将来ほかのシーンで使えるかもしれないので、回答を限定するとむしろ勿体ないなぁなんて思います。
(タダで引き出し増やしてくれるっていうんだから、本来、めちゃくちゃラッキーなことですよね。)

ちなみに、数式を提案されたときのことを心配したってことですけど、数式で出来るってことは、Excel君の機能で普通にできるってことですから、VBAのコードに置き換えることはわりと容易だとおもうんで、あんまり心配することでもないような気がします。
(わからなければ、その時点で、勉強のため〇〇〇という数式をVBAのコードにしてみたのですが、××がよくわかりません。みたいな聞き方をすれば、すぐに答えが返ってくるようにおもいます。)

最後に、
最初の質問で、〜〜.Formula = "=MID(RC[-1],myData,13)"
最後の〆で、 "=MID(RC[-1],MIN(FIND({0,1,2,3,4,5,6,7,8,9},RC[-1]&""0123456789"")),13)"
って仰っているので、思いっきり”数式”だと思うんですが、VBAで処理しろっていう要件があったのでは?
さらに言えば、数式の中身がR1C1参照形式になってますけど、大丈夫なんですか?
なんてことが気になりました。余計な一言であればごめんなさい。
(もこな2) 2018/04/19(木) 23:21


 >またExcel VBA専用 掲示板があるとは知らなかったので大変良い情報をありがとうございました。
んと、一応語弊があるような無いような感じなので、言っておくと、
ここは区別が無いけど、別のサイトでは区別があるサイトもあるということです。

区別のないところ
http://www.excel.studio-kazu.jp
https://answers.microsoft.com/ja-jp/msoffice
http://www.vbalab.net/vbaqa/c-board.cgi?id=excel

区別のあるところ
http://excelfactory.net/excelboard/
http://www.moug.net

有名所はこんな感じでしょうか。
皆さん巡回されているようで、見掛けたことがあるハンドルネームをあちこちで見かけます。

ホントに情報が欲しいなら、検索しているとちょいちょい見つかるので、
知らないっていうことは検索してないってことかな?

(まっつわん) 2018/04/20(金) 08:06


 よく分からない、我田引水的な理屈が並ぶなぁ。

 区別のないところでも、質問をVBA限定にするのは何ら差し支えない。

 無用なやり取りを避け、迅速な解決を図る為にも、意思表示は必要である。

 小さな親切の押売りは止めましょうよ。

(半平太) 2018/04/20(金) 08:44


>よく分からない、我田引水的な理屈が並ぶなぁ。
まぁそりゃ、参加自由な掲示板ですから、気が向いたときに、ある意味好き勝手に、
自分はこう思いますよって書くんじゃないですかね。

もし、ここが参加者が出資する形で運営されてて、運営方針は出資者が決めますみたいな
規約があるんなら、考えを押しつけることもできるかもですが、そうではないですから、
いろんな考え方があるんだなぁくらいでいいんじゃないかと(私は)おもいます。

>マクロンさんへ
ちょっと気になったので、A1参照形式のときに、手動でB1セルを選択して、数式バーに
「=MID(RC[-1],MIN(FIND({0,1,2,3,4,5,6,7,8,9},RC[-1]&""0123456789"")),13)」
っていれたらやっぱりExcel君から怒られました。(Excel2013でテスト)

次に、以下のコードを実行したところ

    Sub テスト()
        Range("B2").Formula = _
            "=MID(RC[-1],MIN(FIND({0,1,2,3,4,5,6,7,8,9},RC[-1]&""0123456789"")),13)"
    End Sub

B2セルには、「=MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789")),13)」
と入ってくれたので、FormulaプロパティでR1C1形式の数式を設定しようとしても
Excel君の方で調整してくれるみたいですね。

ただ、
A2セルに「あ9い4う458えおABCDEFG」っていれたら、
B2セルに「9い4う458えおABCD」って取り出されるんですが
これでいいんでしょうか?

聞きたいのって、こんなことだったんじゃないかと思ったんですが・・・
(あえて、ユーザー定義関数にしてみました)

    Function 数字抽出(セル As Range)
        Dim i As Integer
        Dim buf As String

        If Len(セル.Value) < 1 Then
            数字抽出 = ""
            Exit Function
        End If

        For i = 1 To Len(セル.Value)
            If IsNumeric(Mid(セル.Value, i, 1)) Then
                buf = buf & Mid(セル.Value, i, 1)
            End If
        Next i

        数字抽出 = buf

    End Function

(もこな2) 2018/04/20(金) 12:17


 >ある意味好き勝手に、 
 >自分はこう思いますよって書くんじゃないですかね。

 程度問題です。

 トピ主の意向は出来るだけ尊重されるべきです。

(半平太) 2018/04/20(金) 12:57


 >「私の望む回答以外はするな!」という感じに受け取ってしまいました。
 その理解でいいと思いますよ?

 数多くの質問の中でVBA,一般機能,関数等で限定した質問があった場合、その要望に沿った回答が付くのが望ましいと思う。

 また、「だれだれさんと被りましたが折角書いたのでアップします。」
 というのを見ますが、関数案はともかくVBAで尚且つ同じ手法で殆ど同じようなコードをアップするのはどうかと思う。

 自分の勉強のつもりなら、アップしなくても確認できるはず。
( seiya) 2018/04/20(金) 14:26

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.