[[20121122155333]] 『2種類の数列の対応関係に間違いがないかチェックax(ななな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『2種類の数列の対応関係に間違いがないかチェックしたい』(ななな)

A列にA0000、B列にB0000という数列があります。
これらはそれぞれ隣の列の値と対応関係があります。数字はランダムです。
例)
A0001はB0002
A0015はB0007
A0020はB0006


C列にもA0000、D列にもB0000の数列があります。
AB列とCD列に
・ぬけもれがないか
・対応関係は間違っていないか
を調べたいです。

Excel2007です。よろしくお願いいたします。


 AB列のペアとCD列のペアは、必ずしも同じ行にあるということはないんだね?
 で、抜けがあった時や漏れがあった時は、あるいは 対応関係に間違いがあった時、どこにどのように表示したいのかな?
 それと、漏れ、あるいは 抜け というのは A列とC列で判断するの? B列とD列でも別途チェックするの?
 同じく、対応関係のアンマッチはA列に対するB列と C列に対するD列の対応関係でいいの?
 別途、B列に対するA列と、D列に対するC列の対応関係のアンマッチも検出したいの?

 あと、それぞれの列に重複文字列はないという前提?
 あるいは、重複も調べたい?

 (ぶらっと)


なななです。返信ありがとうございます!

AB列のペアとCD列のペアは、必ずしも同じ行にあるということはないんだね?

★そうですね、ランダムです。

で、抜けがあった時や漏れがあった時は、あるいは 対応関係に間違いがあった時、どこにどのように表示したいのかな?

★どこでもどんなのでもいいです。ABCDを動かしてもいいです。

それと、漏れ、あるいは 抜け というのは A列とC列で判断するの? B列とD列でも別途チェックするの?

★AC列で判断です。

同じく、対応関係のアンマッチはA列に対するB列と C列に対するD列の対応関係でいいの?
 別途、B列に対するA列と、D列に対するC列の対応関係のアンマッチも検出したいの?

★A列に対するB列と C列に対するD列の対応関係のみで大丈夫です。
AC列で抜け漏れを確認したら、漏れのない部分で対応関係を確認、という感じです。

あと、それぞれの列に重複文字列はないという前提?
 あるいは、重複も調べたい?

★重複はあります。
AB列にあるペアが二つあったら、CD列にも二つあるはず。なかったら漏れです。

よろしくお願いいたします!


 >AB列にあるペアが二つあったら、CD列にも二つあるはず

 たとえば

 A0001 B0002 が A,B C,D に2つずつあって、それとは別に、A0001 B0003 が ABに、A0001 B0005 が CD にあったら
 どういう表現にしたい?

 もう1つ。

 A0001 B0002 が A,B に2つ、C,D に1つあって、それとは別に、A0001 B0003 が ABに、A0001 B0005 が CD にあったら
 どういう表現にしたい?

 (ぶらっと)

 まず、本件、エキスパートさんから関数処理案もきっとアップされると思うけど、当方、関数からっきしなので前座でVBA。

 かつ、やりたいことはなんとなくわかるけど、どのような形式で整理したらいいのか、まだアイデアがわかない。

 とりあえず、A、B列からC,D列を眺めて、不足しているものを、F,G,H列に。
 G列はA,B列にあった件数、H列はC,D列にあった件数。

 また、C,D列からA,B列を眺めて不足していたものをJ,K,L列に。
 K列はC,D列にあった件数、L列はA,B列にあった件数。

 このあたりをベースに、これを、どのよううな形でまとめると、そちらのやりたいことが実現できるか
 アイデアをねってほしい。

 Sub Sample()
    Call Check("A", "C", "F")
    Call Check("C", "A", "J")
 End Sub

 Private Sub Check(col1 As String, col2 As String, col3 As String)
    Dim dic As Object
    Dim c As Range
    Dim w As Variant
    Dim dKey As Variant

    Set dic = CreateObject("Scripting.Dictionary")

    With Sheets("Sheet1")   '元シート
        For Each c In .Range(col1 & 1, .Range(col1 & .Rows.Count).End(xlUp))
            dKey = c.Value & "/" & c.Offset(, 1).Value
            If Not dic.exists(dKey) Then dic(dKey) = VBA.Array(0, 0, 0)
            w = dic(dKey)
            w(0) = w(0) + 1
            w(2) = w(0)
            dic(dKey) = w
        Next
        For Each c In .Range(col2 & 1, .Range(col2 & .Rows.Count).End(xlUp))
            dKey = c.Value & "/" & c.Offset(, 1).Value
            If dic.exists(dKey) Then
                w = dic(dKey)
                w(1) = w(1) + 1
                w(2) = w(2) - 1
                dic(dKey) = w
            End If
        Next
        For Each dKey In dic
            If dic(dKey)(2) <= 0 Then dic.Remove dKey
        Next

        .Columns(col3).Resize(, 4).ClearContents
        .Range(col3 & 1).Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.keys)
        .Range(col3 & 1).Offset(, 1).Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items))
    End With

 End Sub

 追記)F列、J列に登場しないものについては、両者、それぞれ同じものが同じ数だけあったということ。(2011/11/23 16:00)

 (ぶらっと)

 おなじスターターキットでも、以下のほうが、今後のまとめかたのアイデアを練る上でわかりやすいかも。(19:22 コード訂正)

 不整合結果をF、G、H列に表示。 G列は A,B列にあった件数、H列はC,D列にあった件数。
 上記と同様、表示のないものは両者の件数が一致したもの。(不整合のないもの)

 Sub Sample2()
    Call Check(True)
    Call Check(False)
 End Sub

 Private Sub Check(flag As Boolean)
    Dim dic As Object
    Dim c As Range
    Dim w As Variant
    Dim dKey As Variant
    Dim x As Long, y As Long
    Dim i As Long
    Dim col1 As String
    Dim col2 As String

    Set dic = CreateObject("Scripting.Dictionary")

    If flag Then
        col1 = "A"
        col2 = "C"
    Else
        col1 = "C"
        col2 = "A"
    End If

    With Sheets("Sheet1")   '元シート
        If Flag Then
            x = 0
            y = 1
            i = 1
            .Columns("F").Resize(, 2).ClearContents
        Else
            x = 1
            y = 0
            i = .Range("F" & .Rows.Count).End(xlUp).Row + 1
        End If

        For Each c In .Range(col1 & 1, .Range(col1 & .Rows.Count).End(xlUp))
            dKey = c.Value & "/" & c.Offset(, 1).Value
            If Not dic.exists(dKey) Then dic(dKey) = VBA.Array(0, 0, 0)
            w = dic(dKey)
            w(x) = w(x) + 1
            w(2) = w(x)
            dic(dKey) = w
        Next
        For Each c In .Range(col2 & 1, .Range(col2 & .Rows.Count).End(xlUp))
            dKey = c.Value & "/" & c.Offset(, 1).Value
            If dic.exists(dKey) Then
                w = dic(dKey)
                w(y) = w(y) + 1
                w(2) = w(2) - 1
                dic(dKey) = w
            End If
        Next
        For Each dKey In dic
            If dic(dKey)(2) <= 0 Then dic.Remove dKey
        Next

        .Range("F" & i).Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.keys)
        .Range("G" & i).Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items))

        If Not Flag Then .Columns("F:G").Sort Order1:=xlAscending, Key1:=.Columns("F"), Header:=xlNo

    End With

 End Sub

 (ぶらっと)

 横から失礼します。usamiyuと申します。
 コードについて、教えていただきたい点があって、お邪魔しています。
少しの間、板を貸してください。

 To ぶらっとさん
 いつも大変お手数をおかけしております。今回も教えていただけますか?
 両sampleとも、それぞれ、AB列からみてCD列を、CD列から見てAB列を判断しているという構成はわかります。
