• ベストアンサー

Excel : 正規表現を利用して2文字の全角数字を半角数字に変換するには?

アクティブセルの文字を、正規表現を利用して文字の変換をしたいと考えています。 2文字の全角数字を半角数字に変換します。 かつ、3文字以上の全角数字は変換しません。 下記のようにコードを書いたのですが、希望通りに動作してくれません。 どこが悪いのでしょうか? ご指摘いただければ幸いです。 よろしくお願いいたします。 ※参照可能なライブラリファイルにて、「Microosft VBScript Regular Expressions 5.5」に  チェックは入れています。 Sub sample()   Dim str   Dim strPattern As String   Dim strReplacement As String      str = ActiveCell.Value   str = myRegExp(str, "([^0123456789])([0123456789]{2})([^0123456789])", "$1$2$3")   ActiveCell.Value = str End Sub Private Function myRegExp(str, strPattern, strReplacement)   Dim objRegExp As RegExp   Dim test As String   Set objRegExp = New RegExp   With objRegExp     .Pattern = strPattern     .IgnoreCase = False     .Global = True     myRegExp = .Replace(str, "$1" & StrConv("$2", vbNarrow) & "$3")   End With   Set objRegExp = Nothing End Function

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 .Global =True にしてあるので、それをそのままにして作ってみました。 一応、CreateObject("VBScript.RegExp") で、オートメーション・オブジェクトを作っていますが、必要に応じて直してください。私は、$2 だけを取り出してみました。関数は、重複を避けるために、myRegExp2としました。 それから、myRegExp関数の strReplacement の引数は、生きていませんね。 Sub sample2()   Dim str As String   Dim strPattern As String   str = ActiveCell.Value   str = myRegExp2(str, "([^0-9])([0-9]{2})([^0-9])")   ActiveCell.Value = str End Sub Private Function myRegExp2(str, strPattern)  Dim Matches As Object 'MatchCollection  Dim Match As Object 'as Match  Dim buf As String  Dim buf2 As String    With CreateObject("VBScript.RegExp")   .Pattern = strPattern   .IgnoreCase = False   .Global = True   If .Test(str) Then    Set Matches = .Execute(str)    buf2 = str    For Each Match In Matches     buf = StrConv(.Replace(Match.Value, "$2"), vbNarrow)     buf2 = Replace(buf2, Match.Value, .Replace(Match.Value, "$1" & buf & "$3"))    Next    myRegExp2 = buf2    Set Matches = Nothing   Else    myRegExp2 = str   End If  End With End Function  

booooob
質問者

お礼

自分の知識ですと、コードの内容を理解するのに、 時間を要してしまいましたが、 ついに自分のコードの間違いに気づきました。 ありがとうございました。 また、正規表現の使い方もさらに詳しくなりました。 大変勉強させていただきました。 ただ、オートメーション・オブジェクトの意味が分かりませんでした。 CreateObject("VBScript.RegExp") と Set objRegExp = New RegExp の違いは何なのでしょうか? また、どういった場合に作り直す必要が生じるのでしょうか?

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >CreateObject("VBScript.RegExp") と Set objRegExp = New RegExp の違いは何なのでしょうか? 前者が、実行時バインディングで、後者は、事前に、参照設定されているので、事前バインディングといいます。後者の事前バインディングのほうが、高速に作動します。また、生成したオブジェクトの残し忘れなどなくてすみます。変数の定義、インテリセンスの利用など、事前バインディングのほうが、作成には有利です。 しかし、事前バインディングは、ユーザーに参照設定してもらう必要があります。CreateObject の実行時バインディングで、明示的にオブジェクトを作ることによって、問題が発生したときの、その問題の部分がより明確になります。相手の環境が不確定な場合は、この実行時バインディングを使用します。

booooob
質問者

お礼

とても分かりやすくご説明いただきありがとうございます。 そのような使い分けがあるとは全く知りませんでした。 今後は意識しながらマクロを作るようにしていきたいと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

