質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • VBA

    1854questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • 正規表現

    811questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

【VBA】正規表現

解決済

回答 9

投稿

  • 評価
  • クリップ 6
  • VIEW 1,685

joucomi

score 29

23歳OLです。

VBAと正規表現についての質問です。

▼やりたいこと
================================================
   1 |   0 |1234567890 | 2014-2-22 22:22:22.06+09
という数列から
1234567890 という数字のみを抜き出したいです。
正確には2本目の|と3本目の|の間に入っている様々な数字です。
※桁数が固定されていません。
================================================

▼実際書いたコード
================================================
Sub Sample2()
    Dim RE, strPattern As String, i As Long, msg As String, reMatch
    Set RE = CreateObject("VBScript.RegExp")
    strPattern = "☆この部分☆"
    With RE
        .Pattern = strPattern
        .IgnoreCase = True
        .Global = True
        For i = 1 To 10
            Set reMatch = .Execute(Cells(i, 1))
            If reMatch.Count > 0 Then
                msg = msg & reMatch(0).Value & vbCrLf
            End If
        Next i
    End With
    MsgBox msg
    Set reMatch = Nothing
    Set RE = Nothing
End Sub
================================================
☆この部分に☆に何を入れればよいでしょう?
ご指導よろしくおねがいします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 9

checkベストアンサー

+3

>「J列5行目から14行目の内容の"|"で区切った3つめを取り出して、それを各行のI列に入れる」ですか?
 
まさにこれです!言葉足らずですみません。。。 

ということであれば、
Sub 三番目取り出し()
Dim i As Integer, msg As String, x() As String
Worksheets("sheet1").Activate
For i = 5 To 14
  x = Split(Cells(i, 10), "|")
  If UBound(x) >= 2 Then
    msg = Trim(x(2))
  Else
    msg = ""
  End If
  Cells(i, 9) = msg
Next i
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/24 15:33

    解決しました!皆様長い間ありがとうございました。
    ベストアンサーをいただいた以外の方も、とても勉強になり、今後のプログラムの意欲がわきました。
    どこか勉強会とか行ってみたいです♪

    キャンセル

+1

正規表現は
strPattern = "[0-9]+"
でよろしいかと。
「実際書いたコード」にある、
Set reMatch = .Execute(Cells(i, 1))
でreMatchにコレクション(配列のようなものと考えてよいです)でマッチした文字がすべて返されてきます。
ループで回して、reMatchに帰ってきた文字列をすべて連結すれば、数字のみをすべて抽出できます。
例えば、先頭のDimにjを追加しておいて、Forループのところを下記のようにしたらどうでしょう。
    For i = 1 To 10 
        Set reMatch = .Execute(Cells(i, 1)) 
        For j = 0 To reMatch.Count-1
            msg = msg & reMatch(j).Value
            WScript.echo reMatch.Count
        Next j
    Next i 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/23 11:52

    >strPattern = "[0-9]+"
    一番前の整数だけ取り出すことができました。
    ただ上記質問追記のせいなのでしょうか?
    三番目の数字を取り出すことができません。

    申し訳ないのですが、もう一度ご確認いただくことは可能でしょうか・・・。

    キャンセル

  • 2015/02/23 22:37

    すでにたくさんの回答が付いていますが、一応・・・

    3番目だけ取りたいのであれば、
    reMatch(2).Value
    とすれば取り出せます。

    キャンセル

+1

これは、取り出したいのは「|」で区切られた三番目の項目だけでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/23 11:45

    三番目だけです!この三番目には何が何ケタの整数が入るかわかりません。

    キャンセル

0

「strPattern = "^\d*$"」または「strPattern = "^\d+$"」で、
MsgBoxに「1」「0」「1234567890」が表示されます。
「1」しか表示されない場合は、行と列が逆になってます。
1桁を省くなら(2桁以上)、
「strPattern = "^\d.\d*$"」で、MsgBoxに「1234567890」が表示されます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ようやくあなたのやりたいことが理解できと思います。
以下のコードをそのまま使ってみてください。