わからない点は次の点です。最初のsampleの方を見ています。

 (1) If Not dic.exists(dKey) Then dic(dKey) = VBA.Array(0, 0, 0)
                       ~~~~~~~~~~~~~~~~~~~
   もし、辞書にdkey("A0001/B0002")がなければ、?? (0, 0, 0)?という配列 を代入?ということですか?

 (2) w(0) = w(0) + 1    
     w(2) = w(0)
   この部分が?
   ~~~~~~~~~~~~ 
   wにdkeyを代入して、上記の処理をして、wを最後にdic(dKey)に一気に戻していますよね。
   この上記の処理がわかりません。うーん、配列がイメージできていないのかも。
   ローカルウィンドウで見るとそれぞれ、値が1になるのですが、これは何をしているところですか?

 (usamiyu)

 まず、もくろみとしては、"A0001/B0002" といったペア毎に、3つの数値要素を持った配列を持とうとしている。
 まだ登録のないエントリーについては たとえば Dic("A0001/B0002") は Variant型の空白値なので
 それを配列として扱おうとすると エラーになる。
 なので、最初に、そのエントリーに対する初期化として 0,0,0 という配列にしているもの。

 ちなみに余談を2つ。

 1)以前はそのままArray関数を使っていたけど、この関数によってできあがる配列のLBoundは
   Option Base に左右されるとのアドバイスをseiyaさんからもらった。つまり、通常は LBoundが 0 なので
   それを前提に、配列(0) といった処理をするけど、何かのひょうしに、Option Base 1 が記述されたとしたら
   その瞬間に、Array関数で作られる配列のLBound が 1 になる。そうすると 配列(0) という記述では
   9 インデックスエラー になってしまう。これを VBA. と修飾してつかうと、常に LBound は 0 となるので
   安心して 配列(0) という記述ができる。

 2)たとえば Dic("AAA")="XYZ" とすると キー"AAA"に対するデータとして "XYZ" がセットされる。
   でも、データが配列だった場合、 DIC("AAA")(1)="XYZ" と記述して実行すると、エラーにはならないけど
   実際には、書き込まれない。なので、データが配列の場合、その配列データを、Variant型変数に取り出し
   その変数(1)="XYZ" と処理をした上で Dic("AAA")=その変数 というように、配列データ全体を書き戻してやる必要がある。

 で、この3つの数値要素。通常の配列としては Dim w(0 To 2) というイメージになっているんだけど、
 W(0) A、B列にあった件数
 W(1) C、D列にあった件数
 W(2) 相手の件数をさっぴいた後に残った件数。これがプラスということは、余分なものがあったということ。

 なお、W(2)はチェック用の要素なので、最後にセルに書き込むときはW(0)とW(1)の2列だけを転記している。

 う〜ん・・・説明になっているかなぁ?
 わかりにくければ指摘お願いね。

 (ぶらっと)

 To ぶらっとさん
 ありがとうございます。いつも本当にお手数をおかけして申し訳なく思っているのですが、つい、ぶらっとさんに
教えていただくのが楽しいのもあって・・・(-_-;)(いや、でも本当にわからないことを理解したいのももちろんあります。)
決してからんでいるわけではないのですが、もし、今後も、いい加減にしなさいということがあれば、そうおっしゃってくだ
さいね。

 えーと、それで、本題ですが、質問のうち、(1)については、理解できました。
 >まだ登録のないエントリーについては たとえば Dic("A0001/B0002") は Variant型の空白値なので
 >それを配列として扱おうとすると エラーになる。

 なるほど、配列を生成するということですか。了解です。VBA.Arrayについては、以前も使っていらっしゃったときにいろいろ
検索してみたので、今回も(0 to 2)に固定しているのかなというところまではイメージしていました。

 >データが配列だった場合、 DIC("AAA")(1)="XYZ" と記述して実行すると、エラーにはならないけど実際には、書き込まれない。
これは知らなかったです。それでWが登場するのですね。

 それで、その後がちょっと、よくわからないのですが、
W(0) A、B列にあった件数--->これに1をプラスしているのは?値1にしているのはどういう意味ですか?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
w(2) C、D列にあった件数--->同じく、これにw(0)つまり値1を代入しているのは?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 (usamiyu)

 まず 基準列側の処理(最初のループ)の W(0)=w(0)+1 はいいよね。数をカウントアップしている。
 で、基準側の処理の最終形としては W(2)も基準列にあった数。つまり W(0)もW(2)も同じ値になる。
 だから W(2)=W(2)+1 でもよかったけど、すでに計算済みの W(0) で置き換えるという処理にした。

 で、このW(2) は2番目のループ(相手列側の処理)で、1つずつ引いていて、双方マッチすれば結果は 0 になる。

 実はアンマッチは ここがマイナスになった時にも発生しているんだけど、このマイナスの状態は、他方の処理で
 プラスで残っているので、これも採用すると、最終的に重複情報がダブってしまう。なので、3番目のループで
 0 のみならず マイナスになっているものも削除。いずれかの基準でプラスになっているものだけを表示。

 (ぶらっと)

 ぶらっとさん、まだ、理解できてないんですが、ちょっとPCの前を離れますので、
