いい案が思い浮かばないため皆さんのお知恵をお貸しください。
下はエクセルと思ってください
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
いまはまだこの程度のレベルです
宜しくお願いします。
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)))
で各行の整合性を判定しています
この式を元に不一致件数をカウントしたり、不一致が発生しているアドレスを取得したりしているのです
以上、
お待たせした上に軽口を吐いた結果となってしまいましたが
此でもお役にたてれば幸いです
また何かありましたらお声掛け頂ければ…
と思います
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),…
てな感じに
ですが少し処理能力を要求する仕様になるかもしれません
申し訳ないですが今暫しお待ちください
No.5
- 回答日時:
必要として頂けて感激しました。
因みにエラーの原因はSUMPRODUCT構文のスペルミスでした
ところで
日付と時間は続けて手入力されていて
時間のシリアル値ではなく
テキストと認識されているのですよね?
詰まり例えば
「2009/01/07/22:56」が
=DATE(2009,1,7)+TIME(22,56,0)
と入れて得られるシリアル値を
書式設定でこう表示させているものではなく
直接「2009/01/07/22:56」入れたものなのですよね
時のシリアル値で入っていると直感的に思い込んでしまってました
今、ミスである可能性がExcelに貼り付けてみて初めてはっきりと解りました
その点でデータ形式に対する誤認識と
他にもイリガルなエラーがあることが解りました
なので、
多忙な為少々修正はお待ち頂いても構わないですか?
無責任な上、無理を言って済みません。
>時間のシリアル値ではなく
>テキストと認識されているのですよね?
概ねその通りです。
別のデータを貼り付けて比較しています。
その性質上2009/01/07/22:56という文字列があるという認識です。
見せていただけるならいくらでも待たせていただきます。
自分にない知識を吸収できることは喜びです。
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のヘルプを参照すること。
以上。
回答ありがとうございます
ビックリするほどスマートです
私とのセンスの違いに驚かされます。
使用用途が時間以外は一致していないといけないものを比較するために
一つ一つ不一致箇所が出た方がよかったのです。
きちんと使用用途を書いていなかったので申し訳ありません。
しかしながら不一致が多いならこのまま使えてしまうほど
完成されています。
相対参照の件もありがとうございます
独学であるために基本がなっておらずできるだけ自分で調べる
ということも失念しておりました。
ヘルプはインストールしておきます。
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列に置くと
この式の算出結果分で不一致となり
常に不一致になってしまうので
別の列に置いてくださいね
因みにソートしてから検証しておきました
※ エクセルは文字も内部的には
文字コードのシリアル値でデータを保持しているので
こんなことが可能なのですね
VBAである必要はありません
人の手を介在せずに正確に比較したいです。
Noubleさんの関数を試してみたら#NAME?になります。
A1にあ
B1にあ
と入れてC1に入れてみたのですが。
難しくて自分では修正できませんでした。
お時間の都合のよろしいときでいいので完成形が見たいです。
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
ありがとうございます
ほぼ考えていた通りのものができました。
>「2009/01/07/22:56」って、ただの文字列で、日付時刻として認識されませんよね?)
は文字列と考えていただいて間違いないです。
時間であることが重要ではなく
比較するソースにこの形で表示されるものです。
If Cells(i, 1) Like "200*/**/**/**:**" Then
だとうまく拾ってくれませんでした。
独学のため基本ができておりません
教えていただきありがとうございました。
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
こんな感じは如何でしょうか。
この回答への補足
MsgBox "セル" & ActiveCell.Address & "の" & Cells(i, 1) & "が" & "不一致"
これだと
$A$5
〔セル$A$5のテスト4が不一致〕
が取得できますが$をなくしてA5とだけ出すことができますか?
重要なヒントありがとうございます
そしてとてもスマートになっていて勉強させていただきました。
ヒントをもとに
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だけでなくランダムで出ます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) マクロ(データ取得と転記)について教えてください 3 2022/12/24 12:18
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでの作業計算方法について
-
はがきについて。
-
エクセル 文字を増やしたい。
-
セルの内容表示が邪魔になる
-
Microsoft365に変えたのですが...
-
エクセルの計算
-
Microsoft1Officeの互換ソフト...
-
【マクロ】その時、その時で変...
-
【マクロ】読取専用のファイル...
-
エクセル初心者です 関数の入れ...
-
Excel ピボットテーブルで日付...
-
【関数】適切な文字数の数字を...
-
LOOKUP関数を使えばいいのでし...
-
Aというブックの1というシート...
-
エクセル関数を教えてください
-
Excelのチェックボックスの使い...
-
エクセル 白黒印刷で白線を印刷...
-
時間によってファイル名が変わ...
-
WPS OFFICEでの縦書きについて
-
エクセルの条件付き書式につい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報