アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA初心者です。どなたか、教えてください。

エクセルの複数列、複数行に文字列がるのですが、一部文末に「スペース」+「、」があり、いくつもの文末にあるのでこの二文字を一気に削除したいです。

文末意外に文字列の間にもあるのですが、削除したいのは、文末の「^、」です。

必ず「^、」の順で並んでいるのですか、スペースもカンマも半角、全角が混ざっています。

お手数ですが、どなたか、よろしくお願いいたします。

A 回答 (3件)

今、戻ってきました。


>Unicode「00A0」があり
私が想定していたもの、ずばりでした。すぐに思いつけばよかったものの、急いでいたものですみません。

そこで、二種類作ってみました。
一番目は、#1の改良型
二番目は、VBScript の正規表現検索です。

 .Pattern = "[" & ch1 & ch2 & ch3 & "][" & ch4 & ch5 & "]"
このカギカッコの中に、スペースと思われるものや、読点(、)と思われるものがあれば、削除してくれます。[ ]の中は、一つだけ選びます。もし2つだったら、[]{2} と中括弧を使います。

ch1 =Chr(&H...) -SJIS用, ChrW はChr"(&H...) Unicode用として代入すれば、正規表現で読んでくれます。

> If Len(c.Value) - 2 = Matches(0).FirstIndex Then
これは、終わりから数えて2番目の位置を示すということです。
この正規表現は、外部オブジェクトですから、多少、反応が鈍いような気がします。

VBAがわかる方なら、パターンだけですから、一見複雑なようでも、決まりきった内容ですから、すぐに分かるはずです。


'//
Sub del_spce_marks2()
 Dim c As Range
 Dim buf As String
 For Each c In Range("A1", Cells(Rows.Count, "A").End(xlUp))
  If Len(c.Value) > 2 Then
   buf = Replace(c.Value, ChrW(160), Space(1))
   If StrComp(Right(buf, 2), Space(1) & "、", vbTextCompare) = 0 Then
    c.Value = Mid(buf, 1, Len(buf) - 2)
    buf = ""
   End If
  End If
 Next c
End Sub

'//
Sub del_REspce_marks()
 Dim c As Range
 Dim Re As Object
 Dim Matches As Object
 Dim buf As String
 Dim ch1, ch2, ch3, ch4, ch5
 ch1 = Chr(&H8140): ch2 = Chr(&H20): ch3 = ChrW(&HA0)
 ch4 = Chr(&H8141): ch5 = Chr(&HA4)
 
 Set Re = CreateObject("VBScript.RegExp")
 With Re
  .Pattern = "[" & ch1 & ch2 & ch3 & "][" & ch4 & ch5 & "]"
  .Global = False
  For Each c In Range("A1", Cells(Rows.Count, "A").End(xlUp))
   Set Matches = .Execute(c.Value)
   If Matches.Count > 0 Then
    If Len(c.Value) - 2 = Matches(0).FirstIndex Then
     buf = Replace(c.Value, Matches(0), "", , 1)
     c.Value = buf
     buf = ""
    End If
   End If
  Next c
 End With
 Set Re = Nothing
End Sub
'//

このコードは、何度もやっていますが、どうも忘れてしまいます。
なお、昔のコードをみると、c.Value =Application.Clear(c.Value)として、バイナリコード(正確に言うと、エスケープシーケンス)を削除していたりします。残っているとエラーの元になりますから、もしも、気になったらお使いになることをおすすめします。
    • good
    • 1
この回答へのお礼

助かりました

できました!
他の条件もあり、昨日途中まで作業していたので、一つ目の方を使用しました。
キレイに削除できました。
ありがとうございました!

お礼日時:2016/08/16 13:12

VBAでなくとも


置換ではだめなのでしょうか?
    • good
    • 0
この回答へのお礼

置換の他にも条件がいくつかあり、一度に処理をしたいのと、今後も同じ要件が出るはずなので、VBAを希望しました。
ご回答ありがとうございました。

お礼日時:2016/08/16 13:07

理屈どおりなら、以下のように、TextCompare モードで検索し、削除します。



Range("A1", Cells(Rows.Count, "A").End(xlUp)) ここは、Selection に変えても良いです。A列で書かれていることを意味します。
でも、本当にこれでよいのか、何かバリエーションがありそうな気がします。例えば、スペースは、種類がいくつもあります。SJIS以外のなどでも違う種類のスペースがあります。バックアップを取って試してみてください。また、半角の「、(読点)」は、「,」に置き換わることもあります。今の段階では、そこまで考えていません。


'//
Sub del_spce_marks()
 Dim c As Range
 For Each c In Range("A1", Cells(Rows.Count, "A").End(xlUp))
  If Len(c.Value) > 2 Then
   If StrComp(Right(c.Value, 2), Space(1) & "、", vbTextCompare) = 0 Then
    c.Value = Mid(c.Value, 1, Len(c.Value) - 2)
   End If
  End If
 Next c
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございます。
通常の「スペース+、」削除できました。

しかし、ご察しの通りUnicode「00A0」があり、そのスペースは、削除できませんでした。

「、」も混ざっていましたか、何とか削除することができました。

前進できたので本当にありがたく、感謝いたします。

ありがとうございました。

お礼日時:2016/08/15 13:09

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