夕方また、ご連絡します。
(usamiyu)

 こんにちは

 こんな感じもどうですか?
 Sub test()
    Dim a As Variant
    Dim c As Variant
    Dim v As Variant
    Dim w As Variant
    Dim i As Long
    Dim j As Variant
    Dim k As Long
    Const エラー表示 As Long = 7 '列番
    Application.ScreenUpdating = False
    Cells(1, エラー表示).EntireColumn.ClearContents
    With Range("A1", Cells(Rows.Count, 1).End(xlUp))
        a = .Resize(, 2).Value
        ReDim v(1 To UBound(a))
        For i = 1 To UBound(a)
            v(i) = a(i, 1) & "/" & a(i, 2)
        Next
    End With
    k = 1
    Cells(k, エラー表示) = "C、D列に有ってA、B列に無い組み合わせ"
    k = k + 1
    With Range("C1", Cells(Rows.Count, 3).End(xlUp))
        c = .Resize(, 2).Value
        ReDim w(1 To UBound(c))
        For i = 1 To UBound(c)
            w(i) = c(i, 1) & "/" & c(i, 2)
            j = Application.Match(c(i, 1) & "/" & c(i, 2), v, 0)
            If IsError(j) Then
                Cells(k, エラー表示) = i & "行目:" & w(i)
                k = k + 1
            Else
                v(j) = ""
            End If
        Next
    End With
    k = k + 1
    Cells(k, エラー表示) = "A、B列に有ってC、D列に無い組み合わせ"
    k = k + 1
    For i = 1 To UBound(v)
        If v(i) <> "" Then
            j = Application.Match(v(i), w, 0)
            If IsError(j) Then
                Cells(k, エラー表示) = i & "行目:" & v(i)
                k = k + 1
            Else
                v(j) = ""
            End If
        End If
    Next
    Application.ScreenUpdating = False
End Sub
(ウッシ)

 ↑
 こんにちは
 面白いかと思ったけどデータ量多いと遅くて使えないですね。
 ボツにして下さい。

 (ウッシ)


 To ぶらっとさん
 現時点で、さきほどいただいたお答えがまだ理解できていません。うーん・・
ひとつひとつお伺いします。

 >基準列側の処理(最初のループ)
というのは次のような配列になっていますか?

 ________________________________________________________________
  w(0)      |  w(1)        |  w(2)
 AB列にあった  |  CD列にあった |  ?
 件数          |  件数         |
 ↑        ↑       ↑
 G列に表示    H列に表示    G-H?相手の件数をさっぴいた後に残った件数?
                  基準側の処理の最終形としては W(2)も基準列にあった数?

 w(2)がよくわからないのですが、配列はこんな風にならんでますか?

 (usamiyu)

 To ウッシさん
 usamiyuと申します。質問者さんじゃないので、恐縮ですが。
 上のような状況なので、まだ、ウッシさんのコードを確認するまでに
