2016-07-06 2 views
0

워크 시트 "입력"에서 ID 배열을 취하는 간단한 스프레드 시트를 만들고 배열의 ID와 일치하는 레코드 만 요청하는 Oracle 데이터베이스를 쿼리하고 결과를 워크 시트 "출력"에 표시합니다.Excel VBA - 워크 시트 셀 범위를 사용하여 SQL 쿼리 실행

내 배열에 단일 ID 만 포함되어 있으면 (단일 셀 범위 지정) VBA가 작동하고 워크 시트 "출력"에 나타나는 Oracle 데이터베이스의 원하는 출력으로 모든 것이 완료됩니다. 좋은 시간.

문제점은 지금 내가 가지고있는 문제는, 워크 시트 "입력"에 ID 범위 (최대 약 5000)를 지정하여 내 배열에 포함시키고 각 배열을 오라클 데이터베이스에 전달하여 각각에 대해 데이터를 반환한다는 것입니다. 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 

아무도 내가 놓친 거지 무엇을 밝혀 수 있습니까? 나는 워크 시트 "input"의 "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

이것은 대우를 받았다. Thomas 감사합니다. 각 ID 사이에 구분 기호가 없을 수도 있지만 VBA 지식 부족으로 인해 다소 다소 어려움을 겪었습니다. – mhammonde

+0

나는 종종 옳은 일을하려고 애를 썼다. 나는 명백한 간단한 접근법을 놓치게된다. –

관련 문제