幼稚園時代「何組」でしたか?

添付図は赤の間違い個所を発見しようとするものです。
K列はあらかじめソートされており、同じものが続いています。
L列はK列に対する属性です。
従って、L399とL403は間違いで、これを発見しようとしています。
M列はM398を下へコピーしたもので、M400とM404はなぜTRUEとならないのでしょうか。
正と正が合わさると、虚になっています。

しかし、これが仕様なら間違い個所を発見する方法を考えてもらえませんか。
なお、ソフトはExcel2013、Win10です。

「excelのFalseとTrue」の質問画像

質問者からの補足コメント

  • &とANDの違い、分かりました。
    そこで、406~408行を追加した結果、M406とM407にも、TRUEが出てきます。
    このTURUはM400,M403のTURUとは性格が異なります。
    データが増えてくると、どちらのTRUEかが分かりません。
    区別して表示させる方法はありませんか?
    なお、399行目以降はM398をコピーしたものです。

    「excelのFalseとTrue」の補足画像1
      補足日時:2017/06/30 14:47

A 回答 (18件中1~10件)

M398へ


=AND(K398=K399,L398=L399)
と入力してください。
&は論理積(AND)ではありません。文字の連結です。
    • good
    • 0
この回答へのお礼

早速のコメントありがとうございます。
恐れ入りますが、補足を開いてもらえませんか。

お礼日時:2017/06/30 14:50

考え方は合ってますが、式の書き方がダメです。



> M400とM404はなぜTRUEとならないのでしょうか。

真ん中の&が文字列の連結の演算子として処理されているのでは。
=東京=東京&東=東
→東京=東京東=東
で評価されてるとか。

むしろM405がTRUEになってる説明がややこしそうですが…。


論理式、論理積を計算するAND関数を使ってください。
=AND(K400=K401,L400=L401)
    • good
    • 0
この回答へのお礼

早速のコメントありがとうございます。
恐れ入りますが、補足を開いてもらえませんか。

お礼日時:2017/06/30 14:52

こんにちは



図の一番左の数字はセルの行番号を示しているのでしょうか?

関数式の作者がどういう意図で式を作成したのかわかりませんが、「&」演算子は文字列の連結を意味します。また、演算子の優先順位が同等なら、式は左側から評価されます。
https://support.office.com/ja-jp/article/%E8%A8% …

 =K398=K399&L398=L399
は、結果的に以下のように解釈されていると思います。
 =(K398=(K399&L398))=L399
左側の( ( ))の評価は、値があれば大抵の場合はFalseになりますので、L399の値が空白やFalseだと計算結果はTrueに、それ以外はFalseになることが予想できます。

何をどうチェックしたいのかが良くわかりませんが、…
もしも論理積を取りたいのであれば、AND関数を用いてください。
(判定ロジックを再考なさった方が良さそうに思いますが…)
https://support.office.com/ja-jp/article/AND-関数-5f19b2e8-e1df-4408-897a-ce285a19e9d9
    • good
    • 0
この回答へのお礼

早速のコメントありがとうございます。
恐れ入りますが、補足を開いてもらえませんか。
なお、「何をどうチェックしたいのかが良くわかりませんが」とのことですが、L列にある間違いを発見するためです。

お礼日時:2017/06/30 14:57
    • good
    • 0

FalseとTrueを表示させているM列にはどのような数式が入っているのですか?


M398にはどのような式が入力されているのかを提示されないと、回答ができません。
=K398=K399&L398=L399 は、K398=K399 でかつ、L398=L399 ということでいいですね?
以下同じですね?
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
M398の中身は、その右にある通り、=K398=K399・・・・です。
これは式ではないと、おっしゃるかもしれませんが。
また、補足を見ていただきませんでしょうか。

お礼日時:2017/06/30 15:09

ANo3です



No3にも書きましたように、判定するための論理(ロジック)を再考なさるのが良くありませんか?

値の組み合わせや順序にどのような可能性があるのか回答者にはわかりませんが、例えば

東京 東
東京 東
東京 西
東京 西
東京 西
大阪 西
大阪 西
大阪 西
大阪 中
大阪 中
札幌 東
青森 北
岩手 南

のようなケースは存在し得るのか/しないのか、
また、ここに誤りは存在するのか/しないのか
などなどがわかりません。

