Excel VBA - 使用Workfsheet单元格范围运行SQL查询

问题描述:

我正在创建一个简单的电子表格,它从工作表“输入”中获取一个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

的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