重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

一つのセルの中で、「犬, 犬, 猫, 猫, 猫, 男性, 女性, 女性, 女性, 女性」というような連続する同じ値を、「犬, 猫, 男性, 女性」のように、スリムな形にしたいと思っています。

つまり、繰り返し同じ値が連続している場合に、その一つだけを残して、他を削除したいのです。

エクセルのカンマによるデータ区切りを利用して、区切ったあとに、行列を入れ替えて貼り付けて、フィルタオプションの設定で、同じ値を抽出しないなどの方法を行ってみたりはしたのですが、なにぶんセルの数が膨大なため、手間がかかります。

エクセルでなくても、正規表現を用いたテキストの置換方法などでも構わないのですが、何かいい方法を教えていただけませんでしょうか?

A 回答 (3件)

正規表現の置換を2回実行します。


(秀丸エディタVer5.00以降で確認)

■ 1回目
検索:「(.+, )\1+」
置換:「\1」

■ 2回目
検索:「(.+), \1$」
置換:「\1」
    • good
    • 1
この回答へのお礼

ありがとうございます。簡単に出来て一気に解決しました。残業から少し解放されそうです。

お礼日時:2006/04/14 10:04

'変換するデータのあるセルを選択して以下のマクロを呼び出す。


Public Sub reduce() 'カンマで区切られたデータを集約する
Dim x As Range
Dim aDic, a, s
Set aDic = CreateObject("Scripting.Dictionary")
For Each x In Selection
a = Split(x.Value, ",")
For Each s In a
s = Trim(s)
If Not aDic.Exists(s) Then
aDic.Add s, True
End If
Next
a = aDic.keys()
x.Value = Join(a, ",")
Next
Set aDic = Nothing
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。できました。ただ、セルが複数ある場合(9千近く一列に並んでいます)、上手く処理できませんでした。・・・が一つのセルに関してはかなり有効でしたので、マクロに登録しておきました。ありがとうございました。

お礼日時:2006/04/14 10:07

1行目にデータがあると想定して、2行目に犬, 猫, 男性, 女性を表示させれるようにするにはVBAだとこんな感じになると思います。



おおざっぱに作りましたので、本職のかたならもっと綺麗に実現できると思いますー。

Sub test()

Dim strMae As String
Dim strAto As String


Cells(2, 1) = Trim(Cells(1, 1))

Dim L1 As Integer
Dim L2 As Integer

L1 = 2
L2 = 1
Do Until Cells(1, L1) = ""

If Cells(2, L2) <> Trim(Cells(1, L1)) Then
L2 = L2 + 1
Cells(2, L2) = Trim(Cells(1, L1))
End If

L1 = L1 + 1
Loop

End Sub
    • good
    • 1
この回答へのお礼

ありがとうございました。VBAの使い方がよく分からないものですから、まだテストできていないのですが、使ってみたいと思います。ご協力大変ありがとうございます。

お礼日時:2006/04/14 10:10

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