- ベストアンサー
EXCEL 文字列比較
EXCELを使ってA1とA2文字列を比較してA3にA1とA2で同じ文字はそのまま出力して間違っている文字の部分だけXに置き換えて出力することは可能ですか? 例) A1 ABCDEFG 比較セル A2 ABDCEFG 比較セル A3 ABXXEFG 比較したものを出力するセル
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
public function TextGroupCompare(byval a1 as variant, a2 as variant) as string dim i as long, j as long dim res() as variant dim res1 as variant, res2 as variant res1 = split(a1, " ") res2 = split(a2, " ") on error goto errhandle redim res(application.max(ubound(res1), ubound(res2))) for i = 0 to application.min(ubound(res1), ubound(res2)) res(i) = iif(res1(i) = res2(i), res1(i), string(application.max(len(res1(i)), len(res2(i))), "X")) next i for j = i to ubound(res) if ubound(res1) > ubound(res2) then res(j) = string(len(res1(j)), "X") else res(j) = string(len(res2(j)), "X") end if next j textgroupcompare = join(res, " ") errhandle: end function #スペースで区切られたグループ数、グループごとの要素の文字数が異なっていても処理します。が、それに伴い例えばスペースが2つ続いたみたいなのも厳密に処理します。 >もしかしてこんな感じにも出来ますでしょうか まぁ「ついでに聞いちゃえ」と思いついてかるーい気持ちで書き込んじゃうヒトは実際大勢いるんですが、そーいうのは新しいご相談として新たに投稿し直して下さい。元のご相談内容が「解決しない」ので状況を補足するのは構いませんが、「ついで」で新しい内容を質問されても、付き合わされる方は迷惑に感じていることに気が付いてください。て指摘すると、とたんにムクレてぷいっといなくなっちゃう人も多いんで、気が付いてねって指摘の仕方にまで気を遣うんですけどね。
その他の回答 (4)
- Nebusoku3
- ベストアンサー率38% (1466/3827)
A1 ABCDEFG 比較セル A2 ABDCEFG 比較セル A3 ABXXEFG 比較したものを出力するセル と言う事で A3に関数で少し長いかもしれないですが作ってみました。 A3 =IF((A1=A2),A1,IF(MID(A1,1,1)=MID(A2,1,1),MID(A1,1,1),"X")&IF(MID(A1,2,1)=MID(A2,2,1),MID(A1,2,1),"X")&IF(MID(A1,3,1)=MID(A2,3,1),MID(A1,3,1),"X")&IF(MID(A1,4,1)=MID(A2,4,1),MID(A1,4,1),"X")&IF(MID(A1,5,1)=MID(A2,5,1),MID(A1,5,1),"X")&IF(MID(A1,6,1)=MID(A2,6,1),MID(A1,6,1),"X")&IF(MID(A1,7,1)=MID(A2,7,1),MID(A1,7,1),"X")) もっと式を簡単に出来るかもしれないですが直接的でわかりやすいでしょう。 = 以下をコピーして A3 に入れてみてください。 8桁ある場合は &IF(MID(A1,8,1)=MID(A2,8,1),MID(A1,8,1),"X") を 最後の )) の間にコピーしてあげれば動きます。
お礼
新しく解答有難うございます。 keithinさんの言うとおり新規で質問するべきでした。 申し訳ありません。 せっかく作っていただきましたので、ぜひ使用させていただきます。 質問にお付き合いしていただきありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
No.1です。 続けて横からお邪魔します。 No.2さんの補足を拝見させていただいて・・・ 今回もユーザー定義関数ではなく、単なるマクロになります。 A1・A2セルは半角スペースで区切られた文字が一塊だとして、 両セルとも同じ塊数、一塊の文字数は同じだという前提です。 Sub Sample2() Dim k As Long, cnt As Long, str As String, myArray1, myArray2 myArray1 = Split(Range("A1"), " ") myArray2 = Split(Range("A2"), " ") Range("A3").ClearContents For k = 0 To UBound(myArray1) If myArray1(k) = myArray2(k) Then str = str & myArray1(k) & " " Else str = str & WorksheetFunction.Rept("X", Len(myArray1(k))) & " " End If Next k Range("A3") = Trim(str) End Sub ※ あくまで参考程度で・・・m(_ _)m
お礼
返信有難うございます! わざわざ有り難うございます。 無事出来ました^^ これで作業効率が上がります。
- keithin
- ベストアンサー率66% (5278/7941)
ふつーの関数では勿論そういう事ができるのは無いので、次の通りにするとさくっと出来ます。 手順: ALT+F11を押す 現れた画面で挿入メニューから標準モジュールを挿入する 現れたシートに下記をコピー貼り付ける public function TextCompare(byval a1 as variant, a2 as variant) as string dim i as long for i = 1 to application.max(len(a1), len(a2)) textcompare = textcompare & iif(mid(a1,i,1) = mid(a2, i, 1), mid(a1, i, 1), "X") next i end function ファイルメニューから終了してエクセルに戻る A3セルに関数として =textcompare(A1,A2) と記入して計算させる。
補足
うおーすごい! ありがとうございます! これでもとても満足なのですが もしかしてこんな感じにも出来ますでしょうか A1 ABAB CD EF GHJG 比較セル A2 ABAB GD EF GHJG 比較セル A3 ABAB XX EF GHJG 比較したものを出力するセル このようにペアーにしてペアーの中の文字が1つでも違った場合でもペアーごとXにすることも可能ですか?
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! A1セルとA2セルの文字数は一緒だという前提になりますが・・・ VBAでの一例です。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペースト → Excel画面に戻りマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim k As Long With Range("A3") .ClearContents For k = 1 To Len(Range("A1")) If Mid(Range("A1"), k, 1) = Mid(Range("A2"), k, 1) Then .Value = .Value & Mid(Range("A1"), k, 1) Else .Value = .Value & "X" End If Next k End With End Sub 'この行まで ※ 関数でないので、データ変更があるたびにマクロを実行する必要があります。m(_ _)m
お礼
丁寧な解答有難うございます! tomさんは最初からセルの番号をコードに打つタイプですね^^ こちらも参考にさせていただきます!!
お礼
返信ありがとうございます。 わざわざ関数にしていただきありがとうございます。 >>まぁ「ついでに聞いちゃえ」と思いついてかるーい気持ちで書き込んじゃうヒトは実際大勢いるんですが、そーいうのは新しいご相談として新たに投稿し直して下さい。元のご相談内容が「解決しない」ので状況を補足するのは構いませんが、「ついで」で新しい内容を質問されても、付き合わされる方は迷惑に感じていることに気が付いてください。て指摘すると、とたんにムクレてぷいっといなくなっちゃう人も多いんで、気が付いてねって指摘の仕方にまで気を遣うんですけどね。 確かにその通りです。 以後気をつけます。