2016-09-21 14 views
0

行に以下のコードでは問題(タイプの不一致エラー)があります: アクション= ....SQL「挿入」

は、私は、Excelからの配列をコピーするには、SQL INSERT INTOを使用するようにしてくださいPostgreSQLデータベースに貼り付けます。

Sub UploadToDatamart2() 

'Defining connection objects 
Dim cnn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
Dim LastRow As Long 

Sheets("AVON DICTIONARY").Activate 

'Opening the ODBC connection 
cnn.Open "Driver={PostgreSQL Unicode(x64)};DSN=postgres;Server=XXX;Port=5432;UID=YYY;PWD=ZZZ;Database=hurtownia;READONLY=0;PROTOCOL=6.4;FAKEOIDINDEX=0;SHOWOIDCOLUMN=0;ROWVERSIONING=0;SHOWSYSTEMTABLES=1" 

'Find the last row 
With ActiveSheet 
    LRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
'Picking up cell values 
    Category = .Range("A3:A" & LRow).Value 
    segment = .Range("B3:B" & LRow).Value 
    brand = .Range("C3:C" & LRow).Value 
End With 

'Defining and executing SQL insert 
Action = "INSERT INTO temp.avon_dictionary_test" & " VALUES ('{" & Category & "}','{" & segment & "}','{" & brand & "}')" 
Result = cnn.Execute(Action) 

cnn.Close 
End Sub 

、誰もがあなたがCategorysegmentbrand変数の範囲を割り当てる

+0

'Option Explicit 'をモジュールの先頭に追加します。このような問題のデバッグに役立ちます。 'Dim Action As String'を追加し、実行行を' cnn.Execute(Action) 'に変更する必要があります。これはレコードセットを返しません。 – Comintern

+0

私は以下を追加しました:Option Explicit - 上にも、以下もあります:Dim Category As Variant Dim segment Variantとして、Dim brand As Variant。これを修正してください:Dim LRow As Longと置き換えてResult = cnn.Execute(Action)をcnn.Execute(Action)に置き換えてください。それでも同じエラーです – Bartek

+0

文字列としての暗黙のアクション - これも追加しましたが問題はまだ残っています – Bartek

答えて

0

を助けることができれば、私は喜んでいるだろう。ある範囲が変数に代入されると、その変数はバリアントから配列に変換されます(変数が特に宣言されていない限り)。変数が配列であるため、項目を参照する必要があります(Category(0))。 Action =ステートメントの項目を参照してみてください

0

カテゴリ、セグメントとブランドは2D配列なので、そのような文字列で連結することはできません。あなたは最初にそれらから文字列を構築するためにJOINを使用、その後、1D-配列にそれらを移調する必要があります。次に置き換える

まず

Category = Application.Transpose(.Range("A3:A" & LRow).Value) 
segment = Application.Transpose(.Range("B3:B" & LRow).Value) 
brand = Application.Transpose(.Range("C3:C" & LRow).Value) 

Category = .Range("A3:A" & LRow).Value 
segment = .Range("B3:B" & LRow).Value 
brand = .Range("C3:C" & LRow).Value 

を交換

Action = "INSERT INTO temp.avon_dictionary_test" & " VALUES ('{" & Category & "}','{" & segment & "}','{" & brand & "}')" 

Action = "INSERT INTO temp.avon_dictionary_test" & " VALUES ('{" & Join(Category, ",") & "}','{" & Join(segment, ",") & "}','{" & Join(brand, ",") & "}')" 

Transposeは、(1〜LRow、1〜1)配列をプレーン(1〜LRow)配列に変更します。

Joinは、区切り文字(ここでは、 ")で区切られた文字列の配列から値を連結します。

+0

ありがとうヴィンセント。今私は "無効なプロシージャの呼び出しまたは引数"行にエラーが発生しました= ...私のテストファイルでは、LRow = 4000、これはこの手順にはあまりにも多いですか? – Bartek

+0

あなたのデータが並んでいるので、Joinを使用する前に配列を転置する必要があります。 –

+0

ええと、私はこれをINSERT INTO [リンク](https://www.postgresql.org/docs/9.2/static/sql-copy.html)の代わりにCOPYを使うのが良いと思いますか?私はSQLで弱いと感じているので、私は尋ねている – Bartek