2016-07-06 167 views
0

我正在創建一個簡單的電子表格,它從工作表「輸入」中獲取一個ID數組,查詢Oracle數據庫,只查詢與陣列中ID匹配的記錄並輸出結果到工作表「輸出」。Excel VBA - 使用Workfsheet單元格範圍運行SQL查詢

到目前爲止,我的VBA將工作,如果我的陣列僅包含單個ID(通過指定單個小區範圍),並與一切出現在工作表中「輸出」 Oracle數據庫所需的輸出的完成。美好時光。

我現在遇到的問題是,我想在工作表「輸入」中指定一系列ID(任何高達5000左右的值)以包含在我的數組中,並將該數組傳遞給Oracle數據庫以爲每個數據返回數據它發現的ID(我不期待所有的ID都存在)。每當我試試這個我似乎得到「錯誤13類型不匹配」錯誤...不好的時候。

我的VBA代碼:

Dim OracleConnection As ADODB.Connection 
Dim MosaicRecordSet As ADODB.RecordSet 
Dim SQLQuery As String 
Dim DBConnect As String 
Dim count As String 
Dim strbody As String 
Dim Exclude As String 
Dim i As Integer 
Dim Rec As RecordSet 
Dim InputIDs As Variant 

Set OracleConnection = New ADODB.Connection 
DBConnect = "Provider=msdaora;Data Source=MOSREP;User ID=***;Password=***;" 
OracleConnection.Open DBConnect 

' Clear Output Sheet Down 
Sheets("Output").Select 
Range("A2:F10000").Clear 

' Set Input Range 
Sheets("Input").Columns("A:A").NumberFormat = "0" 
InputIDs = Sheets("Input").Range("A2:A10").Value 

' SQL Query 
SQLQuery = "select DMP.PERSON_ID, DMP.FULL_NAME, DMP.DATE_OF_BIRTH, DMA.ADDRESS, DMA.ADDRESS_TYPE, DMA.IS_DISPLAY_ADDRESS " & _ 
"from DM_PERSONS DMP " & _ 
"join DM_ADDRESSES DMA " & _ 
"on DMA.PERSON_ID=DMP.PERSON_ID " & _ 
"where DMP.PERSON_ID in (" & InputIDs & ")" 

Set MosaicRecordSet = OracleConnection.Execute(SQLQuery) 

Sheets("Output").Range("A2").CopyFromRecordset MosaicRecordSet 

' Change DOB Format 
Sheets("Output").Columns("C:C").NumberFormat = "dd/mm/yyyy" 
' Set Left Alignment 
Sheets("Output").Columns("A:Z").HorizontalAlignment = xlHAlignLeft 

Range("A1").Select 

OracleConnection.Close 
Set MosaicRecordSet = Nothing 
Set OracleConnection = Nothing 

ActiveWorkbook.Save 

任何人都可以闡明我缺少的是什麼光?我試圖通過在工作表「輸入」設置列上了「NumberFormat的」爲「0」,以解決該類型不匹配的問題,但沒有幫助。我也認爲我可能必須有一個循環遍歷每條記錄,但我還沒有到那個階段,因爲這種類型不匹配的事情...

謝謝大家提前給予您的幫助!

問候 馬特

+0

你不能傳遞一個變量數組作爲查詢的參數。你需要它是一個由逗號分隔的id的字符串。 – Kyle

+0

謝謝凱爾,托馬斯沿着你的迴應下面幫我解決我的問題。直到你解釋我沒有意識到變體數組不包含逗號分隔符。 – mhammonde

回答

1

的ID的需要是逗號分隔

InputIDs = getIDs(表( 「輸入」)範圍( 「A2:A10」))

Function getIDs(rng As Range) 
    Dim c As Range 
    Dim s As String 
    For Each c In rng 
     s = s & c.Value & "," 
    Next 
    getIDs = Left(s, Len(s) - 1) 
End Function 
+0

這工作一種享受,謝謝托馬斯。我確實懷疑我是否試圖錯誤地創建一個數組,因爲它跨越了我的想法,每個ID之間可能沒有分隔符,但是我缺乏VBA知識阻礙了我。 – mhammonde

+0

我經常陷入困境,試圖以正確的方式做事,最終我錯過了簡單的方法。 – 2016-07-07 09:04:37

相關問題