いたっていないのですが、速い遅いはわかりませんが、私には勉強に
なるので、後日コード追いかけてみます。ありがとうございます。

 (usamiyu)

 ベースをSample2のほうで説明するね。

 Sample2では、A,BからC,D列を眺めた処理 Chekck(True) と C,DからA,Bを眺めた処理 Check(Flase) が
 あるんだけど、とりあえず、その Check(True) でいうと、最初のループが終わったときDictionary内の配列は、
 たとえば以下のようになっている。

  キー    W(0)    W(1)    w(2)
 A0001/B0001  3   0    3    A,B列に 3 件。 W(2) は W(0) と同じ数字
 A0002/B0002  2   0    2    A,B列に 2 件。 W(2) は W(0) と同じ数字
 A0003/B0003  1   0    1    A,B列に 1 件。 W(2) は W(0) と同じ数字

 で、2番目のループが終わったとき、Dictionary内の配列は以下のようになっている。

  キー    W(0)    W(1)    w(2)
 A0001/B0001  3   2    1    A,B列に 3 件。 C,D列に 2 件。W(2) は両者の差し引き。(A、B - C,D)
 A0002/B0002  2   2    0    A,B列に 2 件。 C,D列に 2 件。W(2) は両者の差し引き。(A、B - C,D)
 A0003/B0003  1   0    1    A,B列に 1 件。 C,D列に 0 件。W(2) は両者の差し引き。(A、B - C,D)

 これが最後のループで

  キー    W(0)    W(1)    w(2)
 A0001/B0001  3   2    1    A,B列に 3 件。 C,D列に 2 件。W(2) は両者の差し引き。
 A0003/B0003  1   0    1    A,B列に 1 件。 C,D列に 0 件。W(2) は両者の差し引き。

 このように、W(2)が 0 以下のものが削除(Remove)され、不一致があったものだけがDictionaryに残る。

 Check(False)でも、基本同じ事。この場合も W(0) は A,B列、W(1) は C,D列列。
 ただし、 W(2) は C,D - A,B
 ここでも差し引きが0以下のものが削除される。

 結果的に、最後にDictionaryに残っているものは、数が多い方から見て、相手による差し引きを行っても消し込まれなかったもの。

 (ぶらっと)

 こんばんは

 Dictionary が出ちゃうとそれ以上速い処理のコードは難しいので、次点になればいいかなって感じに修正しました。

 Sub test1()
    Dim a As Variant
    Dim c As Variant
    Dim v As Collection
    Dim w As Collection
    Dim i As Long
    Dim j As Variant
    Dim k As Long
    Dim u As Variant
    Dim s As String
    Const エラー表示 As Long = 7 '列番
    Cells(1, エラー表示).EntireColumn.ClearContents
    Set v = New Collection
    Set w = New Collection
    On Error Resume Next
    With Range("A1", Cells(Rows.Count, 1).End(xlUp))
        a = .Resize(, 2).Value
        For i = 1 To UBound(a)
            s = a(i, 1) & "/" & a(i, 2)
            v.Add Item:=1 & vbTab & s, Key:=s
            If Err.Number <> 0 Then
                k = Split(v(s), vbTab)(0) + 1
                v.Remove s
                v.Add Item:=k & vbTab & s, Key:=s
            End If
            Err.Clear
            k = 0: s = ""
        Next
    End With
    With Range("C1", Cells(Rows.Count, 3).End(xlUp))
        c = .Resize(, 2).Value
        For i = 1 To UBound(c)
            s = c(i, 1) & "/" & c(i, 2)
            k = Split(v(s), vbTab)(0)
            If k = 0 Then
                Err.Clear
                w.Add Item:=1 & vbTab & s, Key:=s
                If Err.Number <> 0 Then
                    k = Split(w(s), vbTab)(0) + 1
                    w.Remove s
                    w.Add Item:=k & vbTab & s, Key:=s
                End If
            ElseIf k = 1 Then
                v.Remove s
            Else
                k = Split(v(s), vbTab)(0) - 1
                v.Remove s
                v.Add Item:=k & vbTab & s, Key:=s
            End If
            Err.Clear
            k = 0: s = ""
        Next
    End With
    Application.ScreenUpdating = False
    Cells(1, エラー表示).Value = "A、B列に有ってC、D列に無い組み合わせ"
    For i = 1 To v.Count
        u = Split(v(i), vbTab)
        Cells(i + 1, エラー表示).Value = u(1)
        Cells(i + 1, エラー表示 + 1).Value = u(0)
    Next i
    Cells(i + 1, エラー表示).Value = "C、D列に有ってA、B列に無い組み合わせ"
    For k = 1 To w.Count
        u = Split(w(k), vbTab)
        Cells(i + 1, エラー表示).Offset(k).Value = u(1)
        Cells(i + 1, エラー表示 + 1).Offset(k).Value = u(0)
    Next k
    Application.ScreenUpdating = False
End Sub
(ウッシ)


 Toぶらっとさん

 確認が遅くなりました。頭が固くなっていたので、気分転換してから臨みました。
sample2のステップ実行とぶらっとさんの解説とを画面に並べて、見比べてみました。

 それで、1度目のループがw(0)とw(2)を、2度目のループがw(1)の値を代入していることが
わかりました。
 >W(2) は両者の差し引き・・これは w(2) = w(2) - 1 この部分ですね。
