[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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人さん ご忠告をいただき、ありがとうございます。 提示されたコードの内容についてだったので、同じスレッドの中で質問してしまいましたが、 無駄な感想も多くなってしまい、別に質問を立てるべきでした。 自分でも「程々」じゃなかったと思っています。
なななさん 出てきづらくなってしまっていたら、本当に申し訳ありません。 どうか、お気を取り直してください。問題解決されるよう、心から願っています。
(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)
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)
上の式の最後の "" は、同じときには空白にするというようにしています。 このあたりは、ご自身で出したい情報にあわせて式を調整下さい。 まずは 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.