• ベストアンサー

比較したいセルの文字列が一致したら"一致"

いい案が思い浮かばないため皆さんのお知恵をお貸しください。 下はエクセルと思ってください    A列             B列 1  2009/01/07/22:55   2009/01/07/22:56 2  テスト1           テスト1 3  テスト2           テスト2 4  テスト3            テスト3 5  テスト4           テスト6 とこのようなシートがあります。 セルA1とB1は時間のため可変で比較対照としたくありません それ以外のA列とB列がすべて一致したとき一致 不一致があればセルA5が不一致とmsgboxで出したいと考えております。 まだ思案中で途中なのですが Sub test() Dim i As Integer i = 1 Do While Cells(i, 1) <> "" If Cells(i, 1) = Cells(i, 2) Then MsgBox "一致" i = i + 1 ElseIf Cells(i, 1) <> Cells(i, 2) Then MsgBox "不一致" i = i + 1 End If Loop End Sub いまはまだこの程度のレベルです 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.7

お待たせしました やろうと思えばもう少し凝ったものに出来るのですが まあこの辺で 先に余談を2つ挟みます 私は若かった頃 まだスタック攻撃とか無かったですから Sub test()  Dim i As Integer  Dim j As Integer  i = 1  j = 1  Do While Cells(i, 1) <> "" and j = 1   If Cells(i, 1) = Cells(i, 2) Then    i = i + 1   Else    MsgBox "不一致" End Sub   End If  Loop End Sub こんなことしてました 禁じ手ですね 今では少し丸くなって Sub test()  Dim i As Integer  for i = 1 to 0 step 1   If Cells(i, 1) <> Cells(i, 2) Then    i = 0    MsgBox "不一致"   Elseif i>= 65535 then    i = 0    MsgBox "一致"   End If  next i End Sub 位までしかしない程温和しくなりました もう一つの余談ですが 一致か不一致かは =PRODUCT(INDEX((A:A=B:B)-ISERROR(SEARCH("*/??/*",A:A))+1,0)) と言う式で判定できます この式は不一致の場合0を返すので If文を付けずこのまま条件書式に記載して B行全体へ条件書式を適応してやれば その時々に応じて相違点をクローズアップしてくれます 余談は此処まで 本題ですが 先に謝罪します ソートできませんでした 申し訳ない ヾ(ーー;) ではいきます 集計結果を表示させるシートを開き まあ適当で良いのですが B6の辺りに ="この日の試験は"&IF(PRODUCT(INDEX((A:A=B:B)-ISERROR(SEARCH("*/??/*",A:A))+1,0)),"一致しています","不一致なものがあります 下にリストアップします") と B7の辺りに =IF(SUMPRODUCT(ABS((シート1!A:A=シート1!B:B)-ISERROR(SEARCH("*/??/*",シート1!A:A)))),HYPERLINK("#"&ADDRESS(SMALL(INDEX(((シート1!A:A=シート1!B:B)-ISERROR(SEARCH("*/??/*",シート1!A:A))+1)*65535+ROW(シート1!B:B),0),ROW(B1)),COLUMN(B1),4,TRUE,"Sheet1"),ADDRESS(SMALL(INDEX(((シート1!A:A=シート1!B:B)-ISERROR(SEARCH("*/??/*",シート1!A:A))+1)*65535+ROW(シート1!B:B),0),ROW(B1)),COLUMN(B1),4,TRUE,"Sheet1")&"の"&OFFSET(B$1,SMALL(INDEX(((シート1!A:A=シート1!B:B)-ISERROR(SEARCH("*/??/*",シート1!A:A))+1)*65535+ROW(シート1!B:B),0),ROW(A1))-1,0,1,1)&"が違ってます"),"") と入力して下さい このB7の式は横へも縦へもフィルできるように作ってますので 使用されているパソコンの処理能力と相談しながら 加減を見て必要分フィルしてみて下さい 不一致リストをクリックすると対象のセル位置へ飛ぶようになってます この式の基本構造は至極簡単で =ABS((A:A=B:B)-ISERROR(SEARCH("*/??/*",A:A))) で各行の整合性を判定しています この式を元に不一致件数をカウントしたり、不一致が発生しているアドレスを取得したりしているのです 以上、 お待たせした上に軽口を吐いた結果となってしまいましたが 此でもお役にたてれば幸いです また何かありましたらお声掛け頂ければ… と思います