それなので、『何をどうチェックしたいのかが良くわかりません』となりましたが、『L列にある間違いを発見するためです』との補足なので、わからないままです。
    • good
    • 0

やはり、何をしたいのか見えませんね。


M398セルに
=COUNTIFS($K$398:$K$416,K398,$L$398:$L$416,L398)<COUNTIFS($K$398:$K$416,K398,$L$398:$L$416,"<>"&L398)
(間違っていても)多い方がFALSE。
「excelのFalseとTrue」の回答画像7
    • good
    • 0

>そこで、406~408行を追加した結果、M406とM407にも、TRUEが出てきます。


>このTURUはM400,M403のTURUとは性格が異なります。
回答:
まず、M403ですがこれはFALSEす。従って、M403に関しては、論外とします。
M400とは性格が異なるということですが、異なりません。
そもそも、TRUEが成立するのは、「Kの値が当該行と次の行が同じ、且つ、Lの値が当該行と次の行が同じ」という条件です。
M400もM406もM407もこの条件を満たしています。
    • good
    • 0

No8です。


そもそも、「Kの値が当該行と次の行が同じ、且つ、Lの値が当該行と次の行が同じ」ものをTRUE
、以外をFALSEとして、FALSEが間違いであると判断すること自体に無理があると思います。
正しい要件は、「K列が同じものの中で、同じ属性(L列)が最も多いものを正常の属性とし、以外を間違いとする。」になります。

この要件をマクロであれば、簡単に実現することが可能です。
マクロでよければ提供可能ですがいかがでしょうか。
その場合の前提としては、
1)1行目は見出し行で、データは2行目から始まる。
2)M列に正常なら””(空白)、間違いなら、”×”を設定する。
となりますが、それで良いですか。(K列はソート済みであることが前提です)
    • good
    • 0
この回答へのお礼

「大半は正しいのに、ところどころに間違いあり」の説明が出来ませんでした。
言われる通り、「K列が同じものの中で、同じ属性(L列)が最も多いものを正常の属性とし、以外を間違いとする。」です。
「大半は正しい」のをどうやって判定するかが、分からず質問しました。
それで、言われるようにマクロを組んでいただければありがたいです。

お礼日時:2017/06/30 18:13

No9です。


マクロでの実装です。
実行時の前提は、No8に記述された通りです。
以下のマクロを標準モジュールに登録してください。
-----------------------------------------------------------
Option Explicit
Public Sub エラー判定()
Dim dict1 As Object
Dim dict2 As Object
Dim row As Long
Dim maxrow As Long
Dim ctr As Long
Dim key1 As Variant
Dim key2 As Variant
Dim oldkey1 As Variant
Set dict1 = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set dict2 = CreateObject("Scripting.Dictionary") ' 連想配列の定義
maxrow = Cells(Rows.Count, "K").End(xlUp).row 'sheet1の最大行取得
oldkey1 = ""
For row = 2 To maxrow
key1 = Cells(row, "K").Value
'K列のキーブレク時
If oldkey1 <> key1 And oldkey1 <> "" Then
'最大の数をもつ属性を取得する
Call find_max_item(oldkey1, dict1, dict2)
dict2.RemoveAll
End If
key2 = Cells(row, "L").Value
If dict2.exists(key2) = True Then
dict2(key2) = dict2(key2) + 1
Else
dict2(key2) = 1
End If
oldkey1 = key1
Next
'最大の数をもつ属性を取得する
Call find_max_item(oldkey1, dict1, dict2)
'判定を設定する
ctr = 0
For row = 2 To maxrow
key1 = Cells(row, "K").Value
If Cells(row, "L") = dict1(key1) Then
Cells(row, "M").Value = "" '正常
Else
Cells(row, "M").Value = "×" '間違い
ctr = ctr + 1
End If
Next
MsgBox ("間違い件数=" & ctr & "件")
End Sub
'最大の数の属性を取得する
Private Sub find_max_item(ByVal key1 As Variant, ByVal dict1 As Object, ByVal dict2 As Object)
Dim key2 As Variant
Dim maxkey2 As Variant
Dim maxcount As Long
maxcount = 0
For Each key2 In dict2
If dict2(key2) > maxcount Then
maxkey2 = key2
maxcount = dict2(key2)
End If
Next
dict1(key1) = maxkey2
End Sub
----------------------------------------------
    • good
    • 0

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


おすすめ情報