全国の賃貸マンション賃貸アパートなどお部屋探しから、賃貸生活お役立ちサービスまで情報満載!

賃貸アパート・賃貸マンションなど賃貸情報を扱う賃貸物件検索サイト「CHINTAI」
物件を探す不動産会社を探すタウン情報を調べるお部屋探しガイド お気に入り物件を見る保存条件で検索
ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:hukase シート1とシート2に共通するデータを抽出する
困り度:
  • 困っています
エクセルブック シート1 と シート2 を比較し A列 B列 D列 が同じ内容のデータを シート3 へ抽出する方法を教えて下さい。
質問投稿日時:08/07/05 09:27
質問番号:4152481
最新から表示回答順に表示

回答

 

回答者:mitarashi 近頃はまっているdictionary使用のコードを汎用化してみました。ご参考まで。興味をお持ちになったら、VBA dictionaryでWEB検索してみて下さい。
Sub test()
Application.ScreenUpdating = False
Call compareColumns(Sheets(1).Range("A1").CurrentRegion, Sheets(2).Range("A1").CurrentRegion, Sheets(3).Range("a1"), Array(1, 2, 4))
Application.ScreenUpdating = True
End Sub

'比較範囲1, 比較範囲2, 出力先セル、比較する列番号の配列(個数任意)
'列番号は、比較対象範囲内の相対列番号とする
Private Sub compareColumns(rng1 As Range, rng2 As Range, destRange As Range, checkColumns As Variant)
Dim targetRow As Range, outputRange As Range
Dim keyString As String
Dim i As Long
Dim myDic As Object
Const delimiterChar As String = "☆"

Set outputRange = destRange
Set myDic = CreateObject("Scripting.Dictionary")
For Each targetRow In rng1.Rows
keyString = ""
For i = 0 To UBound(checkColumns)
If keyString = "" Then
keyString = targetRow.Cells(checkColumns(i)).Text
Else
keyString = keyString & delimiterChar & targetRow.Cells(checkColumns(i)).Text
End If
Next i
If Not myDic.exists(keyString) Then
myDic.Add keyString, targetRow
Else
MsgBox ("キーが重複しています")
Exit Sub
End If
Next
For Each targetRow In rng2.Rows
keyString = ""
For i = 0 To UBound(checkColumns)
If keyString = "" Then
keyString = targetRow.Cells(checkColumns(i)).Text
Else
keyString = keyString & delimiterChar & targetRow.Cells(checkColumns(i)).Text
End If
Next i
If myDic.exists(keyString) Then
myDic(keyString).Copy
outputRange.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Set outputRange = outputRange.Offset(1, 0)
End If
Next
Application.CutCopyMode = False
End Sub
’☆の所は、およそ出て来そうもない文字にして下さい。
'組み合わせの結果が重複する場合は、エラーで終了する仕様です。また、C列に何が入っているか分かりませんが、Sheet(1)の方の値を抽出します。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/05 14:58
回答番号:No.3
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:hallo-2007 シート3のA列に 作業列
=IF(Sheet1!A1&Sheet1!B1&Sheet1!C1=Sheet2!A1&Sheet2!B1&Sheet2!C1,ROW(),"")
下フィル
B1セルに
=INDEX(Sheet1!A$1:A$100,SMALL($A:$A,ROW(A1)))
右へ2つフィル
下フィルではいかがでしょうか。
エラー処理は含まれていません
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/05 10:36
回答番号:No.2
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:imogasi こういう問題は質問者は関数でやるよりほかないのだろうが、抜き出し問題は関数では苦手なものです。
VBAででもやらないとすんなりは出来ない。
難しさは3つあって
(1)抜き出し(抽出)問題は関数では技巧的になる
(2)本質問では比較対象がA,B,D列と3列に分かれていることである。
(3)たいしたこと無いが、比較が別シート間
それとA列内に同じ内容は重複して出ないのかが大切で、質問に書いてない。
本当はそういう程度の人には本件無理な課題で、また本質問は課題丸投げの質問だ。
ーーー
参考事項は
&を使って3列を結合した列(本当は別の考慮か要る場合あるが。本来別なのに結合すると区別できずに、同じに見える文字列が無いか)をシート1、シート2に新たにつくり(XとYとする)、シート1からその行・セル(セルX)の内容がシート2のY全行に渉って無いかCOUNTIF関数で聞いて、その件数が1より大なら同じ内容のものアリとして処理する。
同じものが見つかったとして、それを関数の組み合わせで抜き出すのはGoogleで「imogasi方式」で照会すれば、条件抜き出しの質問例が出て、作業列を使った方法だが参考になるでしょう。また他の解法も他の回答者が出している。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/05 10:26
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示