• 締切済み

マクロ(複数文字置換)についての質問です。

現在、ExcelのA列に置換前の文字、B列に置換後の文字が入っているシート(シート名:"辞書")があります。 そのシートを辞書的役割で使用し別のシートの内容を置換したいと考えています(現在候補が1000文字程度あり、1つずつ置換をすることが難しいです) また、完全一致のみの置換、大文字とから小文字の置換も可能にし、件数も何件存在するかわかりません。 例:ABCをabcに変換したい場合、 ○ABC→abc ×ABCDEF→abcDEF のような感じです。 しかし、1つのセルの中に空白がある場合は置換可能とします。 例:ABC DEF→abc DEF このようなことは可能でしょうか? 何卒よろしくお願いいたします。

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

A No.2です。 試行錯誤しているうちに、今回の事例ではSubmatchの必要が無くなっていました。検索パターンの()は不要です。 Private Sub test(srcString As String, replaceString As String)で、 patternString = "\b" & srcString & "\b" Private Function regExReplace(targetString As String, patternString As String, replaceString As String) As Stringで regEx.Pattern = Matches(0) で動きますので、一応お知らせしておきます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

>1つのセルの中に空白がある場合 半角スペースの場合としておきます。 Sub test()   Dim Dic As Object   Dim i As Long, j As Long   Dim v, w, x, y   Set Dic = CreateObject("Scripting.Dictionary")   Application.ScreenUpdating = False   With Worksheets("Sheet2")  ' 辞書シート        v = .Range(.Range("A1"), .Cells(Rows.Count, 2).End(xlUp)).Value   End With   For i = 1 To UBound(v, 1)       Dic.Add v(i, 1), v(i, 2)   Next   With Worksheets("Sheet1")  ' 検索シート         w = .UsedRange.Value         ReDim y(1 To UBound(w, 1), 1 To UBound(w, 2))         For i = 1 To UBound(w, 1)             For j = 1 To UBound(w, 2)                 x = Split(w(i, j), " ") ' 半角スペースで区切ってみる                 Select Case LenB(w(i, j))                        Case Is > 0                             If UBound(x) = 0 Then                                If Dic.exists(x(0)) Then                                   y(i, j) = Dic(x(0))                                Else                                   y(i, j) = w(i, j)                                End If                             ElseIf Dic.exists(x(0)) Then                                y(i, j) = Dic(x(0)) & " " & x(1)                             Else                               y(i, j) = w(i, j)                             End If                        Case 0                             y(i, j) = Empty                 End Select             Next         Next         .Cells.ClearContents         .Range("A1").Resize(UBound(y, 1), UBound(y, 2)).Value = y   End With   Application.ScreenUpdating = True   Set Dic = Nothing   Erase v, w, x, y End Sub ご参考まで。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2です。早速問題が露呈しました。 patternString = "\b(" & srcString & ")\b" に変更して下さい。前のままでは、ABCDEF -> ABCdefになってしまいました。 お詫びに?、ループを回す部分の概略を載せます。 Sub main() Dim targetRange As Range Dim targetRow As Range '置換対象シートは1番目とする Set targetRange = Sheets("辞書").Range("a1").CurrentRegion For Each targetRow In targetRange.Rows Call test(targetRow.Cells(1), targetRow.Cells(2)) Next End Sub

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

久しぶりの正規表現。気楽に始めたら、手こずってしまいました。対照表から読み取ってループを回す部分は、ご自分でお願いします。 単純なデータでしか試験してないので、うまく動かなかったらあしからず。冗長なコードや、変な英語はご笑納下さい。 Sub main() Call test("ABC", "abc") End Sub Private Sub test(srcString As String, replaceString As String) Dim patternString As String Dim findRange As Range, firstAddress As String patternString = "(" & srcString & ")\b" With Worksheets(1).UsedRange Set findRange = .Find(srcString, LookIn:=xlValues, LookAt:=xlPart) If Not findRange Is Nothing Then firstAddress = findRange.Address Do findRange.Value = regExReplace(findRange.Value, patternString, replaceString) Set findRange = .FindNext(findRange) Loop While Not findRange Is Nothing And findRange.Address <> firstAddress End If End With End Sub Private Function regExReplace(targetString As String, patternString As String, replaceString As String) As String Dim regEx As Variant Dim Matches As Object, Match As Object Set regEx = CreateObject("VBScript.RegExp") regEx.MultiLine = False regEx.Pattern = patternString regEx.IgnoreCase = False regEx.Global = False Set Matches = regEx.Execute(targetString) If Matches.Count > 0 Then regEx.Pattern = Matches(0).submatches.Item(0) regExReplace = regEx.Replace(targetString, replaceString) Else regExReplace = targetString End If Set regEx = Nothing End Function 詳細は、「VBA 正規表現」で検索してお調べ下さい。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

>そのシートを辞書的役割で使用し別のシートの内容を置換したいと考えています 辞書的なシートのレイアウトと別シートのレイアウトを提示されては?

a04sa026
質問者

補足

確かにそのとおりですね。 ご指摘ありがとうございます。 辞書的なシートのレイアウトは、A列に置換前の文字列、B列に置換後の文字列が入力されています。 例:A列 |B列  ----------   ABC  |abc のような感じです。 また、別シートのレイアウトは、全部のセルを対象範囲としております。 よろしくお願いします。