たとえばw(0)が1件、w(1)が1件あったら、w(2)は0件になり、3度目のループでRemoveされ、
最後に残るのは不一致のあったものだけになるということですね。

 あぁ、やっとわかりました。ありがとうございました!
すごいですね!こんなロジック、とても自分では考えつかないけれど、わかってよかったです。
1度目のループでw(1)の箱が空のままで、2度目に埋めるっていうのも、教えていただかなかったら、
わからなかった。
 いつか自分でも配列をイメージして、使ってみたいです。
 今は、ただ、ぶらっとさんが以前、どなたかのスレで回答されていた「配列の基本」を繰り返し、
頭に入れようとしているところです。(これ、とってもわかりやすかったので、即、メモさせて
いただきました^^)

 (usamiyu)


 To ウッシさん
 usamiyuです。test1を変数の値を見ながら、ステップ実行で、ゆっくり確認してみました。
理解しやすかったです。勉強になりました。ありがとうございました。
あと、本当に初歩的なことですが、知らなかったこともいろいろありました。
たとえば、Err.Clear とか。On error go to 0 とはしない方法もあるんですね。
それから、なんと「:」につまずいちゃったんですけど、同じ行に複数の処理を記述した場合って
これで区切るんですねぇ。(初心者丸出しの感想で、すみません^^;)

 To なななさん
 長い間、板をお借りしてしまいました。申し訳ありません。
これでフェイドアウトします。お邪魔しました。

 (usamiyu)


便乗質問はやったらダメとは思いませんが、タイミング考えて程々にしたらどうですか?
もし自分が質問者で、ちょっと目離した隙にこんな長々と関係ないやりとりされたら「もういいや」ってなります。
今回の質問者さんも、完全に委縮あるいは憤慨しちゃったと思うんですが。
(ROM人)

 ROM人さん
 ご忠告をいただき、ありがとうございます。
提示されたコードの内容についてだったので、同じスレッドの中で質問してしまいましたが、
無駄な感想も多くなってしまい、別に質問を立てるべきでした。
自分でも「程々」じゃなかったと思っています。

 なななさん
 出てきづらくなってしまっていたら、本当に申し訳ありません。
どうか、お気を取り直してください。問題解決されるよう、心から願っています。

 (usamiyu)

すみません、戻ってきました、なななです。
連休中、放置してしまい申し訳ありません。
戻ってきたら、皆さんの専門的な解説が・・・(汗)

私はVBAとか全く分からないのですが、
これはVBAとか使わないと解決が難しい事だったのでしょうか(大汗)。

すみませんが、今回はデータ量が少なく、早期解決をしたいので、
質問を変えさせてください(できないところは目視確認することにします)。
データ量はこれから多くなっていきますが、またしばらく時間がとれますので、
上記の質問はその時に改めてさせていただければと思います。
私もどう質問すればいいかなど、熟考しておきます。

新たな質問です。
Sheet1A列のA0000の数列の各値が、
Sheet2A列のA0000の数列の中にあるかどうかを
Sheet1B列に表示したいです。
表示の仕方は、あれば空欄、なければ何か表示が出るように。

よろしくお願いいたしますm(_ _)m。

(ななな)


 作業列を使った案ですが、

 (1)Sheet1 の A列を選択してフィルターを適用し、オプションで重複するレコード
 異は無視するにチェックを入れ、出力を F 列にします。
 (照合はSheet3などの別シートでやっても良いです。)
http://www.eurus.dti.ne.jp/yoneyama/Excel/jituyou/jyufuku.htm#tyusyutu

 (2)以下ユニークな値がF列にある例です。
 G1 に
 =COUNTIF(Sheet1!A:A,F1)

 H1 に
 =COUNTIF(Sheet2!A:A,F1)

 I1 に
 =IF( G1=H1,"○","×")

 G1:I1 をコピーし、F列の行範囲にコピー

 でどうでしょうか。
 オートフィルターをF:I に適用して×になっているものが食い違っている
 ものだと思います。

 A列、B列 の組み合わせで見たかったら、C 列にでも
 = A1&"/"&B1
 というようにしてC列に貼り付け、

 再度C列をコピーして、形式を選択して貼り付けで「値」を選択してOK
 としてから、(2)の手順を実施すれば、A:B列セットでの比較が出来ると思います。
 (Mook)


