最新閲覧日:

こんにちは、エクセルのVBAについてあまり詳しくないのでお力を貸していただけると幸いです。

具体的にしたいことは、例えばA1からB5までの範囲を選択した後にマクロを実行すると、その全セル内の()を検出し、(いぬ)などの場合には( いぬ )と両側に半角で5つずつのスペースを入れられるようなものは出来ないでしょうか?

また、1つのセル内に、(いぬ)と(ねこ)など()で囲ってあるのものが2つ以上ある場合にも( いぬ )と( ねこ )と働くようなものを作ることは可能でしょうか?

現在は( )、()内にスペースが入力されているものが入力されるマクロを使って、後々その中に手打ちして埋めている状態です。

A 回答 (5件)

こんにちは。



マクロにするというのは、ユーティリティにしたいとおっしゃっていることだと思います。一回きりならともかく、何度も同じようなことが出てくるのを一瞬で変えようとする場合を想定しました。

その場合は、個人用マクロに入れて、ショートカットを設定します。

以下の場合は、正規表現にするのは、もう少し複雑な内容の可能性を想定しているからです。
  .Pattern = "[(\(](.+?)[\) )]"

そのパターンを書き換えさえすれば、いろんな対応が可能です。
また、1つの言葉に対して、スペースが5個ずつでしたら、
c.Value = .Replace(buf, "(" & Space(5) & "$1" & Space(5) & ")")
とすれば、5個になります。

括弧の中の文字を消すとか、簡単にできてしまいます。

c.Value = .Replace(buf, "(" & Space(1) & " " & Space(1) & ")")

また、少し変えることによって、括弧の中に、順に数字を入れて試験問題を作ることなどが可能です。もちろん、文章の中の括弧を意味します。

( 1 )
( 2 )
( 3 )
( 4 )( 5 )
( 6 )( 7 )( 8 )

のようなことも可能です。

'//
Sub EnterSpaces()
 Dim Rng As Range
 Dim RegEx As Object
 Dim buf As String
 Dim Ms As Object, c As Range
 If TypeName(Selection) <> "Range" Then Exit Sub
 Set Rng = Selection
 If Application.CountA(Rng) = 0 Then MsgBox "データがありません", vbExclamation: Exit Sub

 Set RegEx = CreateObject("VBScript.RegExp")
 With RegEx
  .Global = True
  .Pattern = "[(\(](.+?)[\) )]"

  For Each c In Rng
   buf = Replace(c.Value, Space(1), "")
   Set Ms = .Execute(buf)
   If Ms.Count > 0 Then
    '上書きモード
    c.Value = .Replace(buf, "(" & Space(1) & "$1" & Space(1) & ")")
   End If
  Next
 End With
End Sub
    • good
    • 0
この回答へのお礼

大変助かりました。幅広く対応できるもので物凄く感動しました!

お礼日時:2017/04/18 20:09

自分もマクロで処理するよりも「置換」で


 ”(” を ”(     ”
 ”)” を ”     )”
とすることを勧めます。

マクロで行う場合も指定した範囲に対して「置換」をそのまま実行するだけです。
(記録マクロで作れるレベルです)


・・・余談・・・
なぜかこのサイトでは半角スペースを2つ以上続けて入力しても半角スペース1つとして表示されるので、回答には全角スペースを使っています。
他にも、行頭に対しても半角スペースが使えないという制限があるんですよね。

ですので、ここで長く回答されている人は質問文に対して
 「両側に半角で5つずつのスペース」なのに「( いぬ )と( ねこ )」ってどういうこと?
なんて思いません。
安心してください。
(気づいていない人もいる事はナイショ)
    • good
    • 0
この回答へのお礼

置き換えの機能を失念していました…仰るとおり、これでも十分代用できますね。半角のスペースに関しても今後は全角にします。ありがとうございました!

お礼日時:2017/04/18 20:10

>>範囲を選択した後に


これが結構面倒、複数セルがアクティブになっているので、左上先頭位置と列数・行数を取り込み・・・。

エクセルで範囲をマウスで選択して「置換」した方が手っ取り早い。
"(" → "( "へ置換
")" → ") "へ置換

VBAでやらないと、どうしても駄目??
    • good
    • 0

No.1 の追記



もし間違えて同じ箇所を数回やってしまってもスペースは1つだけにしたいのならば以下のようにしてみてください。
--------------------------------------------------------------------------
Sub スペース追加()
Selection.Replace What:="( ", Replacement:="("
Selection.Replace What:="(", Replacement:="( "
Selection.Replace What:=" )", Replacement:=")"
Selection.Replace What:=")", Replacement:=" )"
End Sub
--------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

大変助かりました。希望の動作をしてくれるもので、感謝しています!

お礼日時:2017/04/18 20:11

置換してしまうのが楽だと思います。

以下のようなものではどうですか?
--------------------------------------------------------------------------
Sub スペース追加()
Selection.Replace What:="(", Replacement:="( "
Selection.Replace What:=")", Replacement:=" )"
End Sub
--------------------------------------------------------------------------
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報