ExcelVBAの初心者です。Excel2000をWindowsXP(SP2)上で利用しています。Excelの別々のセルに入っているテキストデータを比較して、重複部分を取り出すVBAを作ろうと考えていますが、適当なアルゴリズムが思い浮かびません。

テキストデータから文字毎の出現頻度を求め、1回のみしか出現しない文字を見つけ出し、それらを用いた正規表現から重複文字列を見つけ出すことを考えましたが、結構大変な作業になりそうです。何か良いアイデアやアドバイスがあれば教えて下さい。また、参考になるサイト等があれば教えて下さい。

回答の条件
  • 1人5回まで
  • 登録:2007/06/10 16:30:19
  • 終了:2007/06/17 16:35:03

回答(1件)

id:rikuzai No.1

りくっち回答回数1366ベストアンサー獲得回数1412007/06/11 16:26:11

ポイント60pt

http://www.moug.net/tech/exvba/0140001.htm

http://www.morgan.co.jp/kiso/6excel-0.htm

http://makotowatana.ld.infoseek.co.jp/vba4.html#search


とりあえずですが文字操作関係のサンプルコードのページをはっておきます。



ただ、コメントを拝見した感じでは、修正処理の内容によっては、

変更履歴の取得

http://office.microsoft.com/ja-jp/excel/HP052300641041.aspx

や、Wordの変更履歴

変更箇所を[変更履歴]機能を使って表示する - Word 一般機能 モーグ即効テクニック集

を使用することで解決するような気がします。


以上ご参考まで。

id:okehara

ご回答ありがとうございます。ご指摘のようなWordの変更箇所表示機能をExcelで実現したいと考えています。

2007/06/12 00:28:51
  • id:taisin0212
    okehara様、質問です。
    『重複部分』は、1文字でも対象になりますか?

    例)
    セルA1: taisin0212
    セルA2: okehara
    セルA3: hatena
    とある場合、2文字以上であれば、
    セルA2,A3間で、[ha]が重複部分になります。
    1文字だと、[a],[e],[h],[t]が対象のようです。
  • id:taknt
    もうちょっと仕様を煮詰めたらいいですよ。

    たとえば、重複箇所が 複数ある場合は どうするのか?など。

    abcdefcbca


    abcbca
    とあった場合、どれが 重複なのか などです。
  • id:okehara
    ご指摘のとおりですね。基本的には文字の並びも含めて同一の場合にのみ重複と考えています。したがって、abcdのみが重複部分です。また、abxxcdyyの場合もab、cdは重複と考えます。
    仕様をきちんと考えなければと考えますが、何か参考になるプログラムとかサイトとかがあればと考えて質問いたしました。
  • id:okehara
    taisin0212様のご質問への回答です。
    比較セルは2つです。重複は1文字も対象に含みます。順序も考慮します。初回の重複のみを考えます。したがって、A2とA3の場合には、ha,
    aとなりA1とA2の場合にはaのみで、A1とA3の場合にはa,nです。仕様の詳細が詰まっていませんでした。すみません。
  • id:taknt
    abcdefcbca

    abcbca

    の場合、重複する箇所は

    abc
    cbca
    となります。

    ただし 3文字目のcは 2つかかりますので
    最初のみ重複とするならば 後ろの cbcaは、
    重複とは なりません。
    これで いいのでしょうか?
  • id:taisin0212
    > okehara様
    上記の例:
    abcdefcbca と
    abcbca とでは、

    cbca, abc,
    bca, ab, bc, cb, ca, a, b, c
    が重複する文字列ともとれるような気がするのですが?
    (回答群の中で、語句が重複しているのを承知の上で
     このコメントを書いておりますことご了承ください)

  • id:okehara
    tanknt、taishin0212さんへ
    例示の場合には、重複箇所はab,cbcaあるいはabc,bcaと考えます。やりたいことを明示した方が分かりやすいと思いますので、説明します。
    2つのセルに入ったテキストは、修正前と修正後のテキストで、修正箇所を明示したいのです。したがって、重複箇所を見つけ出し削除することで、修正箇所が把握でき明示できると考えたわけです。
    例示の場合には、重複部分は上記以外にもなる可能性がありますが、上記のようなことを考えた場合にはab,cbcaあるいはabc,bcaと考える方が適当と考えます。
    しかしながら、細かいことを考えて行くと大変ですね。何かいい方法はないものでしょうか。テキストを適当な文節に区切って文節毎に比較すること簡単ではないかと思います。テキストを文節化する適当な方法はないものでしょうか。
  • id:taisin0212
    度々すいません。
    taisin0212、0212taisinという2つの文字列の場合、
    どのような結果を望まれていますか?
    これだと、重複語句[taisin][0212]の双方を削除することに
    なってしまいそうですが。
  • id:okehara
    修正前が"taisin0212"、修正後が"0212taisin"だとしますと、変更前のテキストを右から順番に比較してゆき、"taisin"が重複文字列と認識し、修正前の"0212"は削除され修正後の"0212"は追加されたと認識します。これにより、0212(追加)taisin0212(削除)等とWordの修正履歴のような表示をExcel上で実現したいのです。仕様を細かく詰めて行かないとダメということですね。
  • id:rikuzai
    質問者さんの求める仕様はWordの変更履歴機能をExcelで、ということなのですが、
    かなり根本的な部分で厳しいものがあるのではと思います。
    WordにしろExcelにしろ、変更箇所の表示という機能が使えるのは変更履歴を記録しているからであって、
    その過程がわからない以上ほぼ必ずといっていいくらい判定不能なケースが出てくると思います。
    例えば↓の例を一つとってみても、移動したのが0212かどうかは結果からはわかりませんから、
    0212(追加)taisin0212(削除)
    だけでなく、taisinを前から後ろに移動したと考えれば
    taisin(削除)0212taisin(追加)
    という結果も考えられるのです。

    つまり、
    >重複箇所を見つけ出し削除することで、修正箇所が把握でき明示できる
    という前提から考え直された方が良いかと思います。
    むしろ仕様を詰めるというより、作業対象や内容を限定することである程度は可能になるかもしれませんが、
    それでも作業内容に対して不要に負荷のかかるVBになるように思います。

    それでもどうしてもということであれば、
    変更履歴の出力結果を元にWord風に表示するマクロを考えられた方が現実的かもしれません。
  • id:okehara
    ご指摘の通りです。ただ、Wordの中の「文書の比較」の機能をExcel上で実現したいと考えた訳です。それにしても、このような機能は誰かが作成されていませんでしょうか。もし情報をお持ちでしたら教えて下さい。
  • id:taknt
    http://www.vector.co.jp/soft/win95/util/se113286.html

    テキストにしてDFで比較したらいいですね。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません