• 締切済み

エクセルの指定部分数を超える重複チェックについて

エクセルの指定部分数を超える重複チェックについて 例えばA列に以下の文章があったとします。 1.吾輩は猫である。名前はまだない。 2.吾輩は猫である。名前はもうある。 3.吾輩は犬である。名前はまだない。 4.吾輩は犬でない。名前はもうある。 5.本当に吾輩は猫である。名前はまだないかもしれない。 この中から、10文字以上【連続して】重複している箇所を探したい場合どうすれば良いでしょうか? 1~4で上記の条件に当てはまるのは 1と2の「吾輩は猫である。名前は」と、1と3の「である。名前はまだない。」と、1と5の「吾輩は猫である。名前はまだない」です。 2と4の「。名前はもうある。」も重複していますが、指定の文字数に達していないのでスルーさせたいです。 重複が見つかった場合の表示方法についてですが、重複している箇所がわかればどういう形で表示されても構いません。 ただ「重複の削除」のように、何が重複していたのかわからないまま削除されてしまうのは困ります。

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

徒然なるままにやってみました。testの方を実行して下さい。 B,C列に10文字以上の連続した重複がある文字列を表示し、該当箇所の文字に着色します。 お示しの例でしか試験してありませんので、安定動作の程は不明です。ご参考まで。 Sub test() Dim targetRange As Range Dim i As Long, j As Long, k As Long, l As Long, counter As Long Dim searchWord As String, buf As String, shortStr As String, hitStr As String Dim longStr As String Const myColorIndex As Long = 3 Columns("B:C").Font.ColorIndex = 0 Columns("B:C").ClearContents Set targetRange = Range(Range("A1"), Range("A" & Rows.Count).End(xlUp)) counter = 1 For i = 1 To targetRange.Cells.Count For j = i + 1 To targetRange.Cells.Count If Len(targetRange.Cells(i)) <= Len(targetRange.Cells(j)) Then shortStr = targetRange.Cells(i) longStr = targetRange.Cells(j) Else shortStr = targetRange.Cells(j) longStr = targetRange.Cells(i) End If hitStr = "" For k = 10 To Len(shortStr) For l = 1 To Len(shortStr) - k + 1 searchWord = Mid(shortStr, l, k) buf = Replace(longStr, searchWord, "") If Len(buf) < Len(longStr) Then hitStr = searchWord Exit For End If Next l Next k If hitStr <> "" Then Cells(counter, 2).Value = targetRange.Cells(i).Value Cells(counter, 3).Value = targetRange.Cells(j).Value test2 Cells(counter, 2), hitStr, myColorIndex test2 Cells(counter, 3), hitStr, myColorIndex counter = counter + 1 End If Next j Next i End Sub Private Sub test2(myRange As Range, targetString As String, myColorIndex As Long) Dim startPos As Long startPos = InStr(myRange.Value, targetString) With myRange.Characters(Start:=startPos, Length:=Len(targetString)).Font .ColorIndex = myColorIndex End With End Sub

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 今仮に、下の添付画像の様に、Sheet1のB列の2行目以下に元となる文章が入力されていて、C1から右方向に向かって番号が振られていて、例えば、C3セルには1番の文章と2番の文章で、重複している箇所が表示される様にするものとします。  又、2つの文章の間に、10文字以上重複する箇所が、複数箇所存在する事は無いものとします。 【使用するExcelのバージョンがExcel2007以降の場合】(Sheet2は使用しません)  まず、C2セルに次の数式を入力して下さい。 =IF(OR($B2="",OFFSET($B$1,COLUMNS($C:C),)="",ROWS($1:1)=COLUMNS($C:C)),"",MID($B2,LEN($B2)-INT(LOG(SUMPRODUCT(2^(LEN($B2)*ISNUMBER(FIND(MID($B2,ROW(INDIRECT("Z1:Z"&LEN($B2)-9)),10),OFFSET($B$1,COLUMNS($C:C),)))-ROW(INDIRECT("Z1:Z"&LEN($B2)-9)))),2)),SUMPRODUCT(ISNUMBER(FIND(MID($B2,ROW(INDIRECT("Z1:Z"&LEN($B2)-9)),10),OFFSET($B$1,COLUMNS($C:C),)))*1)+9))  そして、C2セルをコピーして、重複箇所を表示させる全てのセル(セル範囲)に貼り付けて下さい。 【使用するExcelのバージョンがExcel2007よりも前のバージョンの場合】  適当な空きシート(ここでは仮にSheet2とします)を作業用Sheet都市使用します。  まず、Sheet2のA2セルに次の数式を入力して下さい。 =IF(OR(Sheet1!$B2="",OFFSET(Sheet1!$B$1,COLUMNS($A:A),)="",ROWS($1:1)=COLUMNS($A$1:A1)),"",SUMPRODUCT(2^(LEN(Sheet1!$B2)*ISNUMBER(FIND(MID(Sheet1!$B2,ROW(INDIRECT("Z1:Z"&LEN(Sheet1!$B2)-9)),10),OFFSET(Sheet1!$B$1,COLUMNS($A:A),)))-ROW(INDIRECT("Z1:Z"&LEN(Sheet1!$B2)-9)))))  次に、Sheet2のA2セルをコピーして、例えば、元の文章が6個ある場合には、Sheet2のA2が左上の隅となっている縦6行×横6列を上回るのに充分なセル範囲に貼り付けて下さい。  次に、Sheet1のC2セルに次の数式を入力して下さい。 =MID($B2,LEN($B2)-IF(OR(Sheet2!A2="",OFFSET($B$1,COLUMNS($C:C),)=""),-1,INT(LOG(Sheet2!A2,2))),SUMPRODUCT(ISNUMBER(FIND(MID($B2,ROW(INDIRECT("Z1:Z"&LEN($B2)-9)),10),OFFSET($B$1,COLUMNS($C:C),)))*1)+9)  次に、Sheet1のC2セルをコピーして、重複箇所を表示させる全てのセル(セル範囲)に貼り付けて下さい。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です! たびたびごめんなさい。 前回はコードが間違っていました。(キーの打ち間違い及び、コード不足です) もう一度コードを載せてみます。 Sub test2() 'この行から Dim i, j, k, vl As Long Dim str As String Application.ScreenUpdating = False For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row For j = 1 To Len(Cells(i, 1)) - 9 For k = 10 To Len(Cells(i, 1)) str = Mid(Cells(i, 1), j, k) If WorksheetFunction.CountIf(Columns(3), str) = 0 Then With Cells(Rows.Count, 3).End(xlUp).Offset(1) .Value = str .Offset(, 1) = Len(str) End With End If Next k Next j Next i k = Cells(Rows.Count, 3).End(xlUp).Row Range(Cells(2, 3), Cells(k, 5)).Sort key1:=Cells(1, 4), order1:=xlDescending For j = 2 To Cells(Rows.Count, 3).End(xlUp).Row For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) Like "*" & Cells(j, 3) & "*" Then vl = vl + 1 End If Next i If vl > 1 Then Cells(Rows.Count, 2).End(xlUp).Offset(1) = Cells(j, 3) End If vl = 0 Next j For j = Cells(Rows.Count, 2).End(xlUp).Row To 3 Step -1 For i = 2 To j - 1 If Cells(i, 2) Like "*" & Cells(j, 2) & "*" Then Cells(j, 2).Delete (xlUp) End If Next i Next j Application.ScreenUpdating = True Columns("C:D").Delete Columns(2).AutoFit End Sub 'この行まで ※ いろいろなパターンでの検証をしていませんので、 希望通りにならなかったらごめんなさいね。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! ご希望の方法かどうかわかりませんが・・・ VBAの一例です。 A列の1行目から文字データが入っているとします。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, j, k, vl As Long Dim str As String Application.ScreenUpdating = False For j = 1 To Len(Cells(1, 1)) - 9 For k = 10 To Len(Cells(1, 1)) str = Mid(Cells(1, 1), j, k) If WorksheetFunction.CountIf(Columns(3), str) = 0 Then With Cells(Rows.Count, 3).End(xlUp).Offset(1) .Value = str .Offset(, 1) = Len(str) End With End If Next k Next j k = Cells(Rows.Count, 3).End(xlUp).Row Range(Cells(2, 3), Cells(k, 5)).Sort key1:=Cells(1, 4), order1:=xlDescending For j = 2 To Cells(Rows.Count, 3).End(xlUp).Row For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) Like "*" & Cells(j, 3) & "*" Then vl = vl + 1 End If Next i If vl > 1 Then Cells(Rows.Count, 2).End(xlUp).Offset(1) = Cells(j, 3) End If vl = 0 Next j For j = Cells(Rows.Count, 2).End(xlUp).Row To 3 Step -1 For i = 2 To j - 1 If Cells(i, 2) Like "*" & Cells(j, 2) & "*" Then Cells(j, 2).Delete (xlUp) End If Next i Next j Application.ScreenUpdating = True Columns("C:D").Delete Columns(2).AutoFit End Sub 'この行まで ※ これでB列10文字以上で重複する語句が表示されると思います。m(_ _)m

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

