アプリ版:「スタンプのみでお礼する」機能のリリースについて

いい案が思い浮かばないため皆さんのお知恵をお貸しください。
下はエクセルと思ってください
   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

いまはまだこの程度のレベルです

宜しくお願いします。

A 回答 (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)))
で各行の整合性を判定しています

この式を元に不一致件数をカウントしたり、不一致が発生しているアドレスを取得したりしているのです

以上、
お待たせした上に軽口を吐いた結果となってしまいましたが
此でもお役にたてれば幸いです

また何かありましたらお声掛け頂ければ…
と思います
    • good
    • 0

へ!


不一致の箇所をマークするだけでいいのですか?
それなら条件付き書式で十分ですよ?


関数の方は今ちょっと煮詰まっちゃってるので
もう少しお待ち頂けますか
日付のセルが第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),…
てな感じに

ですが少し処理能力を要求する仕様になるかもしれません

申し訳ないですが今暫しお待ちください
    • good
    • 0

必要として頂けて感激しました。



因みにエラーの原因はSUMPRODUCT構文のスペルミスでした

ところで
日付と時間は続けて手入力されていて
時間のシリアル値ではなく
テキストと認識されているのですよね?

詰まり例えば
「2009/01/07/22:56」が
=DATE(2009,1,7)+TIME(22,56,0)
と入れて得られるシリアル値を
書式設定でこう表示させているものではなく
直接「2009/01/07/22:56」入れたものなのですよね
時のシリアル値で入っていると直感的に思い込んでしまってました

今、ミスである可能性がExcelに貼り付けてみて初めてはっきりと解りました

その点でデータ形式に対する誤認識と
他にもイリガルなエラーがあることが解りました

なので、
多忙な為少々修正はお待ち頂いても構わないですか?

無責任な上、無理を言って済みません。
    • good
    • 0
この回答へのお礼

>時間のシリアル値ではなく
>テキストと認識されているのですよね?

概ねその通りです。
別のデータを貼り付けて比較しています。
その性質上2009/01/07/22:56という文字列があるという認識です。

見せていただけるならいくらでも待たせていただきます。
自分にない知識を吸収できることは喜びです。

お礼日時:2009/01/07 21:36

何かの練習問題なら別ですが、


不一致の場合にいちいちメッセージを出すのは実用的ではないと思います。
それだと検索終了後、どのセルが不一致だったのかどこかに控えておかないと分からない。

当方なら以下のようにします。
いちいち不一致メッセージは出さずに、不一致セルに色を付ける
最後に「不一致が、**件ありました」と表示する

'-----------------------------------------
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のヘルプを参照すること。
以上。
 
    • good
    • 0
この回答へのお礼

回答ありがとうございます
ビックリするほどスマートです
私とのセンスの違いに驚かされます。

使用用途が時間以外は一致していないといけないものを比較するために
一つ一つ不一致箇所が出た方がよかったのです。
きちんと使用用途を書いていなかったので申し訳ありません。
しかしながら不一致が多いならこのまま使えてしまうほど
完成されています。

相対参照の件もありがとうございます
独学であるために基本がなっておらずできるだけ自分で調べる
ということも失念しておりました。
ヘルプはインストールしておきます。

お礼日時:2009/01/07 19:09

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列に置くと
この式の算出結果分で不一致となり
常に不一致になってしまうので
別の列に置いてくださいね

因みにソートしてから検証しておきました

※ エクセルは文字も内部的には
  文字コードのシリアル値でデータを保持しているので
  こんなことが可能なのですね
    • good
    • 0
この回答へのお礼

VBAである必要はありません
人の手を介在せずに正確に比較したいです。

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

お礼日時:2009/01/07 18:51

すべて一致したかどうかのフラグをもっておけばよいのでは。

あるいは不一致のカウントをとっておいて、それがゼロなら完全一致、とかでも。
(どちらかといえば日付の判定方法の方が気になりますが・・・
 「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
    • good
    • 0
この回答へのお礼

ありがとうございます
ほぼ考えていた通りのものができました。

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

独学のため基本ができておりません
教えていただきありがとうございました。

お礼日時:2009/01/07 18:38

ご提示のコードで十分ではないでしょうか。

参考までに
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
こんな感じは如何でしょうか。

この回答への補足

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

補足日時:2009/01/07 00:20
    • good
    • 0
この回答へのお礼

重要なヒントありがとうございます
そしてとてもスマートになっていて勉強させていただきました。
ヒントをもとに
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だけでなくランダムで出ます。

お礼日時:2009/01/07 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!