Sub Sample3()
    Dim RE, strPattern As String, i As Long, msg As String, reMatch
    Set RE = CreateObject("VBScript.RegExp")
    strPattern = ".*\|.*\|(\d+) \|.*"
    With RE
        .Pattern = strPattern
        .IgnoreCase = True
        .Global = True
        For i = 1 To 10
            Set reMatch = .Execute(Cells(i, 1))
            If reMatch.Count > 0 Then
                msg = msg & reMatch(0).submatches(0) & vbCrLf
            End If
        Next i
    End With
    MsgBox msg
    Set reMatch = Nothing
    Set RE = Nothing
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/24 14:33

    ご返事ありがとうございます。

    すみません!追記にも書いてある通り、メッセージボックスは使わないタイプを作りたいと思っています。。。

    せっかく書いていただいたのに申し訳ありません。
    何かの参考にいたします。

    キャンセル

  • 2015/02/24 14:59

    ソースを見たのですが、たぶんイロイロ間違っていると思います。
    完全な一般素人でしょうか?
    素人でも構わないのですが、レベルが判らないとどこから伝えれば良いのか判りません。

    なぜか判りませんが、4行目10列からデータを入れることになっているのでご自分でソースを書いたわけではないのなら間違わないようにしてください。

    これはなるべく貴女のソースを生かしたものです。その後に多分間違っているであろう個所も直したものも入れておきます
    Sub 正規表現()
    Dim re, strPattern As String, i, c As Long, msg As String, reMatch
    Set re = CreateObject("VBScript.RegExp")
    Worksheets("sheet1").Activate
    strPattern = ".*\|.*\|(\d+) \|.*"
    With re
    .Pattern = strPattern
    .IgnoreCase = True
    .Global = True
    For i = 1 To 10
    Set reMatch = .Execute(Cells(i + 4, 10))
    If reMatch.Count > 0 Then
    msg = msg & reMatch(0).submatches(0) & vbCrLf
    End If
    Next i
    End With

    For c = 1 To 5
    Cells(c + 4, 9) = msg
    Next c
    Set reMatch = Nothing
    Set re = Nothing
    End Sub


    Sub 正規表現2()
    Dim re, strPattern As String, i, c As Long, msg As String, reMatch
    Set re = CreateObject("VBScript.RegExp")
    Worksheets("sheet1").Activate
    strPattern = ".*\|.*\|(\d+) \|.*"
    With re
    .Pattern = strPattern
    .IgnoreCase = True
    .Global = True
    For i = 1 To 10
    Set reMatch = .Execute(Cells(i + 4, 10))
    If reMatch.Count > 0 Then
    Cells(i + 4, 9) = reMatch(0).submatches(0) & vbCrLf

    End If
    Next i
    End With

    Set reMatch = Nothing
    Set re = Nothing
    End Sub

    キャンセル

-1

以下のパターンを投げ込めば、
\s*([0-9]*)\|\s*([0-9]*)\|\s*([0-9]*)\|(.*)
reMatch(3).Valueで拾えそうですね。

ただ、VBAの正規表現には詳しくないので間違えているかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

 strPattern = " .*\|.*\|\d+ \|.* "
これで良いと思います
目的の数列を抜き出したいのなら、" .*\|.*\|(\d+) \|.* "とカッコで括って、submatchを見れば良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/23 11:25

    最後の列をタイムスタンプと仮定すれば以下のようにして精度を上げることができます。
    ".*\|.*\|(\d+) \| \d{4}\-\d{1,2}\-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\.\d\d\+\d\d"

    固定条件を出来るだけ絞ればマッチ精度はあがります

    キャンセル

  • 2015/02/23 11:47

    ご返事ありがとうございます。
    上記いただいたコードが使えませんでした。。。。

    キャンセル

  • 2015/02/23 12:00

    ??
    以下で確認できましたよ
    疑わしきは、ダブルコーテーションは、正規表現ではなく、文字列の区切りとして入れてあります。
    なので以下のように書きます。
    あとは文字列の始まりのスペースがあいまいなので必要無ければ削ってください。

    strPattern = ".*\|.*\|\d+ \|.*"
    又は
    strPattern = ".*\|.*\|(\d+) \| \d{4}\-\d{1,2}\-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\.\d\d\+\d\d"

    キャンセル

  • 2015/02/24 14:52

    Sub 正規表現()
    Dim re, strPattern As String, i, c As Long, msg As String, reMatch
    Set re = CreateObject("VBScript.RegExp")
    Worksheets("sheet1").Activate
    strPattern = ".*\|.*\|(\d+) \| \d{4}\-\d{1,2}\-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\.\d\d\+\d\d"""
    With re
    .Pattern = strPattern
    .IgnoreCase = True
    .Global = True
    For i = 1 To 10
    Set reMatch = .Execute(Cells(i + 4, 10))
    If reMatch.Count > 0 Then
    msg = msg & reMatch(0).Value & vbCrLf
    End If
    Next i
    End With

    For c = 1 To 5
    Cells(c + 4, 9) = msg
    Next c
    Set reMatch = Nothing
    Set re = Nothing
    End Sub


    こうやって見ましたが、
    反応しませんねー。

    cells(10,5)に入っているものをcells(10,4)に移しながら下降していくのができません。

    キャンセル

  • 2015/02/24 15:05

    それは正規表現文字列の最後がダブコーテーション(”)だらけだからです

    キャンセル

