[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA 置き換え時の速度』(ららら)
VBAで文字の置き換えをしたいのですが、行数が多いので、もっと早く出来るコードがないかと思いまして質問させていただきます。
A列の2行目から何万行も文字が入っています。
例題では、あ、い、う、え、お の文字がランダムに入っているとします。
やりたい事は、「う」だった場合、「うう」に置き換えたいです。
考えたコードは、下記ですが、一つ一つループで見ていくのではなく、もっと一括でやる方法はあるのでしょうか。
dim 行 as long
For 行 = 2 To Cells(Rows.Count, "A").End(xlUp).Row Cells(行, "A") = WorksheetFunction.Substitute(Cells(行, "A"),"う", "うう") Next 行
よろしくお願いします。
< 使用 Excel:Office365、使用 OS:Windows10 >
配列を使えば出来ますが、セル内の1部の文字に色がついていた場合、色が消えます。 あとは、rangeのreplaceメソッドが使えるけど、手作業のほうが早いような もっと複雑な条件あるんだろうなということで、配列の例 Sub test() Dim tbl As Variant Dim i As Long tbl = Range("A2",Cells(Rows.Count, "A").End(xlUp)).Value For i = 1 To Ubound(tbl, 1) tbl(i, 1) = Replace(tbl(i, 1),"う","うう") Next i Range("A2",Cells(Rows.Count, "A").End(xlUp)).Value = tbl End Sub (稲葉) 2022/11/12(土) 16:42:21
今更ですが、これ何回も実行すると、うが、ううになって、次はううううになっちゃうけど良かったのかな? (稲葉) 2022/11/12(土) 16:59:40
早速ありがとうございます。
配列だと早いとネットに書いてありましたが、実際の書き方がまだよく分からずでした。
このように使用するのですね。勉強になります。。
色は使わないので大丈夫です。
また、何回も実行すると…の件ですが、長いコードの一部にこの置き換えのコードを組み込みたいと思っているので、
マクロを流しなおすと、「あ、い、う、え、お」の文字も貼りなおすので、その心配はなさそうです。
そのような使い方であることも理解しました。
大変ありがとうございます!
(ららら) 2022/11/12(土) 17:07:49
速度実験です。^^;
>A列の2行目から何万行も文字が入っています。 >例題では、あ、い、う、え、お の文字がランダムに入っているとします。
と言うことで、まずはA列にランダムに「 あ、い、う、え、お 」を作成する 尚、実験は 30,000行としました。
Sub A列にデータサンプルを入力()
Dim q&, n& Dim Words As String, str As String Words = "あいうえお"
For q = 2 To 30000 Randomize n = Int((5 - 1 + 1) * Rnd + 1) str = Mid(Words, n, 1) Cells(q, 1).Value = str Next q
End Sub
そして、3つのマクロを用意して…速度検証です。
(ららら)さん作
(稲葉)さん作
(手抜き)くん
Option Explicit Dim startTime As Double Dim endTime As Double Dim processTime As Double
Sub らららさん作()
Dim 行 As Long startTime = Timer For 行 = 2 To Cells(Rows.Count, "A").End(xlUp).Row Cells(行, "A") = WorksheetFunction.Substitute(Cells(行, "A"), "う", "うう") Next 行 endTime = Timer processTime = endTime - startTime MsgBox "処理時間:" & processTime
End Sub
Sub 稲葉さん作()
Dim tbl As Variant Dim i As Long startTime = Timer tbl = Range("A2", Cells(Rows.Count, "A").End(xlUp)).Value For i = 1 To UBound(tbl, 1) tbl(i, 1) = Replace(tbl(i, 1), "う", "うう") Next i Range("A2", Cells(Rows.Count, "A").End(xlUp)).Value = tbl endTime = Timer processTime = endTime - startTime MsgBox "処理時間:" & processTime
End Sub
Sub 手抜きくん()
startTime = Timer Call Range("A:A").Replace("う", "うう") endTime = Timer processTime = endTime - startTime MsgBox "処理時間:" & processTime
End Sub
◇実験結果
[1]| |1回目 |2回目 |3回目 |平均 [2]|らららさん作|1.5312500 |1.5468750 |1.5625000 |1.5468750 [3]|稲葉さん作 |0.2500000 |0.2656250 |0.2343750 |0.2500000 [4]|手抜きくん |0.1562500 |0.1406250 |0.1484375 |0.1484375
※配列で十分に速いのだが、手抜きも活用法によっては 検討の余地があるかも?
(あみな) 2022/11/12(土) 23:54:20
>Range("A:A").Replace("う", "うう")
なんで範囲決めないのかな? たいして変わらんと思うけど。
因みに Substitute は、セル範囲で一括変換できます。 (普通) 2022/11/13(日) 01:06:57
やっぱ Application だけじゃないとだめだね。 (普通) 2022/11/13(日) 01:16:15
> なんで範囲決めないのかな? > たいして変わらんと思うけど。
なら、つまらんこと書き込むな。
(半平太) 2022/11/13(日) 06:59:21
あみな様
実験までしていただいて、大変ありがとうございます。
私も実際のデータでやってみました。
気付いたのですが、最初に私が提示したコードも、気にするほど、さほど時間が掛からないのですね。。
(他の作業もマクロ化しており、置き換えのコードを追加したら時間が伸びた気がしたのですが、
もしかしたら他の部分で時間が掛かっている気がしてきました…。。ごめんなさい。。)
そして、単純に、下記一文でも動きますね。そして早いですね。
Range("A:A").Replace What:="う", Replacement:="うう"
一つ教えて下さい。
>手抜きも活用法によっては検討の余地があるかも?
”活用法によっては”の部分が気になりますが、Range("A:A").Replaceでやって危険な所(正しく置き換わらない)等ありますか?
ネットで調べると様々なアプローチ方法があり、どれを使えば良いのかまだまだ理解が足りていません。。
(ららら) 2022/11/13(日) 12:01:05
> なんで範囲決めないのかな? > たいして変わらんと思うけど。
なら、つまらんこと書き込むな。
なにこの珍平太って、朝っぱらから絡んでくるなよ。
最近多いなこういう早起き爺さんのたわごとやゴタゴタ。
朝っぱらから横から出てくんな早起きカス爺さん。
(普通) 2022/11/13(日) 12:11:32
>”活用法によっては”の部分が気になりますが、Range("A:A").Replaceでやって >危険な所(正しく置き換わらない)等ありますか?
う〜ん、多分大丈夫かと思いますが ↓こちらにもよるので…わかりません。
>長いコードの一部にこの置き換えのコードを組み込みたいと思っているので、
この長いコードを提示されると、他の方からもよいアドバイスがあるかもですよ。 元々のマクロが時間が掛かるのかもですね。
今から、お友達と "お好み焼き" パーティーなので出かけちゃいます。 すいません。(o_ _)o ペコ
(あみな) 2022/11/13(日) 12:34:35
あみな様
色々ありがとうございました。
お陰で、たくさんの気付きがありました!
お好み焼きパーティー、楽しんできてください(^^)
(ららら) 2022/11/13(日) 12:50:54
遅かったのはほかの原因でしたかー >マクロを流しなおすと、「あ、い、う、え、お」の文字も貼りなおすので、 この部分を、配列で一気に書き込んであげるといいかもしれませんね。 ついでに、変換した後に書き込めば、書き込み処理も一回で済みそうですので、 差支えなければ全文載せていただければ、できる範囲で回答させてください。 (稲葉) 2022/11/13(日) 20:05:50
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.