- ベストアンサー
ExcelのSUBSTITUTEで少し分かりません。多分、あと一歩?教えてください。
Excelを使って下記のような操作をしたいのですがすることができません。 SUBSTITUTE(A1,"aa","a")を使えばなんとなくできそうなところまでは分かったのですが、期待するようにできません。 どのようにすればできますか? 教えていただけないでしょうか? 宜しくお願い致します。 A1の値: aaaabcdaa 期待する値: abcda
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 一般関数では思いつきませんでした。 '<標準モジュール> Function RegSubstitute(ByVal Longtext As String, arg As String) 'RegSubstitute(文字列, シュリンプする文字列) '正規表現を使ったユーザー定義関数 Dim buf As String Dim Match As Object Dim Matches As Object With CreateObject("VBScript.RegExp") .Global = True .IgnoreCase = False .Pattern = arg & "+" Set Matches = .Execute(Longtext) buf = Longtext If Not Matches Is Nothing Then For Each Match In Matches buf = Replace(buf, Match.Value, arg) Next End If End With RegSubstitute = buf End Function
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
質問でのaに当たる文字の繰り返しが3,4文字以上もありえて制限がないなら、VBAなどのプログラムの問題でしょう。 参考に Sub test01() For i = 1 To 10 '1行から10行まで繰り返し a = Cells(i, "A") 'A列i行の文字列について s = Mid(a, 1, 1) '第1文字(最初の先頭文字)を取り出す For j = 2 To Len(Cells(i, "A")) '2文字目以降の各1文字について If Right(s, 1) <> Mid(a, j, 1) Then '累積の最後の文字と今の文字が違えば s = s & Mid(a, j, 1) '今の文字を連結する End If Next j '文字数だけ繰り返し Cells(i, "B") = s '出来上がった文字列をB列に入れる Next i End Sub データ例 aaaabcdaa abcda 山山上上上田上 山上田上 ssdtddtってf sdtdtってf dfgbnvvbg dfgbnvbg
お礼
回答いただきありがとうございます。 なるほど・・・なかなか、複雑になりますね。 助かりました。 ありがとうございます。
- grumpy_the_dwarf
- ベストアンサー率48% (1628/3337)
テキストファイルに書き出して、正規表現の使えるエディタやツー ルで置換して書き戻すのが簡単。なにしろPerl風だと s/a+/a/ g; でおしまい。 秀丸エディタやJEditで使用可能です。
お礼
回答いただきありがとうございます。 正規表現+秀丸でそんなこともできるんですね。 ありがとうございます! また、Excelで気軽に使えると、データが増えても簡単に他所で切るので、引き続き、ご存知の方、宜しくお願い致します。
- mshr1962
- ベストアンサー率39% (7417/18945)
上記のaが4つまでなら =SUBSTITUTE(SUBSTITUTE(A1,"aa","a"),"aa","a") でできますが、そういうことではありませんよね。 厳密に同じ文字が続いたら圧縮するということであれば ユーザー定義関数を作るしかないと思います。
お礼
回答いただきありがとうございます。 aという文字が続く場合は、確実に一文字のaにしたいと思っています。また、セルに入力されている数が多く、aがいったい何文字続いているのかまったく分からない状況です。 もし、お時間がありましたら、ご教示、宜しくお願い致します。
=SUBSTITUTE(SUBSTITUTE(A1,"aaaa","a"),"aa","a") あまり うまくないですが もっと、良回答がありそうです。
- onntao
- ベストアンサー率32% (108/332)
=SUBSTITUTE(SUBSTITUTE(A1,"aa","a"),"aa","a") ということ?
お礼
回答いただきありがとうございます。 質問のが悪かったようです。すみません。 A1の値については、aaaabcdaa B1の値については、aaaaaaaabaaad 以降長く続きます。 そして、期待する値は、aとaが隣り合っているところを、すべてa一文字に置き換えたものです。 宜しくお願い致します。
お礼
回答いただきありがとうございます。 なるほど・・・なかなか、複雑になりますね。 助かりました。 ありがとうございます。