重複とは定義すると何?10字以上という条件は別にして。10字以上という条件は共通の文字列が見つかってから、10文字未満は捨てれば良いだけの話でしょう。 珍しい質問とおもうが、難しそうだ。関数でなど考えているのかな。VBAで無いと出来ないのでは。VBAや他言語の経験あるのかな。 ーー 10字以上という条件は別にして 1と2の「吾輩は」の部分を例として書いてないのはどうして? ーーー 2つの文字列があり、両者で共通する文字列を探し出すアルゴリズムは難しいのでは。 質問者はどう考えているのかな。人間の直感を重きを置いて考えてはダメでしょう。 ーー そういうことなら、2,3日に適当な回答が無ければ、このカテゴリではなく、数学や論理・情報(科学)に強い人が見るカテゴリに質問したら。 ーー BM法と言うのを思い出したが、一方の文字列は人間が意味のある語句などを選ぶ場合ではないかと思うので 両方ともぶっつけて共通部分を見つけるのは難しそうだ。 ーー 2つの文字列の最長共通部分列(Longest Common Subsequence; LCS)を計算して出力する、なんていうのも在るが。 本質問では最長のものだけではないようだ。 ベクタターにもソフトが提供されているようだ http://www.vector.co.jp/soft/winnt/util/se477688.html Googleで「2つの文字列 共通する部分を見つける」で照会するとアルゴリズムは沢山解説記事があるようだ。

