2017-07-04 10 views
0

Excelで生成された結果を書き込むために、VBAを使用してMySQLに接続しようとしています。私はそれぞれ約100列を含む何千もの行を書く必要があります。ですから、結果を書き始める前にMySQLに接続するために別々のサブルーチンを作成してから、各行に対して「挿入」クエリを実行し、最後に接続を閉じる必要があります。VBAからMySQLへの接続、更新、クローズ

sub main 
    dbconnect 
    for i = 1 to 50000 
     dbupdate 
    next i 
    dbclose 

sub dbconnect() 
    Dim cn as ADODB.connection 
    Set cn = New ADODB.Connection 
    cn.open "Driver .............." (usual stuff) 

sub dbupdate() 
    dim sqlstr as string 
    sqlstr = "insert into table " .... (some query to write the results in a table) 
    cn.execute sqlstr 

sub dbclose() 
    cn.close 
    cn = nothing 

は、しかし、私のマクロは、それがDBUPDATEまたはDBCLOSEサブルーチンに表示されたときに、CNを理解していないようです:

私は私が私のメインプログラムから呼び出しています以下の潜水艦を作成しました。 dbconnectで設定した接続は他のサブルーチンからアクセスできないようです。マクロはdbupdateのcn.execute sqlstrで次のエラーで停止します。ランタイムエラー91:オブジェクト変数またはブロック変数メモセット。

私はこの作業を行う方法はありますか?

多くの感謝!

答えて

1

接続オブジェクトはdbconnect()サブクラス内で宣言しています。 これは、そのサブ・エンドの実行後に接続が終了することを意味します。 これを修正するには、任意のサブセクションの外に公に宣言された変数にします。

Public cn as ADODB.connection 'Declare it here!!! 

Sub main() 
    dbconnect 
    for i = 1 to 50000 
     dbupdate 
    next i 
    dbclose 
    '.... 
End Sub 
Sub dbconnect() 
    Set cn = New ADODB.Connection 
    cn.open "Driver .............." (usual stuff) 
    '.... 
End Sub 
Sub dbupdate() 
    dim sqlstr as string 
    sqlstr = "insert into table " .... (some query to write the results in a table) 
    cn.execute sqlstr 
End Sub 
Sub dbclose() 
    cn.close 
    Set cn = nothing 'Use set keyword! 
End Sub 
+0

ありがとうございました。あなたが提案したように、dbconnectの前にpublic変数として接続を宣言しましたが、同じエラーが発生しました。マクロはdbupdateのcn.execute sqlstrで次のエラーで停止します。ランタイムエラー91:オブジェクト変数またはブロック変数メモセット。 – KMLN

+1

エラーで終了しない場合、cn.openが最初に成功したかどうかをテストします。 cn.openが実際の問題である可能性があります。 –

関連する問題