2016-07-06 14 views
0

ワークシート「入力」からIDの配列を取り出し、配列内のIDと一致するレコードのみを要求するOracleデータベースに問い合せ、結果をワークシート「出力」に出力します。Excel VBA - ワークシート・セル範囲を使用してSQL問合せを実行

これまでのところ、私の配列には単一のIDのみが含まれていて(単一のセル範囲を指定するだけで)、VBAが動作し、ワークシート「出力」に表示される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

私はしばしば、正しい方法でやり遂げようとしているので、わかりやすい単純な方法が欠けてしまうことがあります。 –

関連する問題