すみません、上記で重複について失念していました。
○×ではなく、重複の回数で表示したいです。
抜けがある場合は0になるように。
お手数ですがよろしくお願いいたします。
(ななな)


 Sheet1 の方が Sheet2 よりも多いとき
 Sheet2 の方が Sheet1 よりも多いとき
 はそれぞれどうしたいのでしょうか。

 それから、重複の回数というのは何を指しているのでしょうか。
 Sheet1 内で同じものがある場合は重複といいますが、Sheet1 と Sheet2
 で同じものがあることを指すのであれば、一致している/していないという
 ような表現のほうがよさそうです。

 重箱の隅は置いておいて、
 これまでの説明では、それぞれのシート内でも同じものが複数あるという説明だったと
 思ったので、それぞれのデータの個数が一致している、いないを判定したのですが、
 例えば A12345 が Sheet1 に5つあり、Sheet2 に3つあるときには、どのように表示する
 のが希望でしょうか。
 (Mook)


返信ありがとうございます。
言葉の使い方の指摘もありがとうございます。

Sheet1 の方が Sheet2 よりも多いです。
例えば、Sheet1は10/28から12/1までのデータで、
Sheet2は11/1から11/30までのデータ、というようなイメージです。

データの最初のほうと最後の方にデータソースの違いによる不一致が多くあり、
中盤の不一致は本当にチェックしたい抜け漏れの可能性が高い、というイメージです。
不一致を出したら、データソースの違いによる不一致は取り除きます
(それは目視確認でじゅうぶんできます。数字の順はランダムと書きましたが、このようなことが可能なくらいには、だいたい同じぐらいの順にあります)。

また、 A1234 が Sheet1 に5つあり、Sheet2 に3つあるときには
Sheet1のB列の5つのセルそれぞれに3と出ればそれだけで良いです。

よろしくお願いいたします。
(ななな)


 単純に Sheet1 と Sheet2 のA列の比較だけに絞ったお話ですが、

 B1=IF(COUNTIF(A:A,A1)<>COUNTIF(Sheet2!A:A,A1),COUNTIF(Sheet2!A:A,A1),"")
 として、B列にコピー。

 ということでしょうか。
 (Mook)

やってみたのですが、数式をB列にコピーするため下へドラッグすると、
最初は値が出るのですが、数秒後に空欄のセルがでてしまいます。
0,1,2などが表示されている値は、Sheet2で検索して確かにその回数なのですが、
空欄の値もSheet2で検索すると確かに存在します。
お手数ですが、よろしくお願いします。
(ななな)

 上の式の最後の "" は、同じときには空白にするというようにしています。
 このあたりは、ご自身で出したい情報にあわせて式を調整下さい。
 まずは IF 構文を理解ください。
http://www.eurus.dti.ne.jp/yoneyama/Excel/kansu/if_is.htm

 Sheet2 だけに無いときは0 になりますが、一致していても Sheet2 の個数を
 出したいのですか?

 そうであれば、条件判定はいらず
 B1=COUNTIF(Sheet2!A:A,A1)
 だけで十分です。

 今回使っている関数は COUNTIF だけですので、あわせて下記をご一読ください。
http://www.becoolusers.com/excel/countifs.html
 (Mook)

とりあえず解決しました!

知識不足で混乱させました。申し訳ございませんでした。
数週間後にまた質問をさせていただくと思いますので、
もし宜しければお付き合いください。

本当にありがとうございました。

(ななな)


すみません。
この件ににたような事で、わからないことがあるので質問します。

仕事でつかってるのですが、
A列とB列に48万件のデータをいれてます。
C列とD列には6000件のデータをいれてます。

A列とC列には、顧客の契約番号、B列とD列には顧客の名前をいれてます。

CD列の中から、AB列に入ってるデータはどれかを調べたいのですが、やりかたご存じでしょうか??
プードル


 A-B列 や C-D列 が必ず対になっているなら
 A列とC列だけを確認すれば良いですよね?

 まずはCOUNTIF関数でC列の値をA列の中からカウントする式を
 作製してみられてはどうでしょう?

 Mookさんの最後の書き込みをご覧になって
 「○○ってやってみたけど、××の様に思った結果にならない」
 の様に書いてみてもらえると良いと思います。

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.