• 締切済み

文字列を比較し、相違するフォント色を変える

お世話になります。 環境はWinXPエクセル2003、初心者です。 A列とB列に入っている文字情報を比較して、B列の異なる部分のみフォント色を変えるという設定は、 1.条件付き書式の数式(関数)で可能ですか? 2.もしくは、数式(関数)でC列に異なる部分を抽出できますか? マクロでないと無理という事でしたら、 A列の任意のセルを選択した状態から開始して連続してデータが入っているところまでを範囲としたいです。 過去の質問を検索したところ、 VBAでA1のセルとA2のセル比較で、A2のフォント色が赤くなるという回答は発見出来ました。 http://okwave.jp/qa4040787.html よろしくお願いします。

みんなの回答

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.9

>空白の代わりに、特定の文字を使って判別することは可能なのでしょうか? >例えば、『課』という文字でいかがでしょうか? Split関数を勉強して試してみてください。 思ったように出来ない場合、テストに使ったサンプルデータと、コードを提示し、不具合内容を教えてください。 Split関数で文字列を区切る http://officetanaka.net/excel/vba/tips/tips62.htm

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.8

>回答番号:No.8 この回答への補足 部、課、グループ等の名称は、必ずスペースで区切られていると考えていいのでしょうか? スペース1個で区切られていると好都合なのですが、サンプルでひとつだけスペースが2個並んでいるのがありました。 これは記入ミスでしょうか? 信頼性保証本部  信頼性保証グループ グループリーダー        ~~         ~ とりあえず下記のようなマクロを組んでみました。 B列の文字列から、部、課などの各名称を取り出し、名称ごとにA列に存在するかどうかを判定しています。 名称が存在しない場合、名称全体の文字色を赤に変更するようにしています。 各名称で、異なる部分を判定し、その文字色を変えるのは、私のレベルでは難しいです。 そんなことが出来るかどうか分かりませんが、取り組んでみたいと思います。 Sub test1() Dim c As Range 'Dim db1 As Variant Dim db2 As Variant Dim i As Integer Dim j As Integer For Each c In Range("A1:A10") j = 1 'db1 = Split(Replace(c.Value, " ", " "), " ") db2 = Split(Replace(c.Offset(, 1).Value, " ", " "), " ") For i = 0 To UBound(db2) If InStr(c.Value, db2(i)) = 0 Then With c.Offset(, 1) .Characters(j, Len(db2(i))).Font.ColorIndex = 3 End With End If j = j + Len(db2(i)) + 1 Next i Next c End Sub

wakamoto
質問者

お礼

ありがとうございます。 素晴しいです! スペースは1文字分だけとは限りませんが、事前に<検索と置換>を実施することで統一させる事が出来ると思います。 これで充分に解決でございます。 いつか同様の事で悩む方がいらっしゃるかもしれないと思い、あえて追加の質問をさせていただきます。 もし宜しければお付き合いください。 空白の代わりに、特定の文字を使って判別することは可能なのでしょうか? 例えば、『課』という文字でいかがでしょうか? その他の文字はこちらでアレンジを試みてみます。よろしくお願いします。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.7

返事をいただき、ありがとうございます。 検証テストのため、5件ぐらい、サンプルデータを提示して頂けないでしょうか。 出来るだけ、実情に近い形が望ましいです。都合の悪い部分は、他の文字に置き換えて提示してください。 キーワードとなる文字(部、課、チーム、グループ)は省略しないでください。 余談になりますが、慌てて閉じる必要は全くないと思います。 ただ、wakamotoさんの負担になるようなら、未解決で閉じられても結構だとは思います。 本スレッドに関わった者として、なしのつぶて、という状況が最もストレスが溜まります。

wakamoto
質問者

補足

ありがとうございます。 5つほど架空のサンプルを考えてみました。 本当は会社名も含めてのもっと長い文字列になります。 主にマイナーチェンジが多いのは事業所名、部署名や役職名の部分で、件数が多いと見比べるのも疲れるので、少しでも楽が出来たらと思いました。 しかし、異なる部分に色付けといっても、10文字目に出てきていた文字が12文字目に出てくる場合はどのように判別するか?など、判定の仕方を定義することそのものが至難のワザであり、無理な注文であったと今では思っているのですが、いかがでしょうか? <サンプル> AA技術開発グループ 主任技師 AA環境技術グループ 主任技師 商品開発部 プロダクトグループ 臨床検査技師/臨床工学技士 商品開発部 プロダクトグループ 副主任研究員 東京本社 品質保証部 品質保証課 部長 大阪事業所 品質保証部 品質保証課 部長 信頼性保証本部  信頼性保証グループ グループリーダー 品質管理センター 信頼性保証部 グループリーダー 開発室 第3ブロック 研究員 開発室 第1室Aブロック 研究員 大阪本社 FFグループ GGチーム 主任 FF事業部 大阪事業所 GGグループ 主任

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 >A列の任意のセルを選択した状態から開始して連続してデータが入っているところまでを範囲としたいです。 =MID(B4,1,MATCH(TRUE,INDEX(MID(A4,COLUMN(A4:T4),1)<>MID(B4,COLUMN(A4:T4),1),,),0)-1) あいうえお あいうかえお C列: あいう なお、#1の補足 >以下のように文字列が入っていた場合に、B1の「か」の部分が色が変わるとか、C列に「か」だけ抽出したいのです。 > A1:あいうえお > B1:あいうかえお 「か」だけを出す論理が分かりませんでしたが、こういうことでしょうか。 =MID(B1,MATCH(FALSE,INDEX(MID(A1,COLUMN(A1:T1),1)=MID(B1,COLUMN(A1:T1),1),,),0),1) A1:T1の範囲は、20文字まで、ということです。 マクロやVBAに関しては、もう少しきちんとした説明が必要です。