さしあたりこんな感じ ---------------------------------------------------------------- Sub sample() Dim str Dim strPattern As String Dim strReplacement As String str = ActiveCell.Value str = myRegExp(str, "([^0123456789])([0123456789]{2})([^0123456789])") If str <> "" Then ActiveCell.Value = str End If End Sub Private Function myRegExp(str, strPattern) Dim objRegExp As RegExp Dim oMatches, oMatch Set objRegExp = New RegExp With objRegExp .Pattern = strPattern .IgnoreCase = False ' .Global = True Set oMatches = .Execute(str) If oMatches.Count <> 0 Then Set oMatch = oMatches(0) myRegExp = .Replace(str, "$1" & StrConv(oMatch.SubMatches(1), vbNarrow) & "$3") Else myRegExp = "" 'マッチしない End If End With Set objRegExp = Nothing End Function

booooob
質問者

お礼

SubMatchesを使用する方法もあるのですね。 勉強になりました! ありがとうございました。

関連するQ&A

  • 文字列中の両丸括弧を取り除くVBA正規表現

    文字列中の両括弧を取り除く正規表現を求めています. 入力文は「(文字列1)文字列2」となっています. 両括弧は全角の丸括弧"(",")"と半角の丸括弧"(",")"のペアを見つけ,文字列2を取り出したいのです. 文字列1,文字列2は全角,半角の文字列(主に全角)が来ます.括弧の中に括弧が入れ子(ネスト)する事は想定していません. 例えば,「(グループA)田中」という入力に対しては,「田中」をExcel VBAで抽出したいのです. 正規表現ライブラリを使っていますが,別の方法でも効率良く抽出できるならOKです. '---------------  以下を試した結果  --------------------------------- Dim RE, strPattern As String, reMatch Set RE = CreateObject("VBScript.RegExp") ' 'strPattern = "^(\(|().*(\)|))$" ' 'strPattern = "(?!.*[(|\(].+?[\)|)])" ' "(グループA)"にマッチする ' 'strPattern = "([\(.+?\)|(.+?)])" ' 'strPattern = "(^[(|\(].+?[\)|)])" ' strPattern = "^(?!.*[(|\(].+?[\)|)])" ' "" ' 'strPattern = "\(.+?\)" ' strPattern = "^(?!.*[\(.+?\)|(.+?)])" ' "" ' strPattern = "(?!.*[(.+?)])" ' "" ' strPattern = "(.+?)" ' "(グループA)"にマッチする ' strPattern = "^[?!.*((.+?))]" ' ' strPattern = "[^((.+?))]" ' ' '.Pattern = "^(?!.*xyz)" ' 'strPattern = "^(?!.*([.+?]))" ' "" ' strPattern = "[^(.*)]" '"グ","ル",,, ' strPattern = "^(?!([.*]).*)" ' "" ' strPattern = "^(?!(.*).*)" ' "" ' strPattern = "^(?!([.*]))" ' "" strPattern = ").*$" ' "" With RE .Pattern = strPattern .IgnoreCase = True .Global = True Set reMatch = .Execute(str) If reMatch.Count > 0 Then str = reMatch(0).Value End If End With '開放 Set reMatch = Nothing Set RE = Nothing

    • ベストアンサー
    • CSS
  • VBAの正規表現について (エクセル)

    正規表現は苦手なもので、すみませんが教えてください。 下のサンプルで、マッチングに "[(|(].*?[)|)]$"を指定すれば、最後から最短の()内を取得できるものと期待していましたが、実行してみると最短の「(c)」ではなく「(a)x(b)y(c)」がマッチしてしまうようです。 $を除いて"[(|(].*?[)|)]"と"[(|(].*[)|)]"で実行してみると、ちゃんと違いがあるのですが… $をつけた場合で最短の表記方法は、どのようにすればよいのでしょうか? Sub sample() Dim RegE, RegMc Dim str1 As String, str2 As String  Set RegE = CreateObject("VBScript.RegExp")  str1 = "test(a)x(b)y(c)"  str2 = ""  RegE.Pattern = "[(|(].*?[)|)]$"  Set RegMc = RegE.Execute(str1)  If RegMc.Count > 0 Then   str2 = RegMc(0).Value   str1 = RegE.Replace(str1, "")  End If  MsgBox (str1 & vbLf & str2) End Sub

  • 正規表現-数字

    VB6で開発しています。 ひとつのテキストボックスがあり(MAXLENGTHが4)、 半角数字or小数点しか入力できないように制御しています。 下記正規表現確認関数で、 00.0~99.9の値のみ認証したいのですが、 (チェック前に Format( XX , '00.0')に変換してます) ○ 3 ○ 3.3 ○ 33 ○ 33.3 × 3.33 × .333 × 333 △ 3.00 → 3.0に変換させる パターンマッチング (\d{1,2}.\d|\d{1,2})ですと 本来×の333がOKとなってしまいます。 正規表現が間違っているのでしょうか? アドバイスお願いします。 関数はこちら Public Function RegExpCheck(ByVal ChkString As String, _ ByVal RegPattern As String) As Boolean '(一部省略) '引数:ChkString 正規表現確認対象文字 ' RegPattern パターン '戻り値:True マッチしている ' :False マッチしていない、あるいは文字・パターンが空白 '(一部省略) Dim reg As New RegExp RegExpCheck = False On Error GoTo RegErr '引数空白チェック・・・空白の場合はFalseを返す '対象文字列 If Trim$(ChkString) = vbNullString Then Exit Function End If 'パターン If Trim$(RegPattern) = vbNullString Then Exit Function End If reg.Pattern = RegPattern If reg.Test(CStr(ChkString)) = True Then RegExpCheck = True End If Exit Function RegErr:

  • 【VBA】【正規表現】

    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 ================================================ ☆この部分に☆に何を入れればよいでしょう? ご指導よろしくおねがいします。

  • 【VBA】半角カタカナのみを全角にするには?

    http://bekkoame.okwave.jp/qa8979427.html こちらのページを参考にしたのですが カタカナのみ全角にしたいのですが 平仮名がカタカナになってしまいます。 正規表現と言うのがよくわからないので コピペで使ってますが Sub Sample2() Dim myStr As String Dim Match As Object, Matches As Object Dim CW As String With CreateObject("VBScript.RegExp") .Pattern = "[\uFF61-\uFF9F]+" '---(1) .Global = True myStr = "あああイイイ" If Len(myStr) > 0 Then Set Matches = .Execute(myStr) 'マッチしたすべての文字列を置換 For Each Match In Matches myStr = Replace(myStr, Match.Value, _ StrConv(Match.Value, vbWide)) '---(2) Next Match CW = myStr End If End With End Sub だと「あああ」は平仮名のままなのですが myStr = "のののノノノ" にすると、ひらがなの「ののの」が全角カタカナになってしまいます。 Sub test() Call KanaJisF("あああイイイ") End Sub Function KanaJisF(ByVal sSrc As String) As String Dim sTempW As String Dim sTempN As String Dim i As Long ' ' 全角カナに相当する文字コードを総当たりでループ For i = -31852 To -31936 Step -1 sTempW = Chr(i) ' 全角カナ変数に格納 sTempN = StrConv(sTempW, vbNarrow) ' 半角カナに変換して変数に格納 ' ' 半角カナ各文字が、文字列に含まれている場合、全角カナに置換 If InStr(1, sSrc, sTempN) Then sSrc = Replace(sSrc, sTempN, sTempW) Next i ' ' 半角長音、文字列に含まれている場合、全角長音に置換 sTempN = Chr(176) If InStr(sSrc, sTempN) Then sSrc = Replace(sSrc, sTempN, "ー") KanaJisF = sSrc End Function こちらのコードは、「あああ」も全角カタカナになりました。 "のののノノノ"も同様です。 平仮名は平仮名のままにしたいのですが そのような方法はありますか?

  • 数字の全角文字を調べる

    visual basic 2008に関する質問です。 テキストボックスに入力した文字列の中に、数字の全角文字が 含まれているかどうかをチェックするメソッドはありますか? 下記の内容でビルドすると、エラーとなります。 (ソースより抜粋)--------------------------------------- Dim str As String = TextBox1.Text Dim chr As Char = str.Chars(0) If ((chr >= &H8250) And (chr <= &H8258)) Then Label1.Text = "数字は半角文字で入力して下さい。" End If ------------------------------------------------------- (エラー内容)------------------------------------------- 演算子'>='は、型'Char'および'Integer'に対して定義されて いません。 演算子'<='は、型'Char'および'Integer'に対して定義されて いません。 ------------------------------------------------------- 使用OSは、Windows Vistaです。 質問とあわせて、上記のエラーの対処方法について教えて頂けると 助かります。

  • 正規表現について

    ExcelにてVBScriptの正規表現を使用していますが、 理解できないところがあるので、教えてください 1.EXCEL VBAにて下記のコードがあります Sub Sample2() Const strCHK As String = "000AAA111BBB2222BBB333" Dim RE, strPattern As String, i As Long, msg As String, reMatch, Item Set RE = CreateObject("VBScript.RegExp") strPattern = "AAA.+bbb" With RE .Pattern = strPattern .IgnoreCase = True .Global = True Set reMatch = .Execute(strCHK) For Each Item In reMatch Debug.Print Item.Value & " FirstIndex→" & Item.FirstIndex & " Length→" & Item.Length Next End With Set reMatch = Nothing Set RE = Nothing End Sub 2.上記を動作させると、イミディエイトに下記が出力されます AAA111BBB2222BBB FirstIndex→3 Length→16 3.疑問 strPattern = "AAA.+bbb"にて検索しているのに、 AAA111BBBが表示されないのは、何故なのでしょうか? よろしくお願いします

  • 指定した列の文字を半角→全角に変換するには

    エクセルにて以前の同様の質問の回答で特定のセルの文字を半角⇒全角へ変換する方法(マクロ)として以下のような回答を見かけましたが、これを複数の列ごとに行うにはどのようにしたらよろしいでしょうか?住所データを対象としていて行数はその都度変わります。 半角→全角 Sub Macro2()   Dim temp As String   temp = Cells(1, 2)   temp = StrConv(temp, vbWide)   Cells(1, 2).Value = temp End Sub どうか、よろしくお願い致します。

  • カタカナのみを半角から全角に変換したいのですが

    VBAについて教えてください。 文字をHPにアップできるように、カタカナのみを半角から全角に変換したいのですが 何か良い方法はありますか? 文字は英字・ひらがな・カタカナ・漢字がランダムに入っています。 例えば Sub test() Dim a As String a = "aaaアアア<>BBB" End Sub の状態で。「アアア」のみを全角にするにはどうすればいいでしょうか? アルファベットは半角のままにしたいです。

  • VB Excel操作でActiveCellの文字変換

    VisualBasic6.0 (初心者) 保管場所が指定されない(様々な)Excelファイルを開き、ActiveCellの文字を変換(大文字・小文字・半角など)出来るよう下記コードを考えました。 この場合、Load後にExcelを起動しないとActiveCellが得られません。 Load時にMsgBox ActiveCellを入れたのは、たまたまExcelを起動させたらActiveCellが得られ、文字が変換出来たからです。 これは何故でしょう?? また、起動中のExcelファイルを再起動させなくてもActiveCellが得られる方法は無いでしょうか? '------------------------------------ Private Sub C1_Click() Dim TTT As String Dim UUU As String On Error Resume Next If ActiveCell.Row = 0 Then MsgBox "Active Excel 無し" Else TTT = Cells(ActiveCell.Row, ActiveCell.Column).Value UUU = StrConv(TTT, 1) Cells(ActiveCell.Row, ActiveCell.Column).Value = UUU End If On Error GoTo 0 End Sub '------------------------------------ Private Sub Form_Load() On Error Resume Next MsgBox ActiveCell On Error GoTo 0 End Sub

専門家に質問してみよう