Option Explicit
Sub Macro1()
Const FILEB_BOOKS As String = "fileB.xls"
Const FILEB_SHEET As String = "Sheet1"
Dim strPath As String
Dim objB As Workbook
Dim buf As Variant
Dim n As Long
Dim num As Long
Dim i As Long
Dim Target As Variant
Dim j As Long
On Error Resume Next
Set objB = Workbooks(FILEB_BOOKS)
On Error GoTo 0
If objB Is Nothing Then
strPath = ThisWorkbook.Path & "\" & FILEB_BOOKS
On Error Resume Next
Workbooks.Open strPath
On Error GoTo 0
If Err.Number <> 0 Then
MsgBox FILEB_BOOKS & "が存在しません。", vbCritical
Exit Sub
Else
Set objB = Workbooks(FILEB_BOOKS)
End If
End If
With objB
With .Sheets(FILEB_SHEET).Range("A1")
buf = .CurrentRegion
n = .CurrentRegion.Columns.Count
End With
.Saved = True
.Close
End With
With ThisWorkbook.Sheets("Sheet1")
num = .Range("A1").CurrentRegion.Columns.Count - 1
For i = LBound(buf) To UBound(buf)
Set Target = .Range("A1:A65536").Find(What:=buf(i, 1) _
, LookAt:=xlPart, MatchCase:=False, MatchByte:=False)
If Not Target Is Nothing Then
For j = LBound(buf) To n
Target.Offset(, num + j).Value = buf(i, j)
Next j
End If
Next i
End With
If Not CInt(Application.Version) < 12 Then
With ActiveSheet.Range("A1").CurrentRegion
On Error Resume Next
.RemoveDuplicates Columns:=1, Header:=xlNo
On Error GoTo 0
End With
End If
オートフィルタを使い、重複を非表示にしてコピペするとこんな感じでしょうか。
With Sheets("Sheet1").Range("A1").CurrentRegion
.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
.SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Sheet2").Range("A1")
End With
Sheets("Sheet1").ShowAllData
Sub Sample()
Dim cn As Object
Dim rs As Object
Dim sql As String
Dim dataCell As Range
Dim i As Long
Dim buf As String
Worksheets("Sheet3").Cells.Clear
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
sql = "select [Sheet1$].ID, [Sheet1$].年齢, [Sheet1$].性別, [Sheet2$].住所, [Sheet2$].電話番号 from [Sheet1$] left outer join [Sheet2$] on [Sheet1$].ID = [Sheet2$].ID union select [Sheet2$].ID, [Sheet1$].年齢, [Sheet1$].性別, [Sheet2$].住所, [Sheet2$].電話番号 from [Sheet1$] right outer join [Sheet2$] on [Sheet1$].ID = [Sheet2$].ID"
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Extended Properties").Value = "Excel 8.0"
.Open ThisWorkbook.FullName
rs.Open sql, cn
End With
For i = 0 To rs.Fields.Count - 1 Step 1
Worksheets("Sheet3").Cells(1, i + 1).Value = rs.Fields.Item(i).Name
Next i
Set dataCell = Worksheets("Sheet3").Range("A1").CurrentRegion
Do Until rs.EOF
For i = 0 To rs.Fields.Count - 1 Step 1
buf = buf & "," & rs.Fields.Item(i)
Next i
SQLは、今回の例にあうように書きましたが、
列数が多くなるようであれば
sql = "select * from [Sheet1$] left outer join [Sheet2$] on [Sheet1$].ID = [Sheet2$].ID union select * from [Sheet1$] right outer join [Sheet2$] on [Sheet1$].ID = [Sheet2$].ID"のようにして、あとは結果から必要データをVBAでもExcelの数式ででも取ればよいかと。
Option Explicit
Sub Macro1()
Const FILE_NAME As String = "SampleBook1.xls"
Dim cn As Object
Dim rs As Object
Dim sql As String
Dim cnc As String
Dim i As Long
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
.Open "Provider=MSDASQL;" & cnc
rs.Open sql, cn
End With
Worksheets.Add
With rs
For i = 1 To .Fields.Count
Cells(1, i).Value = .Fields.Item(i - 1)
Next i
Range("A2").CopyFromRecordset rs
.Close
cn.Close
End With