エクセルVBAで任意の文字を置換する方法

このQ&Aのポイント
  • Excel VBAのコードを使用して、任意の文字を置換する方法について教えてください。
  • 特定の文字ではなく、何か文字がある状態で置換したい場合、VBAのワイルドカードを使用することができます。
  • 例えば、「;?」を「; ?」として置換したい場合、keyWord1に「;?」、keyWord2に「; ?」と指定します。
回答を見る
  • ベストアンサー

エクセル 任意の文字をVBAで使いたい時

Excel VBAで、任意の文字(特定の文字ではなく、何か文字があるという状態)を含んだ語を、置換したいです。 具体的には、「;?」を「; ?」として置換したいです。 ※ここで「?」は任意の文字としています。 以下のコードで試しましたが、うまくいきません。 Sub macro2() Dim myRange As Range Dim keyWord1 As String, keyWord2 As String Dim bool As Boolean Set myRange = Range("C4") keyWord1 = ";?" 'ワイルドカードを使用 keyWord2 = "; ?" bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlWhole) End Sub keyWord1 = ";?" 、keyWord2 = "; ?"の「" "」の部分に何を入れればいいか、ご教授願います。 宜しくお願い致します。

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (713/1474)
回答No.4

これでどうでしょうか。 置換を2回行い、; の後空白2文字を、; の後空白1文字にしています。 これで、; の後に空白があっても、; の後の空白は1つです。 これが1番手っ取り早いかと思います。' Sub Macro1() '   [C4].Replace ";", "; ", xlPart   [C4].Replace "; ", "; " End Sub (空白2文字が変換される可能性があるので、画像を載せておきます)

corone20202000
質問者

お礼

ご回答ありがとうございます。ご教授頂きましたコードで成功しました!大変助かりましたので、ベストアンサーに選ばせて頂きます。

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.3

> 具体的には、「;?」を「; ?」として置換したいです。 スペースがないところにスペースを入れたい、「;A」を「; A」にしたいみたいなことじゃないわけですね。 > 置換対象の文字列が元々「;」の次にスペースが入っているもので、「"; "」で置換すると、スペースが2つ入ってしまいます。 もともと入っているのなら置換する必要は無いと思いますが。 「; 」を「; 何らかの一文字」にしたいということでしたら keyWord1 = "; " keyWord2 = "; " & 文字を入れた変数 とかでできると思いますが。 「;」の後ろにスペースが無ければ入れたいのでしたら以下のようなイメージで If Mid(myRange, InStr(myRange, ";") + 1, 1) <> " " Then keyWord1 = ";" keyWord2 = "; " bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlPart) End If どちらにしても、具体的にどのような文字列にたいして結果をどうしたいのかが分かりません。

corone20202000
質問者

お礼

ご親切に補足にも回答頂き、ありがとうございます。説明が足りず申し訳ありませんでした。まさに、「;」の後ろにスペースが無ければ入れる…という事をしたかったです。 ご教授頂きましたコードで試し、コンパイルエラーが出てしまいました。当方とても知識不足ですので何がいけないのか、調べていきたいと思います。参考になるものをありがとうございました。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.2

単に「;」の後ろにスペースを追加したいだけなら keyWord1 = ";" keyWord2 = "; " bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlPart) '← LookAt:=xlWholeは変更 でいいと思います。

corone20202000
質問者

お礼

ご回答ありがとうございます。ご教授頂きましたコード参考にさせて頂きます。

corone20202000
質問者

補足

ご回答ありがとうございます。 補足させて頂きます。 置換対象の文字列が元々「;」の次にスペースが入っているもので、「"; "」で置換すると、スペースが2つ入ってしまいます。スペースが2つある状態は避けたいので、任意の文字で設定したかったのです。説明が足りずすみません。 ";."で試しましたが、うまく変換出来ません。 コードから間違っているのでしょうか。

回答No.1

正規表現を使うとよいと思います。 VBA 正規表現で調べるとやり方が出てきます。

corone20202000
質問者

お礼

「正規表現」初めて知りました。 「.」で任意の文字を表すのですね、勉強になります。質問の中のコードに当てはめても、私の知識不足でうまくいきませんでしたが、根気よく調べて行きたいと思います。ご回答ありがとうございました。

