Excel操作(正規表現で範囲置換)を作ってみた
ありそうでなかった、Excelセル範囲を正規表現で一括置換。
同梱ライブラリのスクリプトを10行差し替えて実現できました。
お裾分けです。
きっかけのスレッド
https://winactor.com/questions/question/抽出したデータから形式の違うメールアドレスを1/
ざっと眺めた範囲では、公開されてる情報は見つけられませんでした。
延長線上で最下部のリファレンスサイトを見つけ、同梱ライブラリ/スイートライブラリと繋げて最適化してみました。
加工のベースに使ったライブラリ
- Excel操作(範囲検索)
- 正規表現(文字列置換) | スイートライブラリ
https://winactor.biz/sweet/2020/10/15_3312.html
加工の3ステップ
- 不要な行をコメントアウト(行頭にシングルクォーテーション追加)
- 'keyword =!検索単語!
- '検索結果を調べる のブロック
- この↓終了処理の手前に、10行スクリプトを挿入
- ' ====終了処理
- 最下行でオブジェクト変数を開放
- Set reg = Nothing
勝手に命名
Excel操作(正規表現で範囲置換)
使用感
- スピード
きっかけのスレッドの例で試す限り一瞬で快適
順に置き換わっていく様子は、さすがに目で追える
1ライブラリのメリットとして、きっと10000セルでも一瞬の範疇に違いない - 機能
^kanakoをkanakoaaaに置き換え(行頭のkanakoをkanakoaaaに置き換え → 正しく、4か所だけ置き換わった
これ以外は未検証
きっとリファレンスサイト通りに、正規表現のほぼフル機能が使えるに違いない - ほかの手法を意識してみる
これまで、手動で必要な場面ではマクロにするほどでもなくて、確かサクラエディタで置き換えてからExcelに戻す感じだった
WinActorノートを経由すれば、それなりに見栄えのするしくみを作れるのかもしれない
挿入する10行スクリプト
'正規表現オブジェクトを作成
Set reg = CreateObject("VBScript.RegExp")
With reg
.Pattern = !正規表現パターン!
.IgnoreCase = CBool(!大文字小文字の区別|True,False!)
.Global = CBool(!全体検索|False,True!)
End With‘ 開始セルから終了セルを繰り返し
For Each c In worksheet.range(range)
'正規表現で置換
c.Value = reg.Replace(c.Value, !置換後文字列!)
NextSet reg = Nothing
関連ライブラリ
- Excelファイルで指定した範囲内を置換するライブラリ
https://winactor.biz/library/2019/01/30_614.html
Excel操作(範囲を指定して置換) | プチライブラリ ※ WinActor 7.2.1以降に同梱
これをベースにしたほうが良かったかも、、
少しだけ掠るスレッド
https://winactor.com/questions/?q=エクセルで指定したセルの範囲で文字列の中のある文字を指定した文字に置換したい
リファレンス
正規表現による文字列置換 | EXCE(エクセル)のVBA・マクロ
http://excel-mania.com/vba/regexp2.html
For Each で配列の全ての要素を処理する方法[VBScript] : バヤシタ
https://bayashita.com/p/entry/show/166
制約等、お気づきの点があればお知らせください。
便乗、ウェルカムです。
ブラッシュアップ、機能アップ、軌道修正、こうしてみた、こんなところに使ってみた、^以外の正規表現も試してみた等々、伺えると嬉しいです。
製品らしく手が加わって、オフィシャルライブラリに採用されたら光栄です。
動作確認した環境
- WinActor720 / 630
- Excel2013 / Microsoft365のExcel(2016相当と思われる)