その他の回答 (6)

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.6

へ! 不一致の箇所をマークするだけでいいのですか? それなら条件付き書式で十分ですよ? 関数の方は今ちょっと煮詰まっちゃってるので もう少しお待ち頂けますか 日付のセルが第1行目以外にも現れることを想定して 式の中で弾くように模索中です ところで このリストは評価実施リストか何かですよね て、事は日毎に横にデータが増えつつあるのではないですか? となると別シートに整合結果と 不一致ポイントへのリンクリストがあると良さそうですね データをソートした状態で不一致リストを作り それを元にリンクリストを作ると言うのは 関数でできるか微妙なのですが データをソートしない状態で不一致リストを作り それを元にリンクリストを作ると言うのは かなり楽です 例えば =hyperlink(offset(Sheet1!A1,small(index(((Sheet1!A:A=Sheet1!B:B)<>countif(B:B,"*/??/*"))*row(A:A),0),row(A1))-1,0,1,1),… てな感じに ですが少し処理能力を要求する仕様になるかもしれません 申し訳ないですが今暫しお待ちください

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.5

必要として頂けて感激しました。 因みにエラーの原因はSUMPRODUCT構文のスペルミスでした ところで 日付と時間は続けて手入力されていて 時間のシリアル値ではなく テキストと認識されているのですよね? 詰まり例えば 「2009/01/07/22:56」が =DATE(2009,1,7)+TIME(22,56,0) と入れて得られるシリアル値を 書式設定でこう表示させているものではなく 直接「2009/01/07/22:56」入れたものなのですよね 時のシリアル値で入っていると直感的に思い込んでしまってました 今、ミスである可能性がExcelに貼り付けてみて初めてはっきりと解りました その点でデータ形式に対する誤認識と 他にもイリガルなエラーがあることが解りました なので、 多忙な為少々修正はお待ち頂いても構わないですか? 無責任な上、無理を言って済みません。

tool_a
質問者

お礼

>時間のシリアル値ではなく >テキストと認識されているのですよね? 概ねその通りです。 別のデータを貼り付けて比較しています。 その性質上2009/01/07/22:56という文字列があるという認識です。 見せていただけるならいくらでも待たせていただきます。 自分にない知識を吸収できることは喜びです。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

何かの練習問題なら別ですが、 不一致の場合にいちいちメッセージを出すのは実用的ではないと思います。 それだと検索終了後、どのセルが不一致だったのかどこかに控えておかないと分からない。 当方なら以下のようにします。 いちいち不一致メッセージは出さずに、不一致セルに色を付ける 最後に「不一致が、**件ありました」と表示する '----------------------------------------- Sub Test()  Dim i As Integer  Dim Cnt As Long  Range("A:A").Interior.ColorIndex = xlNone  i = 1 Do While Cells(i, 1) <> ""   If Len(Cells(i, 1)) - Len(Replace(Cells(i, 1), "/", "")) <> 3 Then     If Cells(i, 1) <> Cells(i, 2) Then       Cnt = Cnt + 1       Cells(i, 1).Interior.ColorIndex = 3     End If   End If   i = i + 1 Loop   MsgBox "不一致が " & Cnt & " 件ありました" End Sub '--------------------------------------------- 日付時間は必ず、20009/01/07/10:00 のように "/"が3つあるものとする。 なお、セルのアドレスを絶対参照($A$5)ではなくて、相対参照(A5) で取得したいなら          Cells(i, 1).Address(0, 0) Addressのヘルプを参照すること。 以上。  

tool_a
質問者

お礼

回答ありがとうございます ビックリするほどスマートです 私とのセンスの違いに驚かされます。 使用用途が時間以外は一致していないといけないものを比較するために 一つ一つ不一致箇所が出た方がよかったのです。 きちんと使用用途を書いていなかったので申し訳ありません。 しかしながら不一致が多いならこのまま使えてしまうほど 完成されています。 相対参照の件もありがとうございます 独学であるために基本がなっておらずできるだけ自分で調べる ということも失念しておりました。 ヘルプはインストールしておきます。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.3

VBAでする必要に迫られてるのですか? もし拘らないなら 検査対象セルが 全半角の仮名漢字で始まるもの全てのみと仮定して =iF(sumprodct(sign(small(Large(a:a,counta(a:a)),sumprodct(istext(a:a)))=small(Large(b1:b21,counta(a:a)),sumprodct(istext(a:a)))))=sumprodct(istext(a:a)),"一致","不一致") 実際にパソでテストしてないので不安ですが こんな方向性でも検証できると思いますよ 只この式をA列及びB列に置くと この式の算出結果分で不一致となり 常に不一致になってしまうので 別の列に置いてくださいね 因みにソートしてから検証しておきました ※ エクセルは文字も内部的には   文字コードのシリアル値でデータを保持しているので   こんなことが可能なのですね

tool_a
質問者

お礼

VBAである必要はありません 人の手を介在せずに正確に比較したいです。 Noubleさんの関数を試してみたら#NAME?になります。 A1にあ B1にあ と入れてC1に入れてみたのですが。 難しくて自分では修正できませんでした。 お時間の都合のよろしいときでいいので完成形が見たいです。

  • kztk
  • ベストアンサー率53% (59/110)
回答No.2

すべて一致したかどうかのフラグをもっておけばよいのでは。あるいは不一致のカウントをとっておいて、それがゼロなら完全一致、とかでも。 (どちらかといえば日付の判定方法の方が気になりますが・・・  「2009/01/07/22:56」って、ただの文字列で、日付時刻として認識されませんよね?) Sub test3() Dim i As Integer i = 1 Dim bCompleteMatch As Boolean '完全一致フラグ bCompleteMatch = True Do While Cells(i, 1) <> "" If Cells(i, 1) Like "200*/**/**/**:**" Then 'テストの為に 'MsgBox "比較しない" ElseIf Cells(i, 1) <> Cells(i, 2) Then '1回でもここを通ると完全一致フラグはFalseになる bCompleteMatch = False Cells(i, 1).Activate MsgBox Replace(Cells(i, 1).Address, "$", "") & "が不一致" End If i = i + 1 Loop If bCompleteMatch Then MsgBox "すべて一致" End If End Sub

tool_a
質問者

お礼

ありがとうございます ほぼ考えていた通りのものができました。 >「2009/01/07/22:56」って、ただの文字列で、日付時刻として認識されませんよね?) は文字列と考えていただいて間違いないです。 時間であることが重要ではなく 比較するソースにこの形で表示されるものです。 If Cells(i, 1) Like "200*/**/**/**:**" Then だとうまく拾ってくれませんでした。 独学のため基本ができておりません 教えていただきありがとうございました。

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

