Excelの置換で正規表現が使えなくて困っています。「EILV-NA2006012345」というデータを「NA06」「12345」と二つのセルに分割したいのです。後ろの6桁は頭が0だったら削除したいです。また後々にVBAに組み込みたいとおもっているのですが、その前に正規表現での置換ができません。たとえばタブを入れるとしたら「\t」でいいのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2006/10/18 16:27:51
  • 終了:2006/10/19 00:10:46

ベストアンサー

id:bonlife No.2

回答回数421ベストアンサー獲得回数752006/10/18 20:34:15

ポイント55pt

こんな感じのVBAではいかがでしょうか。

A列に「EILV-NA2006012345」のような文字列が入っていた場合、B列、C列にそれぞれ「NA06」、「12345」をセットします。

(正規表現の部分などは必要に応じて見直してください。)

Option Explicit
Sub Sample1()
    Dim RE, strPattern As String, lastRow As Long, i As Long, str1 As String, str2 As String, num1 As Long, reMatch, reSubMatch
    Set RE = CreateObject("VBScript.RegExp")
    ' 正規表現用の文字列
    ' 先頭5文字は使わない
    ' 次の2文字の英数字をSubmatches(0)用に保存
    ' 次の2文字の数字は使わない
    ' 次の2文字の数字をSubmatches(1)用に保存
    ' 次の6文字の数字をSubmatches(2)用に保存
    strPattern = "^[-A-Z0-9]{5}([-A-Z0-9]{2})[0-9]{2}([0-9]{2})([0-9]{6})$"
    With RE
        .Pattern = strPattern       ' 検索パターンを設定
        .IgnoreCase = True          ' 大文字と小文字を区別しない
        ' 最終行の取得
        lastRow = Cells(1, 1).SpecialCells(xlLastCell).Row
        ' 2行目、3行目の内容をクリア
        Range(Cells(1, 2), Cells(lastRow, 3)).ClearContents
        i = 1 ' カウンタ用の変数初期化
        ' 1行目から最終行まで順に処理
        While i <= lastRow
            Set reMatch = .Execute(Cells(i, 1).Value) ' 1列目(A列)を1行ずつチェック
            ' 正規表現がヒットした場合の処理
            If reMatch.Count > 0 Then
                ' 括弧内の値を取得
                Set reSubMatch = reMatch(0)
                str1 = reSubMatch.Submatches(0)
                str2 = reSubMatch.Submatches(1)
                num1 = reSubMatch.Submatches(2) ' 数値(Long)に代入することで前ゼロを削除
                ' MsgBox (str1 + str2)
                ' MsgBox (num1)
                Cells(i, 2).Value = str1 + str2 ' 2列目(B列)に値をセット
                Cells(i, 3).Value = num1        ' 3列目(C列)に値をセット
            End If
            i = i + 1
        Wend
    End With
    Set RE = Nothing
End Sub

参考になれば幸いです。

id:miya53015

丁寧なご回答ありがとうございます!!

自分ではとってもこんなマクロは組めません。

助かりました!早速、使わせていただきます!

2006/10/19 00:09:04

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/10/18 16:45:37

ポイント15pt

http://wiki.fdiary.net/toshiaki/?%C0%B5%B5%AC%C9%BD%B8%BDExcel%A...

Excel用の正規表現のアドインがありますが、このようなものを使わないと正規表現は できないでしょう。

なお、質問にある内容だと 置換では ちょっと難しいかもしれません。

VBAで チェックして 分けたらいいでしょう。

id:miya53015

早々とご回答ありがとうございました!

Excelで正規表現はできないんですね。知らなかったです。教えていただいたHP、大変参考になりました。検討してみます。

2006/10/18 23:57:26
id:bonlife No.2

回答回数421ベストアンサー獲得回数752006/10/18 20:34:15ここでベストアンサー

ポイント55pt

こんな感じのVBAではいかがでしょうか。

A列に「EILV-NA2006012345」のような文字列が入っていた場合、B列、C列にそれぞれ「NA06」、「12345」をセットします。

(正規表現の部分などは必要に応じて見直してください。)

Option Explicit
Sub Sample1()
    Dim RE, strPattern As String, lastRow As Long, i As Long, str1 As String, str2 As String, num1 As Long, reMatch, reSubMatch
    Set RE = CreateObject("VBScript.RegExp")
    ' 正規表現用の文字列
    ' 先頭5文字は使わない
    ' 次の2文字の英数字をSubmatches(0)用に保存
    ' 次の2文字の数字は使わない
    ' 次の2文字の数字をSubmatches(1)用に保存
    ' 次の6文字の数字をSubmatches(2)用に保存
    strPattern = "^[-A-Z0-9]{5}([-A-Z0-9]{2})[0-9]{2}([0-9]{2})([0-9]{6})$"
    With RE
        .Pattern = strPattern       ' 検索パターンを設定
        .IgnoreCase = True          ' 大文字と小文字を区別しない
        ' 最終行の取得
        lastRow = Cells(1, 1).SpecialCells(xlLastCell).Row
        ' 2行目、3行目の内容をクリア
        Range(Cells(1, 2), Cells(lastRow, 3)).ClearContents
        i = 1 ' カウンタ用の変数初期化
        ' 1行目から最終行まで順に処理
        While i <= lastRow
            Set reMatch = .Execute(Cells(i, 1).Value) ' 1列目(A列)を1行ずつチェック
            ' 正規表現がヒットした場合の処理
            If reMatch.Count > 0 Then
                ' 括弧内の値を取得
                Set reSubMatch = reMatch(0)
                str1 = reSubMatch.Submatches(0)
                str2 = reSubMatch.Submatches(1)
                num1 = reSubMatch.Submatches(2) ' 数値(Long)に代入することで前ゼロを削除
                ' MsgBox (str1 + str2)
                ' MsgBox (num1)
                Cells(i, 2).Value = str1 + str2 ' 2列目(B列)に値をセット
                Cells(i, 3).Value = num1        ' 3列目(C列)に値をセット
            End If
            i = i + 1
        Wend
    End With
    Set RE = Nothing
End Sub

参考になれば幸いです。

id:miya53015

丁寧なご回答ありがとうございます!!

自分ではとってもこんなマクロは組めません。

助かりました!早速、使わせていただきます!

2006/10/19 00:09:04

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません