• ベストアンサー

【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")) というコードを使っているのですが、冗長な気がします。 何かもっとスマートなやり方はありますか?

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

基本的にはこのままでも良いと思いますが、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 回数が多くなるとスピードはだいぶ違います。

rihitomo
質問者

お礼

ありがとうございます。代入する方法でやってみたいと思います。

その他の回答 (3)

回答No.4

>何かもっとスマートなやり方はありますか? ここの「スマート」という意味は、「冗長な」の反対で、つまり、数字を総当りで削除する方法が、「スマート」ではないとおっしゃっているようです。ただ、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

rihitomo
質問者

お礼

ありがとうございます。VBAを始めたばかりで正規表現を使うやり方は全く知りませんでした。 これから勉強してみたいと思います。

  • matyu1003
  • ベストアンサー率42% (257/598)
回答No.2

No.1です。 失礼しました。私の例だと元の文字列の先頭が数字で、且つその後ろにスペースがある場合場合はスペースが残ってしまいますね。なので、質問者さんのとおりで良いのでは?と思います。 "1 abc 1a"だと 私のマクロでは " abc a"となり、期待した結果になりません。 "1abc1a" とか " abc1a" なら私のマクロでも期待した結果になります。

  • matyu1003
  • ベストアンサー率42% (257/598)
回答No.1

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

関連するQ&A