[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.