- ベストアンサー
【VBA】 このコードを最適化してください
a1セルに入力した文字列をb15セルに反映するのですが、 数字が含まれている場合はそれを削除し、そのうえで左端のスペースも削除したものを反映する場合、 Range("b15").Value = Range("a1") For i = 0 To 9 Range("b15").Value = Replace(Range("b15"), i, "") Next i Range("b15").Value = LTrim(Range("b15")) というコードを使っているのですが、冗長な気がします。 何かもっとスマートなやり方はありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
基本的にはこのままでも良いと思いますが、B15セルの値を何度も置換するよりは一度変数に代入して置換とTrimを行い、その結果をB15セルに入れる方が良いと思います。 Sub test() Dim sText As String sText = Range("a1") For i = 0 To 9 sText = Replace(sText, i, "") Next i Range("b15").Value = LTrim(sText) End Sub 回数が多くなるとスピードはだいぶ違います。
その他の回答 (3)
- WindFaller
- ベストアンサー率57% (465/803)
>何かもっとスマートなやり方はありますか? ここの「スマート」という意味は、「冗長な」の反対で、つまり、数字を総当りで削除する方法が、「スマート」ではないとおっしゃっているようです。ただ、0~9までですから、その程度は仕方がないような気がします。「最適化」という意味は、コーディングの書法のことで、最適化する部分は、ほとんどありません。 以下は、正規表現で数字だけ抜く「.Replace(tmp, "")」というコードならば、正味、3行でもいいわけです。しかし、総当りに対して、はたして、おっしゃっている「スマート」と言えるか、私には自信がありません。 '// Sub Test3() Dim Matches As Object Dim tmp As Variant With CreateObject("VBScript.RegExp") .Pattern = "\d" '数字 LTrim指定のため [\s\d]は使えない .Global = True tmp = Range("A1").Value tmp = LTrim(tmp) tmp = StrConv(tmp, vbNarrow) '全角があったら半角にする If .Test(tmp) Then '該当するか検査 Range("B15").Value = .Replace(tmp, "") '数字を抜く End If End With End Sub
お礼
ありがとうございます。VBAを始めたばかりで正規表現を使うやり方は全く知りませんでした。 これから勉強してみたいと思います。
- matyu1003
- ベストアンサー率42% (257/598)
No.1です。 失礼しました。私の例だと元の文字列の先頭が数字で、且つその後ろにスペースがある場合場合はスペースが残ってしまいますね。なので、質問者さんのとおりで良いのでは?と思います。 "1 abc 1a"だと 私のマクロでは " abc a"となり、期待した結果になりません。 "1abc1a" とか " abc1a" なら私のマクロでも期待した結果になります。
- matyu1003
- ベストアンサー率42% (257/598)
Replaceより先にLTrimをしたほうがReplaceする文字列が短くなるのでベンチマークでも出ないほどですが早くなるのと、LTrimを先にするとその結果をいきなりb15に書き込めるのでこんな感じで。 Range("b15").Value = LTrim(Range("a1").Value) For i = 0 To 9 Range("b15").Value = Replace(Range("b15").Value, i, "") Next i
お礼
ありがとうございます。代入する方法でやってみたいと思います。