wakamoto
質問者

お礼

お返事が遅くなり大変申し訳ありません。 MID関数での解決法を理解する事が出来なかったのですが、どうも今回の目的の用途には合わないようです。 ひとえに当方の問いが不味かったのだと思います。 未熟な質問に時間をさいていただき、本当にありがとうございました。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

>回答番号:No.2 この回答へのお礼 A列もフォント色が変わりますがそれでもいいのですか? 同じ文字が重複している場合も考慮されていませんがいいのでしょうか? >A:あいうえお B:あいううえお=「- - -う- -」 B列で「う」が2回出現しています。 A列に「う」があるにも係わらず2個目の「う」が赤になります。 アルファベットの場合も英文字という理由ではなく文字が重複しているからです。

wakamoto
質問者

お礼

ありがとうございます。 >A列に「う」があるにも係わらず2個目の「う」が赤になります。 これは寧ろ、こうなって欲しかった結果です。 >A列もフォント色が変わりますがそれでもいいのですか? はい。それでも良いです。 前提条件を完璧に考えるのが難しかったので、ある程度の結果が出れば、最後は手動で調整しようと思っていました。 会社名から部署名までの長い文字情報が1つのセルに入っていて、 ○○グループ○○チームというように文字列「○○」の重複もありえます。 Aが古い情報、Bが新しい情報。一見似た文字列の間違い探しという用途でした。全件目視でチェックする必要のある事に変わりありませんが、手を動かす回数を減らせられれば助かると思いました。 明日、実際のデータで検証してみるつもりです。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

マクロでなくとも条件付き書式を使えばよいでしょう。 B列を選択して「書式」メニューから「条件付き書式」を選択します。 「数式が」にして右の窓には次の式を入力します。 =COUNTIF(A:A,B1)=0 おなじ画面の「書式」をクリックして「フォント」タブの「色」から例えば赤色などを選択してOKすればよいでしょう。 なお、C列に取り出したい場合にはC1セルに次の式を入力して下方にオートフィルドラッグします。 =IF(B1="","",IF(COUNTIF(A:A,B1)=0,B1,""))

wakamoto
質問者

お礼

ありがとうございます。 今回の用途ではありませんでしたが、正誤判定してC列に取り出す数式はとても参考になりました。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

A列の文字は、必ずB列に含まれているということなら Sub test2() Dim c As Range Dim n As Integer Dim i As Integer For Each c In Range("B1:B10") For i = 1 To Len(c.Value) n = InStr(c.Offset(, -1).Value, Mid(c.Value, i, 1)) If n = 0 Then c.Characters(Start:=i, Length:=1).Font.ColorIndex = 3 End If Next i Next End Sub

wakamoto
質問者

お礼

ご丁寧にありがとうございます。 今回の用途には当てはまりませんが、これもとても便利そうですね。 使う時があるかもしれないで大事に控えておきます。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

一般機能では無理だとおもいます。 下記マクロを試してください。 セル範囲は実際に合わせて書き直してください。 Sub test1() Dim c As Range Dim n As Integer Dim i As Integer For Each c In Range("A1:A10") c.Resize(, 2).Font.ColorIndex = 3 For i = 1 To Len(c.Value) n = InStr(c.Offset(, 1).Value, Mid(c.Value, i, 1)) If n <> 0 Then c.Characters(Start:=i, Length:=1).Font.ColorIndex = 1 c.Offset(, 1).Characters(Start:=n, Length:=1).Font.ColorIndex = 1 End If Next i Next End Sub

wakamoto
質問者

お礼

見事に、 A:あいうえお B:あいうかきく=「- - -かきく」 A:あいうえお B:かきくけこ =「かきくけこ」 A:あいうえお B:あいううえお=「- - -う- -」 と、異なる部分だけ赤いフォント色になりました(-は色の変わらなかったところ)。 値をアルファベットにしていたセルは不思議な結果になりましたが、 A:AGAAGGAGCUUU B:AGAACCAGCUUU=「- -AA-CAGC-UU」 比較したいのは日本語なので大丈夫そうです。 本当にありがとうございました。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

1.条件付き書式の数式(関数)で可能ですか? B列を選択して、条件付書式 数式が =A1<>B1 書式で ご希望の色を選択して OKです。 2.もしくは、数式(関数)でC列に異なる部分を抽出できますか? C列に =IF(A1=B1,"同じ","違います") と入れて下へコピィします。

wakamoto
質問者

補足

ありがとうございます。 説明が足りなくてすいません。A列とB列は異なっているのが前提なのです。 以下のように文字列が入っていた場合に、B1の「か」の部分が色が変わるとか、C列に「か」だけ抽出したいのです。  A1:あいうえお  B1:あいうかえお すいませんがよろしくお願いします。

関連するQ&A

専門家に質問してみよう