- ベストアンサー
エクセルでお互いの文字列の中で一番長い同じ文字列を取得する方法
- エクセルでお互いの文字列の中で一番長い同じ文字列を取得する方法について説明します。
- セル内に20~40文字程度の文字列があり、それらの中で一番長い同じ文字列を求める方法を紹介します。
- また、同じ文字列を持つセルを強調表示する方法についても説明します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
下記と類似の課題でしょうか。 http://okwave.jp/qa/q7043174.html ちょっとアレンジして、検査対象の文字列がA1からA列にあるとして、B,Cに重複部分のある文字列の組(重複部分は赤色にします)、D列に重複文字列の長さを表示します。ご参考まで。 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 = 2 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 Cells(counter, 4).Value = Len(hitStr) 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
その他の回答 (4)
- CC_T
- ベストアンサー率47% (1038/2202)
マクロ組んで総当たりで判定するしかないいでしょうね。 n文字の並びから2つ以上の連続した文字列を取り出すと、(n+1)*n/2-n通りの候補が出ますね。 40文字だと780通り? それを各セルの文字列と比較するのは処理が膨大だよなぁ・・・。 重複判定は排除したいし、作業セルを使った方が確実かな? となるとマクロを使って・・・ (1)まずは各セルの文字列を分解して、作業用セルに入れていく。 Do 最初のセルから最後のセルまで、以下を実施 セルの文字列の長さLを求める Bを2からLまで変化させながら、以下を実施 ’B:抜き出す文字列の長さ Cを1からL-Bまでを変化させながら、以下を実施、 ’C:抜き出す文字列の先頭からの位置 セルの文字列のC番目の文字からB文字分を抜出し、作業用セルに入れる。 作業用セル行=作業用セル行+1 (次を入れる準備) Next C Next B LOOP ・・・これで作業行に2文字から始まってずらずら~っと文字列が並ぶことになる。 (2)セルの並べ替えを行う 作業行の文字列を、「重複文字列」で並べ替える。 …これで先頭文字の順にすべての文字列候補が並ぶ。 (3)重複しているものをカウントして、「重複文字列」と「重複数カウント」を別セルに記入していく D=「重複文字列」の入った最終行 Do 最初のセル+1行になるまで、以下を実施 If Cells(d,x)=Cells(d-1,x) then ’今見ている文字列が一つ上の文字列と一致したら Cells(d-1,x+1)=Cells(d-1,x+1)+1 ’重複数としてカウントアップ。 Delete(Rows(D)) ’いらなくなった行を消す End If D=D-+1 Loop ・・・これで、重複のあった文字列はその右側に「重複数カウント」が書き込まれますね。 (4)「重複文字列」と「重複数カウント」を「重複数カウント」で並べ替える。 ・・・これで一番カウント数が一番大きかった「重複文字列」が、求める最長重複文字列というわけ。 行数が多いと処理に数分かかるでしょうが、セルの行数が続く限り頑張ってくれるでしょう。 Excel2003なら65,000行あったはずですから、50文字の並び52行分は処理できるってことか(^^; あとはその最長重複文字列を元データの文字列にあたって、該当するセルの色を変えるなり、 MsgBoxで表示するなり、好きに処理すればいいでしょう。 勿論上に書いた(1)~(4)はマクロで処理する流れを書いてあるだけで、このままマクロとして動きませんので。 念のため。
- chonami
- ベストアンサー率43% (448/1036)
>例の場合で言えば"aabb""abba"が一番長い同調文字列になるので この意味がちょっとよくわかりません。 もう少し具体的に説明できますか? あと、そのルールは機械的に判別できることなのでしょうか。 文字の切れ目とか。
》 例の場合で言えば"aabb""abba"が一番長い同調文字列になるので・・・ その説明が全く理解できません。「"aabb""abba"」は「例」の中に存在しないしぃ~ 「同調文字列」という言葉も「何のこと?」です。貴方の造語ですか?
補足
ここは回答を書き込む場所だ。 回答できないなら回答を書き込むな。 既成に存在する言語でないとしても文字面を見て発言者の意図を汲み取れないバ〇は他人に回答してる時間を国語の勉強にまわしてろ。
- meg68k
- ベストアンサー率33% (1133/3386)
おはようございます。 文字列の文字数を取り出すLEN関数とかじゃダメでしょうか。 半角、全角を区別するならLENB、区別しないならLENで文字数が出せ ると思います。 あとは一番大きい数字を求めれば良いと思います(数値の順位を求め るRANK関数で求め、if文で1位のものは表示を変えるとか)
補足
すいません「一番長い文字列」ではなくて「一番長い"重複する"文字列」を探し出したいのです。
補足
質問文以上に具体的に説明するのは些か難しいのですが、 まず、例の五つの文字列は全て異なる文字列ですよね。 その中で三番目の「aaabb」と四番目の「aabba」には両方とも「aabb」という文字が含まれています。 また、四番目の「aabba」と六番目の「abbaa」には「abba」という文字が含まれています。 ですが五文字以上の同じ文字列というのは例の中には見当たらないので、 この二つの四文字の文字列が「複数のセルに存在する最長の文字列」となります。 それを探しあてるやり方を考えています。 これでも解りづらければまたお知らせ下さい。 これ以上ウマい説明は難しいですが。。。