2017-04-13 97 views
0

比賽寫結果集我有兩個數據源的Excel(2010)表:Excel的VBA - 搜索範圍,並連接SQL ADODB記錄集在

  1. Access 2010中的DB
  2. SQL Server 2008 R2的

我有A列中的數據:我來自Access DB。在A列中,我有記錄的ID,這個ID對應於我的SQL DB表中的ID列。

我想通過在A列中的ID進行搜索,如果在SQL數據庫的ID相匹配,我想從「coOverview」從SQL表中列J.

列在顯示數據總之,「如果ID = COID,然後寫coOverView列J」

Combined Dataset 我已經成功地能夠連接並檢索所需的記錄集和複製/向下填充J列,所以我知道我能夠成功連接並讀取SQL表中的數據。現在我需要在coOverview數據從我的SQL表複製只有在ID A列ID

Sub RetrieveOverview() 

Dim cn As New ADODB.Connection 
Dim rs As New ADODB.Recordset 
Dim ConnectionString As String 
Dim query As String 

Set cn = New ADODB.Connection 

    ConnectionString = "Provider=SQLOLEDB;Password=***;Persist Security Info=True;User ID=*****;Data Source=***;Initial Catalog=**" 

    cn.Open ConnectionString 
    cn.CommandTimeout = 900 


    query = "SELECT coOverview FROM SQLTable" 

    rs.Open StrQuery, cn 

    Sheets(1).Range("J2").CopyFromRecordset rs 
    End Sub 

我不知道我是否應該在條件中的SQL語句或循環相匹配。

+0

要清楚,你拉在兩個數據集中,並將它們存儲在Excel單元格?如果是這樣,我會將兩個範圍都拉入數組並寫入一個簡單的比較循環。如果您擁有合理數量的數據,應該足夠快。 – Kyle

+0

Kyle, 不,我沒有將兩個數據集都存儲在單元格中。我將一個數據集存儲在一個範圍(A:I)中,我想使用列A中的ID並將其與我在我的SQL語句中連接的SQL DB中表中的ID匹配。找到匹配的ID後,我想複製SQL表中「coOverview」列中的相應數據,並將其寫入Excel電子表格中的J列。 – sshel207

+0

你現在遇到的問題是什麼?你說你已經成功地連接並檢索了所需的記錄集並複製/填寫了J列。除此之外,你還想做什麼? –

回答

0

這會通過A列並將唯一值添加到變量str。一旦完成,str將看起來像(138,353,....)。然後,可以將SQL語句中的WHERE子句插入,以便僅返回ID匹配的結果。請注意,如果您的ID是SQL DB中的字符串,則需要在構建字符串時將它們包裝在單引號中。如果ID列在A列中已經是唯一的,那麼您可以刪除If instr(1,str,c.Value) <> 0 Then部分。此外,如果列A中的ID是唯一的,則可以對這些ID進行排序,並將查詢重新排序,然後將記錄集放入J列中,並排列所有內容。

Sub RetrieveOverview() 

Dim cn As New ADODB.Connection 
Dim rs As New ADODB.Recordset 
Dim ConnectionString As String, Ids as String 
Dim query As String 
Dim rng as Range, c as Range 
Dim lrow as long 

With Thisworkbook.Sheets("your sheet name") 
    lrow = .Range("A" & .Rows.Count).End(xlUp).Row 
End With 

Set rng = Thisworkbook.Sheets("your sheet name").Range("A1:A" & lrow) 

For Each c in rng 
    If instr(1,str,c.Value) <> 0 Then 
     If str <> "" Then 
     str = str & "," & c.Value 
     Else 
     str = "(" & c.Value 
     End If 
    End If 
Next c 

str = str & ")" 

Set cn = New ADODB.Connection 

ConnectionString = "Provider=SQLOLEDB;Password=***;Persist Security Info=True;User ID=*****;Data Source=***;Initial Catalog=**" 

cn.Open ConnectionString 
cn.CommandTimeout = 900 


query = "SELECT ID, coOverview FROM SQLTable WHERE ID in " & str 

rs.Open StrQuery, cn 

Sheets(1).Range("J2").CopyFromRecordset rs 
End Sub 
0

的SQL語句應該是這樣的,在那裏你會改變tblSQLServertblAccess到表中的實際名稱。

sSQL = "SELECT tblSQLServer.coOverView, " & _ 
      "FROM (tblSQLServer " & _ 
      "INNER JOIN tblAccess " & _ 
      "ON tblSQLServer.CoID = tblAccess.ID)" 
0

考慮使用其OPENDATASOURCE方法通過匹配ID場參加與SQL Server表的Access數據庫表中的SQL Server分佈式查詢。通過這個查詢的ADO記錄集調用:

SELECT mssql.[ID], acc.[Category], acc.[Name], acc.[Days], acc.[Costs], mssql.[coOverview] 
FROM 
    OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0','Data Source=C:\Path\To\Access\Database.accdb')...myAccTable acc  
INNER JOIN 
    mySQLTable mssql 
ON acc.ID = mssql.ID