私はアクセスファイル(c:\ testdb.mdb)にtb1とtb2を移動するVBAを使用します。 openxlsx、XLConnect: はその後、彼らに
Sub Main()
Dim adoxCat As Object, adoConn As Object, adoRst As Object, var As Variant, strSQL As String
Dim i As Long
'make an empty mdb file'
If Dir("C:\testdb.mdb") = "" Then
Set adoxCat = CreateObject("ADOX.catalog")
adoxCat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\testdb.mdb;"
Set adoxCat = Nothing
Else
MsgBox "C:\testdb.mdb is existed.", vbCritical
Exit Sub
End If
'create an ADO connection'
On Error Resume Next
Set adoConn = CreateObject("adodb.connection")
With adoConn
.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\testdb.mdb;"
If .State 1 Then
MsgBox "Cannot create ADO Connection.", vbCritical
Set adoConn = Nothing
Exit Sub
End If
End With
'create two Tables in the mdb file.'
With adoConn
.Execute "CREATE TABLE tb_1 (Category varchar, Type varchar, NumItem number)"
.Execute "CREATE TABLE tb_2 (Type varchar, TypeElement varchar, NumEngine number)"
'move data in excel to mdb file'
var = toArray(Worksheets(1))
For i = LBound(var, 1) To UBound(var, 1)
strSQL = "INSERT INTO tb_1 (category, type, NumItem) VALUES("
strSQL = strSQL & " '" & var(i, 0) & "',"
strSQL = strSQL & " '" & var(i, 1) & "',"
strSQL = strSQL & " " & var(i, 2) & ");"
.Execute strSQL
Next i
var = toArray(Worksheets(2))
For i = LBound(var, 1) To UBound(var, 1)
strSQL = "INSERT INTO tb_2 (Type, TypeElement, NumEngine) VALUES("
strSQL = strSQL & " '" & var(i, 0) & "',"
strSQL = strSQL & " '" & var(i, 1) & "',"
strSQL = strSQL & " " & var(i, 2) & ");"
.Execute strSQL
Next i
'Use SQL Join statement to Join two tables'
strSQL = "SELECT * FROM tb_1 left join tb_2 on tb_1.type = tb_2.type;"
Set adoRst = .Execute(strSQL)
'output the result to excel worksheet(3)'
Worksheets(3).Range("A1").CopyFromRecordset adoRst
.Close
End With
Set adoConn = Nothing
'remove the mdb file'
Kill "c:\testdb.mdb"
End Sub
Function toArray(from_WSht As Worksheet) As Variant
Dim strPath As String, myRng As Range, rw As Range, c As Range
Dim i As Long, j As Long, dt As Variant
Set myRng = from_WSht.Range("a1").CurrentRegion
If not myRng.Rows.Count > 1 Then GoTo errHdr
ReDim dt(myRng.Rows.Count - 1, myRng.Columns.Count - 1) As Variant
i = 0
For Each rw In myRng.Rows
If rw.Row > 1 Then
j = 0
For Each c In rw.Cells
dt(i, j) = c.Value
j = j + 1
Next c
i = i + 1
End If
Next rw
toArray = dt
Exit Function
errHdr:
toArray = 0
End Function
に参加するためにSQLコマンドを使用してExcelからのインポート/エクスポートすることができ、いくつかのライブラリがあります。両方のスプレッドシートを2つのデータフレームに読み込んでから、「merge」を使用してください。 –
Spreadsheet1で始める必要がある理由は、Spreadsheet1のどの項目にSpreadsheet2の対応するデータがないかを調べる必要があるためです。たとえば、Spreadsheet1にB700がある場合、Spreadsheet2には空白/エラーセルが見つかります。 –
スプレッドシートを使用する必要はありません(また、20k行の場合は、そうしたくありません)。'readxl'または好みのパッケージを使ってRにインポートし、' merge'(ここでは 'all = TRUE')を使うか、混乱するような場合は、dplyrパッケージの' * _join'関数(ここでは 'full_join') SQLスタイル。また、 'TBus1'と' Tbus1'の間に矛盾があることに注意してください。だから、 'toupper'や' tolower'をすべて取りたいと思うかもしれません。 – alistaire