関連するQ&A

  • エクセルVBAで特定の文字を削除したい

    選択しているセルの中に入っている文字「■」を 削除したいのですがうまくいきません。 お願いいたします。 Sub ■削除() Dim myRange As Range Dim keyWord1 As String, keyWord2 As String Dim bool As Boolean Set myRange = ActiveCell keyWord1 = "■" keyWord2 = "" bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlWhole) End Sub

  • Excelで文字を置換したいのですが

    A列の各セルに入っている文字列において、Bという文字があったらCに、無かったら文字を削除して空白にする、という作業を行いたいのです。 行数にして700行くらいありますので、マクロを考えました。 Replaceメソッドを使うのだと思い、ネットの記事を参考に、以下のマクロを書いてみましたが、「含まない」が機能しません。 「Bを含まない場合は削除する」というのはどのようにしたら良いでしょうか。 Sub macro9() 'Dictionaryオブジェクトの宣言 Dim myDic As Object Set myDic = CreateObject("Scripting.Dictionary") 'Dictionaryオブジェクトの初期化、要素の追加 myDic.Add "*B", "C" myDic.Add "<>B", "" 'Dictionaryオブジェクトを使った複数条件の置換 Dim bool As Boolean, myRange As Range Set myRange = Range("A3:A700") For Each Var In myDic bool = myRange.Replace(Var, myDic(Var)) Next Var End Sub

  • ExcelのVBA ListBox.RowSourceの範囲について教えてください。

    下記のように範囲を変数で検索指定したいのですが、うまくいきません。VBAは初心者です。誰か助けて。 内容は・・・五十音順にあるリストを作り、ウ音のみをListBoxに表示したいのですが。 Private Sub ToggleButton3_Click() Dim A As Range Dim BBB As String Dim C As Range Dim DDD As String Set A = Cells.Find(what:="ウ", lookat:=xlWhole) BBB = Cells(A.row, A.Column + 1).Address Set C = Cells.Find(what:="エ", lookat:=xlWhole) DDD = Cells(C.row - 1, C.Column + 1).Address ListBox商品名.RowSource = "BBB:DDD" End Sub PS 違う方法でもいいのでどなたか教えてください。

  • Excel VB-指定した範囲の下に貼り付け

    ExcelのVBについて質問です。 指定した任意の範囲をコピーして、その範囲のすぐ下に貼り付けるにはどうしたら良いのでしょうか? 任意の範囲は、空白セルがあったりなかったり、まったく規則性はありません。 以下、自分で考えたものです。 ______________________________ Sub Macro1() Dim myrange As range Set myrange = Selection Selection.Copy #myrangeのすぐ下を選択する何か ActiveSheet.Paste End Sub ______________________________ よろしくお願い致します。

  • エクセルVBA 重複を表示したい

    エクセルVBA 重複を表示したい A列で重複すると警告するコードを以下のように作成しました。 これを修正してA列で重複して、なおかつB列でも重複した場合警告するコードにしたいのです。 添付した図では「同姓同名あり、確認してください、鈴木一郎、山口」と表示したいのです。 ご教授よろしくお願いします。 Sub test() Dim myRange As Range Dim 同一flag As Boolean Dim MsgStr As String For Each myRange In Range("A2:A10") If WorksheetFunction.CountIf(Range("A2:A10"), myRange) > 1 Then If 同一flag = False Then 同一flag = True If InStr(1, MsgStr, myRange) = 0 Then MsgStr = MsgStr & myRange & vbCrLf End If End If Next If 同一flag = True Then MsgBox "同姓同名あり" & Chr(13) & _ "確認してください" & Chr(13) & _ vbCrLf & MsgStr Else End If End Sub

  • エクセルVBA 重複を表示したい2

    エクセルVBA 重複を表示したい2 以下ではたいへんお世話になりありがとうございました。 http://okwave.jp/qa/q5849885.html 上記に関連する質問をさせていただきます。 下記に提示したコードを修正して、以下のようなコードに変えたいと考えています。 「B列で重複したデータがあれば、そのすべてを左隣のデータと一緒に表示したい」 添付した図だと、 1小沢一郎 7〃 8〃 4鈴木一郎 6〃 以上のような感じです。 アドバイスよろしくお願いします。 Sub TEST() Dim myRange As Range Dim 同一flag As Boolean Dim MsgStr As String m_Rows = Range("b" & Rows.Count).End(xlUp).Row For Each myRange In Range("b2:b" & m_Rows) If WorksheetFunction.CountIf(Range("b2:b4000"), myRange) > 1 Then If 同一flag = False Then 同一flag = True If InStr(1, MsgStr, myRange) = 0 Then MsgStr = MsgStr & myRange.Offset(0, -1).Value & myRange & vbCrLf End If End If Next If 同一flag = True Then MsgBox "同姓同名あり" & Chr(13) & _ "確認してください" & Chr(13) & _ vbCrLf & MsgStr Else End If End Sub

  • エクセル VBA

    Dim h As Range If Application.CountIf(Range("p:p"), 5) = 0 Then Exit Sub Set h = Range("p:p").Find(what:=5, LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlPrevious) Range(Range("p2"), h).EntireRow.Delete Shift:=xlShiftUp 上記のマクロは、「2行目から、P列の数値が5の最下の行までを削除する」という内容です。 この5の部分を、<0(0未満)に変えたいのですがわかりません。 どうぞ教えてください。

  • エクセルのVBAに関する質問です。

    エクセルのVBAに関する質問です。 「指定フォルダ(ここではXXXX)内の全てのエクセルファイルを開き、内容を転記していく」 というマクロについての質問です。 ネットを参照し、以下のマクロを見つけました。 -------------------------------------------------------------------------- Sub Macro1() Dim theName As String Dim theDir As String Dim theBook As Workbook Dim flg As Boolean flg = True Application.ScreenUpdating = False theDir = ThisWorkbook.Path & "\XXXX" theName = Dir(theDir & "\*.xls") Do While theName <> "" Set theBook = Workbooks.Open(theDir & "\" & theName) Call subA(theBook, flg) flg = False theBook.Close theName = Dir Loop End Sub Sub subA(theBook As Workbook, flg As Boolean) Dim thetbl As Range, LRow As Long Set thetbl = theBook.Sheets(1).Range("A1").CurrentRegion thetbl.Copy With ThisWorkbook.ActiveSheet LRow = .Range("A65536").End(xlUp).Row If LRow = 1 Then .Range("A" & LRow).PasteSpecial xlPasteValues Else .Range("A" & LRow + 1).PasteSpecial xlPasteValues End If End With Application.CutCopyMode = False End Sub -------------------------------------------------------------------------- 実際にはこのマクロは上手く動作していますが、1つ疑問があります。 「一度開いたファイルは開かない」というのはどの部分のおかげか、ということです。 当方初心者で、分かりづらい質問かもしれませんが、どうぞご教授お願いいたします。

  • LookAt の定数を変数で指定するには?

    エクセルvbaです。 Sub test() Dim strLookAt As String strLookAt = "xlPart" Cells.Replace What:="aaa", Replacement:="iii", LookAt:=strLookAt End Sub このようなことはできないのでしょうか? LookAtの部分のxlWhole または xlPart かをシートから読み取って変数に格納し、 Replace メソッドで置換したいのですが、 このコードを実行すると「型が一致しません」になります。 多分、LookAt:=strLookAtでエラーになってるのだと思います。 String型だからいけないのでしょうか? 回避方法を教えてください。よろしくお願いします。

  • EXCEL VBA 他のワークシートのデータを見るには?

    EXCEL VBAでsheet1のセルに何かデータが入力された時に、sheet2のどこかのセルに同じ文字列がないかを探したいと思います。 データの入力と同時に検索をかけるため、sheet1の部分にイベントプロシージャを定義し、 データが入力された時にそのルーチンの中からsheet2のデータを見に行きたいのですが、エラーが出てしまいます。 こういうことはできないのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Dim LineNo As Integer Dim tmp_str As String tmp_str = Target.Value LineNo = Sheets("sheet2").Cells.Find(what:=tmp_str, lookat:=xlWhole).Row MsgBox (LineNo) End Sub

専門家に質問してみよう