関連するQ&A

  • 置換演算子を使うと空白が入ってしまう

    $test = abcdef; $test =~ s/abc//g; 上記の様に置換演算子を使って文字列の削除を行うと、 「 def」の様に、削除した文字列に半角空白が入ってしまいます。 1回や2回ならよいのですが、何回も処理を行うと、 最終的に大量の空白が挿入されてしまい、大変困っています。 なんとか削除した部分に空白を挿入しない方法はないものでしょうか? 解決法がわかる方がいらっしゃいましたら、御教授頂きたく、 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 位置指定の文字マッチングと同時に置換

    active perl v5.8を使用しています。 文字列のマッチングと置換について質問させてください。 たとえば"ABCDEF"という文字列があったとします。この文字列の3文字目の 後に"-"(スペースバー)を入れたいと思います。"ABC-DEF"のように。 この場合文字の種類ではなく、文字の位置から置換する対象を決めること にしたいのです。 正規表現をつかい3文字目を見つけ、3文字目 + "-"に置換すればよいと考えました。 my $seq = "ABCDEF"; $seq =~s/.{2}(.)/$1-/; #3番目の文字を(.)に入れて記憶 としたのですが、こうすると(C-DEF)のように初めのほうの文字が消えてしまいます。(スクリプトを見直してみると当然なのですが。。。) 後方参照という方法で $seq =~s/.\3/$1-/; というふうにもしたのですが、 "Reference to nonexistent group in regex"と\3をリファレンスとして とられてエラーになりました。 このような場合、どうすればヒットした文字のみを置換できるでしょうか。 非常に基本的なことなのですが、参考書やウェブではなかなか見つからな かったもので。。。。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • emacsで文字列の置換

    新しい職場で emacs を使い始めたのですが、文字列の置換をすると動作が変です。 ・abc → DEF という置換をすると、なぜか ・abc → DEFbc となってしまいます。 M-% M-x replace-string のどちらで置換しても同じです。 とても困っています!!どなたかアドバイスを!!!

  • Excelで文字列の抽出をしたいので教えてください

    Excelで下記の文字列を抽出したいのですがどなたか教えてください 例) - abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出 -- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出したいのですが宜しくお願いします

  • 秀丸エディタでの改行を含む複数行の置換について

    abc↓ 1行の文字列またはランダムな個数の改行を含むランダムな長さの英文文字列 def↓ を abc↓ あ↓ def↓ に置換したい場合、検索文字列はどのように指定すればいいのでしょうか? 「1行の文字列またはランダムな個数の改行を含むランダムな長さの英文文字列」は、 ee ff gg↓ の場合もあれば、 ee ff gg↓ hh iii jj↓ kk.↓ のような場合もありますが、これらすべてを全角1文字に置換したいのです。 また、この abc↓ 1行の文字列またはランダムな個数の改行を含むランダムな長さの英文文字列 def↓ は、他の文章の中に大量に埋まっていて、他の文章の体裁は崩せないため、 一括でとりあえずずべての改行を削除という方法は使えません。 お手数ですがどうぞよろしくお願い致します。

  • 一括置換をしたい

    ワード2003を使っています。 あるテキストデータの 「ABC」という文字列を「DEF」に置換したいんです。 同様に、 「GHI」を「JKL」に、 「MNO」を「PQR」に置換したいんです。 このように3つの文字列をボタンひとつで置換するにはどのようにすれば良いでしょうか? よろしくお願い致します。

  • エクセルのマクロで文字の置換について

    エクセルのマクロを使った文字の置換についてお聞きしたことがありましす。 やりたいイメージは例として添付の画像としてアップしましたが、 ・エクセルシートに英数文字列の表がある(例では2行2列ですが、実際は6行48列ぐらいです) ・その表を各英数文字列の間に半角カンマ","を入れて、メモ帳に貼り付けたい   ※実際メモ帳に貼り付ける動作は手動で行うので、クリップボード上で「各英数文字列    の間に半角カンマ","が入っている状態」で構いません。 ・各英数文字列の最初の2文字は必ず"0a"、その後の英数字は3桁または4桁です。 ちなみに、エクセルシートで英数文字列の表をそのままコピーしてメモ帳でペーストすると 各英数文字列の間にスペース(空白)が入ってしまいます。 その後、メモ帳で置換などを使い半角カンマ","を入れてもいいのですが、そこまでをマクロで行いたいと思っております。 上記のことがそもそもエクセルのマクロで出来るかどか分かりませんが、なにか有用な方法がございましたらご教授お願い致します。  ※使用OS:Windows7、エクセルバージョン:2007

  • VBSで文字列の置換

    VBSまったくの初心者で、「そんなもんWebで調べろ」とお叱りを受けるのを承知でお聞きします。 C:¥置換¥あああ.txt のテキストファイル内にある文字列"ABC"を"DEF"に置換するVBSはどのように記述すればよいでしょうか?。 よろしくお願いいたします。

  • 秀丸エディタで文字列の置換をしたい

    秀丸エディタの正規表現についてお教えください。 やりたいこと: 対象の文字列を含んでいない行を削除したい 例:defのみを削除したい abc def def abc ↓ abc abc どのようにすれば実現できますでしょうか? よろしくお願いします。

  • テキスト置換ソフトで、特定の文字列が●個出てくるごとに置換できるもの知りませんか?

    以下のような機能をもつ テキストファイルの置換ソフトを探しています。 特定の文字列が●個出てくるごとに、 その●個目の部分だけを置換する機能です。 たとえば、 abc abc abc abc abc abc abc abc という文字列があるとして、 手動ではなく一括で以下のように置換をしたいのです。 abc ABC abc ABC abc ABC abc ABC この例では、abcが2つ登場するごとに、ABCという文字列に置換されていますね。このように特定の文字列(この例ではabc)が●個出てくるごとに、その●個目の部分だけを置換するというような機能を持つ(できれば)フリーソフトなどをご紹介いただければありがたいです。 秀丸エディタなどのテキストエディタでは、おそらくできないと思うのですが、もしできるのであれば、そのやり方を教えていただいても構いません。 よろしくお願いいたします。

専門家に質問してみよう