ご提示のコードで十分ではないでしょうか。参考までに Sub test() Dim i As Integer i = 2 Do While Cells(i, 1) <> "" Cells(i, 1).Activate If Cells(i, 1) = Cells(i, 2) Then MsgBox "一致" Else MsgBox "不一致" End If i = i + 1 Loop End Sub こんな感じは如何でしょうか。

tool_a
質問者

お礼

重要なヒントありがとうございます そしてとてもスマートになっていて勉強させていただきました。 ヒントをもとに Sub test2() Dim i As Integer i = 1 Do While Cells(i, 1) <> "" If Cells(i, 1) Like "200*/**/**/**:**" Then 'テストの為に 'MsgBox "比較しない" ElseIf Cells(i, 1) = Cells(i, 2) Then MsgBox "一致" Else Cells(i, 1).Activate MsgBox "不一致" End If i = i + 1 Loop End Sub こんな感じまでたどり着きました。 あとは比較したくないところ以外に一致しないところがあれば それを表示することと 一つ一つではなく時間のセル以外すべてが一致した時のみ一致と出したいのです。 また時間の表記はA1だけでなくランダムで出ます。

tool_a
質問者

補足

MsgBox "セル" & ActiveCell.Address & "の" & Cells(i, 1) & "が" & "不一致" これだと $A$5 〔セル$A$5のテスト4が不一致〕 が取得できますが$をなくしてA5とだけ出すことができますか?