関連するQ&A

  • Excel ユニーク数1のものだけを数えたい

    Excelに関しての質問です。 例えばA列に「犬」「ねこ」「うさぎ」という文字列がそれぞれ複数散らばっているとして、B列には「犬A」、「犬B」、「犬C」… 、「ねこA」、「ねこB」…というように文字列がそれぞれ複数入っているとします。(アルファベットはA以降、どこまで入っているかわからないとします)(A列とB列の動物の種類はそれぞれ一致するものとします。) C列で、B列のユニーク数をカウントものを出します。 →ここからが本題なのですが、A列の動物に対して、B列の「ABC...」の数はいくつかを出したい(=D列)のですが、関数はどのようになりますか? ユニーク数が「1」であるものの数を数えればいいと思うのですが、式を教えていただきたいです。

  • エクセル2007の[重複の削除]をエクセル2003でしたいです。

    列データーが10ほどあり、ある特定の列が2つや3つを条件に重複してる場合は削除をしたいです。 できればチェックボックスのようなものがあって、毎回違った特定列を条件にしたいです。 列データは減らせません。 マクロでやり方が解ればくめるかと思ったのですが特定の列を指定して、重複を探し削除するという方法が思いつきません。 エクセル2007の[重複の削除]という機能できるようですが、エクセル2003などで実現する方法はないでしょうか?

  • エクセルでこんなことできますか?

    あいまいな質問タイトルでごめんなさい。 つまりこういうことなんです。データが次のように入っています。 <問い>   A列(名前)   B列(種類)           ポチ       犬             タマ       猫        シロ       猫        ジョン      犬        …        …   となっていて、 (1)種類が犬ならばC列にその犬の名前を表示し、猫ならばD 列にその猫の名前を表示する。    つまり、こんな感じ…。    C列(犬)     D列(猫)     ポチ                   タマ                   シロ           ジョン          ……      …… このように種類によって名前分けってできますか? (2)もしくは、種類が犬の場合には、その該当するA列の名 前のセル(または文字)を赤色などで見やすくする。  つまり、<問い>ではA列のポチ、ジョンのセル(または文字)が赤く表示されるようにしたいわけです。 私はエクセル初心者なので、何となくIF関数かな?と思い、調べては見るものの うまくいきません。 どちらかだけでもいいので、どなたか教えてください。お願いします。    

  • エクセルの重複

    すいませんが人から引き継いだデータで重複があって それを削除したいんですがやり方を教えてください。 A  B  C   1 100 200  重複 2 11  10 3 15  22 4 200 13  重複 5 200  3  重複 6 200 100 重複 と言った感じでC列に重複してると表示させたいのですが・・ 何か良い方法はあるでしょうか? A列もB列も並び替えができない状態になってます。

  • 【エクセル】データの重複チェック

    次のようなデータが入力されているとします。 A列/B列/C列/D列/E列/F列 1行:都道府県/市区町村/data1/check1/data2/check2 2行:東京/新宿/1/""/1/"" 3行:東京/新宿/2/""/2/"重複" 4行:東京/新宿/3/""/3/"" 5行:東京/渋谷/1/重複/4/"" 6行:東京/渋谷/2/""/5/"" 7行:東京/渋谷/3/""/6/"" 8行:東京/渋谷/4/""/2/"重複" 9行:東京/渋谷/1/重複/7/"" ここで、check1は、 「都道府県」のグループでdata1に重複があれば、「重複」表示をさせます。 また、check2は、 「市区町村」のグループでdata2に重複があれば、「重複」表示をさせます。 例えば、 セルD2=IF(COUNTIF($C$2:$C$4,$C$2:$C$4)>1,"重複","") セルF2=IF(COUNTIF($E$2:$E$9,$E$2:$E$9)>1,"重複","") というように関数を入力して、2行目以下にコピペすればいいのですが、 実際は1万行以上のデータがあり、「都道府県」「市区町村」も多くのグループがあるため いちいち範囲を指定するのも大変です。 そこで、上記関数のように手動で範囲を指定しなくても、 自動で範囲指定をして重複チェックができる良い方法があれば教えてください。 できれば関数がいいのですが、VBAでも構いません。 ご教授のほど、よろしくお願いします。

  • Excelで重複チェックの方法

    重複データのチェックについて教えてください。 シート1にA支店の顧客データ、シート2にB支店の顧客データがあります。シートの構成は、A列に名前、B列に電話番号があります。 これで、A支店に顧客登録されていて、同じくB支店にも登録されている人を選び出し、支店間で同一人物を登録しないようにしたいのですが、どのようにしたら良いでしょうか。 私が考えるにはA列の名前でVLOOKUPを使えばいいと思うのですが、これだと同姓同名のダブりチェックが出来ないですね。名前が同じなら電話番号で比較しようと思うのですが、良く分かりません。 シート1のA支店を基準にしてシート2のB支店と比較し、重複していれば仮にC列に「重複」と表示させる。 ・・・としたいのですが、どなたか教えてください。

  • エクセルの重複データ、必要数を指定して絞る

    エクセルの重複データ、必要数を指定して絞ることは可能ですか。 エクセル2010です。 マクロはよくわからないので、マクロを組まねばならないようでしたらあきらめます。 たとえばある列に (別の列もデータがあります。 この列を基点にしぼるイメージです) りんご りんご りんご りんご りんご りんご りんご りんご バナナ バナナ バナナ バナナ バナナ バナナ みかん みかん みかん みかん みかん みかん みかん みかん みかん みかん と、個数がランダムで同データがあるような場合に りんご りんご りんご りんご りんご バナナ バナナ バナナ バナナ バナナ みかん みかん みかん みかん みかん と5個に絞るということです。 「重複するレコードは無視する」としたときに1つにしぼられますが、 1つでなく、5つに絞るようなイメージです。 そのような指定がなんらかで可能でしょうか。 テキストフィルターをうまく使えばできたりするでしょうか。 よろしくお願い致します。

  • 「エクセル」で重複したデータだけを呼び出したい。

    「Excel2000」を使用しています。 「重複しているデータだけ抽出する」 ということは出来るでしょうか? たとえば「A列」に名前が入っていて、 「B列」に住所、「C列」に電話番号が 入っているとします。 重複した名前だけを呼び出して、 なおかつ「B列」「C列」の データも表示させたいのですが…。

  • 条件指定と重複チェック後のカウント

    MySQLを最近触り始めたばっかりで 頭を抱えています どなたか知恵を貸してくれませんでしょうか; ID |code|process 100|A |a001 100|A |a001 100|A |a002 100|B |a003 200|C |a004 *ID単位のAに対するprocess数を表示したい *重複processは1とカウント ID |process数 100|2 200|0 最終的に上記のように表示させたいのですが 方法が分かりません。。。 whereで A を条件指定にすると code Aを持たないID 200が表示されなくなるので whereを使用することもできず・・・ 条件指定と重複チェック後のカウントが出来る方法はありませんでしょうか?

    • ベストアンサー
    • MySQL
  • 【Excel】 重複内容をチェックしたい。

    こんにちは A列に値を入れますが、A列に同一の値が入力された場合 そのセル(重複しているお互いの)文字を赤で表示することは 可能でしょうか。 条件付き書式で出来ますか? Excel2003です。 よろしくお願いいたします。

専門家に質問してみよう