アクティブセルの文字を、正規表現を利用して文字の変換をしたいと考えています。
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
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
自分の知識ですと、コードの内容を理解するのに、
時間を要してしまいましたが、
ついに自分のコードの間違いに気づきました。
ありがとうございました。
また、正規表現の使い方もさらに詳しくなりました。
大変勉強させていただきました。
ただ、オートメーション・オブジェクトの意味が分かりませんでした。
CreateObject("VBScript.RegExp") と Set objRegExp = New RegExp の違いは何なのでしょうか?
また、どういった場合に作り直す必要が生じるのでしょうか?
No.3
- 回答日時:
こんにちは。
>CreateObject("VBScript.RegExp") と Set objRegExp = New RegExp の違いは何なのでしょうか?
前者が、実行時バインディングで、後者は、事前に、参照設定されているので、事前バインディングといいます。後者の事前バインディングのほうが、高速に作動します。また、生成したオブジェクトの残し忘れなどなくてすみます。変数の定義、インテリセンスの利用など、事前バインディングのほうが、作成には有利です。
しかし、事前バインディングは、ユーザーに参照設定してもらう必要があります。CreateObject の実行時バインディングで、明示的にオブジェクトを作ることによって、問題が発生したときの、その問題の部分がより明確になります。相手の環境が不確定な場合は、この実行時バインディングを使用します。
とても分かりやすくご説明いただきありがとうございます。
そのような使い分けがあるとは全く知りませんでした。
今後は意識しながらマクロを作るようにしていきたいと思います。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの質問です。 F列からL...
-
作成した数式を値として表示し...
-
エクセルの文字が途中から消える
-
条件付き書式設定で罫線を引き...
-
Excel関数について教えてくださ...
-
Excelの警告について
-
Excel関数について教えてくださ...
-
ワークシートに出現したこの画...
-
エクセルのセル内に分数などの...
-
タイムスタンプとテキストから...
-
EXCELの散布図で日付が1900年に...
-
エクセルでファイルの最終更新...
-
シートの情報を別のシートへま...
-
マクロの処理が遅くなった
-
エクセルの数式バーのフォント...
-
エクセルの「条件付き書式」を...
-
エクセル日付 文字列の関数がエ...
-
Excelでの文字色
-
Excelの数字の前に入っている空...
-
Excelについて教えてください。...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
Excelで数値を時間数に変換する...
-
エクセルの数式バーのフォント...
-
エクセルで数字の組み合わせを...
-
エクセルを使用して、円周率を...
-
Excelで特定の文字列が含まれて...
-
Excel 対象のセルに入力が無い...
-
任意の値が存在する行に名前を...
-
エクセルでファイルの最終更新...
-
index関数の説明をお願いします。
-
条件付き書式でやりたいのですが
-
重複しない値を取り出したい
-
【ExcelVBA】UTF-8(BOM無)でC...
-
【マクロ】マクロが割当てされ...
-
エクセル IF計算式?でしょうか?
-
エクセルで曜日を入れたい
-
表中の指定した条件の文字列を...
-
【Excel】版が同じ事を示す番号...
-
EXCELの散布図で日付が1900年に...
-
Excelについて。Excelに縦1列に...
おすすめ情報