-1

正規表現で処理をすることが重要なのであればスルーしていただくとして
この処理の場合 msg = Split(対象文字列, "|")(2) のほうが手っ取り早くないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/23 15:28

    VBA内の処理として 対象文字列にはどうやって入れるのでしょうか?
    セルのナンバー
    たとえばmsg = Split(cells(1.1), "|")(2) のような形にするのでしょうか?

    キャンセル

  • 2015/02/23 15:33

    そうです。追記のコードでいえば Cells(i + 4, 10) ですね。

    キャンセル

  • 2015/02/23 15:42

    Sub 正規表現()

    Dim re, strPattern As String, i, c As Long, msg As String, reMatch

    Set re = CreateObject("VBScript.RegExp")
    Worksheets("sheet1").Activate
    With re
    .Pattern = strPattern
    .IgnoreCase = True
    .Global = True
    For i = 1 To 10
    Set reMatch = .Execute(Cells(i + 4, 10))
    If reMatch.Count > 0 Then
    msg = Split(Cells(i + 4, 10), "|")(2) ’☆
    End If
    Next i
    End With

    For c = 1 To 5
    Cells(c + 4, 9) = msg
    Next c
    Set reMatch = Nothing
    Set re = Nothing
    End Sub
    これで書いてみたのですが動かないです・・・・。
    インデックスの有効な値がないそうで☆のところに黄色いラインが入ります

    キャンセル

  • 2015/02/23 15:57

    ごめんなさい、正規表現使わない方法なので

    Sub 正規表現()
    Worksheets("sheet1").Activate
    For i = 1 To 10
    msg = Split(Cells(i + 4, 10), "|")(2)
    Next i
    For c = 1 To 5
    Cells(c + 4, 9) = msg
    Next c
    End Sub

    こうかな?
    …検索は10件で出力は5件でいいんですかね…?

    キャンセル

  • 2015/02/23 16:32

    Sub 正規表現()

    Dim msg As String
    Dim i As Long
    Dim c As Long


    Worksheets("部分RESULT").Activate
    For i = 1 To 5
    msg = Split(Cells(i + 4, 10), "|")(2) ’ここに無効なインデックスと表示されます。
    Next i
    For c = 1 To 5
    Cells(c + 4, 9) = msg
    Next c
    End Sub


    こうやって書いてみましたー。
    検索5件で 出力5件です。

    キャンセル

  • 2015/02/23 16:33

    やっぱり動きませんねーどうしてでしょうか。

    キャンセル

  • 2015/02/23 16:47

    うーん(^_^;)
    無効なインデックスってことは多分 "|" で Split が出来てないんですね。
    Sub test()
    MsgBox Split(" 1 | 0 |1234567890 | 2014-2-22 22:22:22.06+09", "|")(2)
    End Sub
    これで、正しく "1234567890" がMsgBoxで表示されるかどうか見てみて
    これも動かない、となると…バージョンとか環境とかが(私のPCとは)異なる、ということで、出来ないやり方なのかも知れません。

    正規表現のほうで正解に近付いていたなら、そちらのほうがいいかもです。

    キャンセル

  • 2015/02/23 20:37

    Sub test()
    MsgBox Split(" 1 | 0 |1234567890 | 2014-2-22 22:22:22.06+09", "|")(2)
    End Sub

    これは表示できました!

    キャンセル

  • 2015/02/23 20:47

    今試してみたところ

    1  1 |   0 |12345678 | 2014-2-22 22:22:22.06+09 
    1  1 |   0 |1234567890 | 2014-2-22 22:22:22.06+09 
    1  1 |   0 |1234567890 | 2014-2-22 22:22:22.06+09 
    1  1 |   0 |123 | 2014-2-22 22:22:22.06+09 
    1  1 |   0 |1 | 2014-2-22 22:22:22.06+09 

    このような形でスプリットしました!
    ※最初の1がなぜか抽出された結果です。。。
    どうしてこうなってしまうんだろう。。。

    キャンセル

