- ベストアンサー
一つのセルの中で重複しているキーワードを省く方法について
デジカメで撮った写真のキャプションをエクセルで管理しています。 A列に画像番号 B列にキーワード C列に撮影日 といった具合で入力して、データ管理しています。 問題はこのB列のキーワードのところです。 例えば、富士山の写真であれば、 「日本、静岡県、富士山、山、風景、自然、屋外・・・」と入力していくのですが、 たくさんキーワードを入力するので、そのうち最初に入力したのを忘れてしまって、 同じものを二回入力してしまい、一つのセルの中で重複が出てきてしまいます。 「日本、静岡県、富士山、山、風景、自然、屋外、山、日本・・・」といった具合です。(この例では山と日本が、一つのセルの中で重複しています) 教えていただきたいのは、この一つのセルの中で、 「、」(読点)で区切られているキーワードで重複しているものを、 一つを残して、それ以外を削除する方法です。 くどういようですがこういうことです。 前)「日本、静岡県、富士山、山、風景、自然、屋外、山、日本・・・」 ↓ 後)「日本、静岡県、富士山、山、風景、自然、屋外・・・」 おそらくエクセルの関数などの範疇を超えているものかもしれないので、 こちらで質問させて頂くのは大変恐縮ですが、 何かお知恵があれば、教えていただければと思います。 どうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
無理矢理ユーザー定義関数です。(本来ならVBAでループを回して処理するところです) Function test(target As String) As String Dim strArray As Variant Dim destArray() As String Dim i As Long Dim myDic As Object Dim myKey As String Dim myKeys As Variant Dim myItem As Variant Set myDic = CreateObject("Scripting.Dictionary") strArray = Split(target, "、") For i = 0 To UBound(strArray) myKey = strArray(i) If Not myDic.Exists(myKey) Then myDic.Add myKey, "" Next i myKeys = myDic.keys ReDim destArray(0 To myDic.Count - 1) For i = 0 To myDic.Count - 1 destArray(i) = myKeys(i) Next i test = Join(destArray, "、") Set myDic = Nothing End Function 先日覚えたJoin関数を使ってみたかったもので、ご参考まで。
その他の回答 (3)
B列に元の文字列があり、キーワードの数は50以内であるとすると、 1.D1セル: =SUBSTITUTE(TRIM(BC1)," ","、") 2.E1セル: =" "&SUBSTITUTE(B1,"、"," ")&" " 3.F1セル: =IF(LEFT(E1,2)=" ",E1,SUBSTITUTE(E1,LEFT(E1,FIND(" ",E1,2))," ")&LEFT(E1,FIND(" ",E1,2))) として、 4.F1セルをBC1セルまで右方にフィル 5.D1:BC1セルを行数分下方にフィル 6.D列の結果をコピー ⇒ B列に形式を選択して貼り付け ⇒ 値 ※4で右にフィルする列数は、キーワードの数に応じて加減して下さい。 ※1で参照するセルは、4でフィルした最右のセルを指定して下さい。 以上ご参考まで。
お礼
ご丁寧な回答、ありがとうございました。 「重複せずに入力すればいいじゃん」とあきれられても仕方ないかと思いましたが、教えて頂けて感謝しております。 別の方の回答で大変便利なものもありましたが、 こちらの意見も大変参考になりました。 ありがとうございました。
- maron--5
- ベストアンサー率36% (321/877)
◆キーワードが10個まで可能な式です ★A1に「日本、静岡県、富士山、山、風景、自然、屋外、山、日本」が入力されているものとします C1=TRIM(MID(SUBSTITUTE($A1&"、","、",REPT(" ",40)),40*COLUMN(A1)-39,40))&" " D1=IF(COUNTIF($C$1:C1,TRIM(MID(SUBSTITUTE($A1&"、","、",REPT(" ",40)),40*COLUMN(B1)-39,40))&" ")>0,"",TRIM(MID(SUBSTITUTE($A1&"、","、",REPT(" ",40)),40*COLUMN(B1)-39,40))&" ") ★D1の式を右にL1までコピー B1=SUBSTITUTE(TRIM(CONCATENATE(C1,D1,E1,F1,G1,H1,I1,J1,K1,L1))," ","、") ★B1をコピーして、「形式を選択して貼り付け」で「値」にチェックして、OK ★これで、「日本、静岡県、富士山、山、風景、自然、屋外」になります ★なお、1セルに入力されている、キーワード数が10個より多ければ、これに式を対応するように修正してください ★不要な、C1:L1を削除します
お礼
ご丁寧な回答、ありがとうございました。 「重複せずに入力すればいいじゃん」とあきれられても仕方ないかと思いましたが、教えて頂けて感謝しております。 別の方の回答で大変便利なものもありましたが、 こちらの意見も大変参考になりました。 ありがとうございました。
- Cupper
- ベストアンサー率32% (2123/6444)
replace関数で重複した文字を削除することは可能です しかし、重複した文字を見つけるのはチョット面倒ですので使いません 数が少ないのであれば、一つずつ修正されることをお奨めします 数が多くて(1000以上あるとか)とても一つずつ修正は無理というのであれば、次の操作でも可能です 結構手間が掛かりますから、本当に数が多いときにしかお奨めしません 「区切り位置」で "、" を区切り文字として複数の列に分解してはいかがでしょう □ A1セルに入力された文字列を複数の列に分ける方法 A1セルを選択する(A列にキーワードが入力されているならA列を選択してもOK) データ → 区切り位置 「カンマやタブなどのい区切り文字によってフィールドごとに区切られたデータ」を選び「次へ」 区切り文字の「その他」を選び入力欄に "、" を入力して「完了」 <注意>分解された数だけ右の列に文字が強制的に上書きされますから、十分な空きセルを確保しておきましょう そして、関数では入力されている文字を操作することはできませんから 重複したセルの内容を直接消すことはせず、別のセルに結果を返すような関数を組みます 同じ内容のセルがあるかを判定する場合、COUNTIF関数が良く使われます □関数で重複文字(セル)を見つける方法 A2セルに次の関数を入力してみてください =COUNTIF($A1:A1,A1) そして、A2セルを分解された文字のある列までコピーします (例:A2~J2) 2行目には1行目が重複している場合、2以上の数値が入ります □重複した文字列(セル)を空白に置き換える 続いて、A3セルに =IF(A2>1,"",A1) と入力して、A3セルを分解された文字のある列までコピーします (例:A3~J3) 3行目には2行目に "1" の数値がある場合のみ1行目の文字列が入ります □文字列を結合する A4セルか 2行目、3行目の右端のセルに =A2&"、"&B2&"、"&C2&"、"&D2&"、"&E2&"、"&F2&"、"&G2&"、"&H2&"、"&I2&"、"&J2 と入力 この場合、重複した文字がある場所には "、" が余分に入りますが気にしてはいけません 次の段階で処理します □余分に入った "、" を削除する 全ての重複した文字を削除したいセルを処理し終えたら、 最後にこの "、" が二つ以上になっているものを一つだけに置き換えます 編集 → 置換 検索文字に "、、" 置換文字に ""(何も指定しない) そして、「すべて置換」 3つ以上 "、" が繋がってしまっている場合もありますので、複数回繰り返してください 右端に "、" が一つだけ残ってしまうことがありますが、これも気にしてはいけません 次の段階で消します □右端の不要な "、" を見つけて削除する あとのことを考え、A列の右側に列を2列挿入しておきます C4セルに結合した文字列があるとします 挿入された列の B4セルに次の関数を入力します =IF(RIGHT(C4,1)="、",LEFT(C4,LEN(C4)-1),C4) これで右端に付いた "、" を削除できます □関数を消して結果だけを残す 最後に関数を消して、文字列だけを残してみます B4セルをコピーしてA1セルを選択します 編集 → 形式を指定して貼り付け 「値」 を選択して 「OK」 これで、今まで入力した関数などは不要になりました 不要な列(例では B~L)を列単位で削除してしまってください 何を行っているのかをよく理解してから関数や編集操作を行ってください 間違って操作をするとレイアウトが大きく崩れてしまうことがあります ブックをコピーして、コピーした方を直すようにすると良いです
お礼
ご丁寧な回答、ありがとうございました。 「重複せずに入力すればいいじゃん」とあきれられても仕方ないかと思いましたが、教えて頂けて感謝しております。 別の方の回答で大変便利なものもありましたが、 こちらの意見も大変参考になりました。 ありがとうございました。
お礼
ありがとうございました。 何が行われているかは全く理解できていないのですが、、、 見事解決しました。 本当にありがとうございました。