-1

Okwaveに回答したものの焼き直しですが、
Sub 三番目取り出し()
Dim i As Long, c As Long, msg As String, x() As String
Worksheets("sheet1").Activate
For i = 1 To 10
  x = Split(Cells(i + 4, 10), "|")
  If UBound(x) >= 2 Then
    msg = msg & Trim(x(2)) & vbCrLf
  End If
Next i

For c = 1 To 5
  Cells(c + 4, 9) = msg
Next c
End Sub
他の回答のコメントで「無効なインデックス」となるのは、対象セルの中に|の個数が足りないところがあるんでしょう。上記では、それをUBound(x)で判断してます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/23 21:46

    ありがとうございます!確認してみます(^^)/

    キャンセル

  • 2015/02/24 14:35

    試してみました。

    しかしながら置き換えた結果がすべて同じセルに入ってしまいます。
    セルを分割して
    1234567890       1 | 0 |1234567890 | 2014-2-22 22:22:22.06+09
    というような形にしたいです。

    キャンセル

  • 2015/02/24 14:52

    質問追記のプログラムをSplitを使って書き直しただけなのですが。
    追記のプログラムは、「J列5行目から14行目の内容の"|"で区切った3つめを取り出して、それらを全部改行で繋げ、繋げた結果を、I列5行目から9行目に入れる」ですが、
    実はしたいことはそれでないということですか?
    やりたいことをうまく書けないなら、日本語で書いても良いかと思います。

    >1234567890       1 | 0 |1234567890 | 2014-2-22 22:22:22.06+09
    「J列5行目から14行目の内容の"|"で区切った3つめを取り出して、それを各行のI列に入れる」ですか?

    キャンセル

  • 2015/02/24 14:54

    >「J列5行目から14行目の内容の"|"で区切った3つめを取り出して、それを各行のI列に入れる」ですか?

    まさにこれです!言葉足らずですみません。。。

    キャンセル

関連した質問

  • 解決済

    VBA google画像検索 画像表示

    エクセルのVBAで文字列に対する画像が表示されるマクロを作成したいです。 やりたいこととして例えば、 A列に5つワードが書かれており、 そのワードをひとつずつgoogleで画像検

  • 解決済

    【緊急】VBA ウェブ画像の表示「このイメージは現在表示できません」と出てしまう

    VBAでウェブ画像検索し、その画像をエクセルに貼り付けるという操作を作成しております。 (操作手順)※標準モジュールで作成 1.googleでA列にあるワードを画像検索 2.各列の

  • 受付中

    PowerPoint ファイルの結合方法

    フォルダの中にある多数のPPTファイルについて、各PPTファイルの全てのスライドを結合して新しいPPTファイルを作成したいと考えています。 色々とWEB上で探して、下記サイトが参

  • 解決済

    エクセルのVBAの動作の高速化について

    エクセルのVBAの高速化を行いたいと思い質問させていただきます。 現在、きまった形のデータを作成するために、コピーandペースト作業時のミスをなくすためエクセルとVBAを使い

  • 受付中

    VBAのexec()について

    外部batファイルをexec()で実行しました。 ですがその際、StdOutには4096バイトしか出力出来ないそうで、結果が途中までしか出力出来ません。 batファイルを複数に分け

  • 解決済

    VBA高速化について

    20個のエクセルファイルを読み込み、特定のシートにあるテーブルから特定の値を探し出し、その右横にあるセルの値を取り出します。 集計用のエクセルのテーブルでも、同じ特定の値をテーブル

  • 解決済

    powerpointでタイトル(文字列+連続変数)をVBAで一括変換

    パワーポイントで、タイトルの位置に テキスト+数字 の形でFor文を使って作りたいです。 例)こんにちは1(スライド1枚目) こんにちは2(スライド2枚目) ...といった形です。

  • 解決済

    VBA コード簡略化 下記処理の場合

    お疲れ様です。 私が実装したVBAコードに下記実装があります。 それぞれフォームからのボタン押下で流れる作りになっています。 '**********************

同じタグがついた質問を見る

  • VBA

    1854questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • 正規表現

    811questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。