• ベストアンサー

EXCELVBAでSQLserverからデータをひっぱってきてエクセルに表示させたい

EXCELVBAでSQLserverからデータをひっぱってきてエクセルにクエリの結果を表示させています。 クエリのコードが短い場合は問題ないのですが、 長くなると、時間切れのメッセージが出てうまくできません。 クエリ自体は長いですが、誤りはありません。 クエリが複雑すぎたり長すぎたりするとだめなのでしょうか。 ご教授ください。宜しくお願い致します。 *************エラーメッセージ*************** 実行時エラー'2147217871(80040e31)': 時間切れになりました。 ******************************************** Sub test() Const connstr = "Provider=sqloledb;" & _ "Data Source=サーバ名;Initial Catalog=DB名;UserId=ユーザ名;Password=パスワード; " Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strSQL As String strSQL = "SELECT …ここのクエリ文が長い…" conn.Open connstr rs.Open strSQL, conn Range("A2").CopyFromRecordset rs rs.Close conn.Close End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

conn.Open connstr 'ここに conn.CommandTimeout = 120 rs.Open strSQL, conn 2分でタイムアウト conn.CommandTimeout = 0 にするとタイムアウトはなくなります。 1時間でも2時間でも、死ぬまで・・・ どうでしょうか

smorgas030
質問者

補足

回答ありがとうございます。 早速以下のように変更しましたが、 30秒ほどで同じエラーになりました。 conn.CommandTimeout = 0 これはなぜでしょうか。

その他の回答 (2)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

ちょっと、気になったのですが、 そもそも、クエリによって、読み込まれた。 データは約65000件以下ですよね。 たまに、膨大なデータを読み込もうとして、 エラーしている人が、いるようですが。老婆心ですが、 あと、sqlにlimitを、つけて、読み込みデータ数を 少なく制限して、実行してみるとか、 いろいろ、確認することが、あると思います。

smorgas030
質問者

お礼

回答ありがとうございます。 EXCELをつかわずにSQLserver側で実行すると問題ないので、 クエリには問題がないようです。時間はかかりますが。 また、データは100件を指定しているので、 データ量が多すぎということはないと思います。 宜しくお願い致します。

  • megwitch
  • ベストアンサー率13% (6/45)
回答No.1

接続時のタイムアウトの時間を延ばしてみてください。 以下のURLが結構色々やっているようです。

参考URL:
http://www.accessclub.jp/bbs6/0005/das1089.html
smorgas030
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • エクセルからSQLServerのデータを操作したいのですが

    エクセルからSQLServerのデータを操作したいのですが 下記コードをエクセルに入力して実行すると conn.Open connstrの部分にて 実行時エラー"-2147217887(80040e21)' 複数ステップの OLE DB の操作エラーが発生しました。各OLE DBの状態の値を確認してください。 作業は終了しませんでした。 とでてしまいます。 どのようにしたらいいのでしょうか? 教えてください。 Const connstr ="Data Source=●●●\SWLEXPRESS;Initial Catalog = DBweb;Integrated Security=True" は Web.configで接続されている <add name ="webConnectionString" connectionString="Data Source=●●●\SWLEXPRESS;Initial Catalog = DBweb;Integrated Security=True"_ providerName = "System.Data SqlClient"/>からproviderNameを抜かしてとったのですがいいのでしょうか? ------------------------------------------- Sub SQL() Const connstr ="Data Source=●●●\SWLEXPRESS;Initial Catalog = DBweb;Integrated Security=True" Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strSQL As String strSQL = "SELECT * FROM DBtable" conn.Open connstr rs.Open strSQL, conn Range("A2").CopyFromRecordset rs rs.Close conn.Close Set rs = Nothing Set conn = Nothing End Sub

  • Access VBA フォームに表示したい

    Access2000で、帳票フォームにSQLの値を表示させたいのですが、 以下のコードだとフォーム上に最後のレコードしか表示されません。 取得したデータを正しく表示するにはどうしたらよいでしょうか。 ・フォームのtext1のコントロールソースにfld1と書く 以外の方法でできますか? できればすべて非連結で、作成したいです。 (本当はフォームのrecordsourceも設定したくないのですが それは無理でしょうか?) よろしくお願いいたします。 Private Sub Form_Load() Dim conn As Connection Dim rs As ADODB.Recordset Dim strSql As String Set conn = CurrentProject.Connection Set rs = New ADODB.Recordset strSql = "select * from table1" rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText Me.RecordSource = strSql rs.MoveFirst Do Until rs.EOF me!text1 = rs!fld1 rs.MoveNext Loop rs.Close Set rs = Nothing conn.Close Set connn = Nothing End Sub

  • <VB6.0+SQLServer2000>Image型のバイナリデータを表示したい

    こんにちは。 VB6.0+SQLServer2000で開発を行っています。 Image型の項目を用意して、PictureBoxなりなんなりに表示したいのですが、バイナリデータの変換方法がわかりません。 どなたか教えてください。 とりあえず、今はこんなかんじでPG書いてます。 =============================================== Private Sub Command1_Click() Dim rs As adodb.Recordset Dim mstream As adodb.Stream Dim strSql As String On Error GoTo Err_Command1_Click strSql = "select * from 車体画像 where 整理番号='00000001'" Set rs = New adodb.Recordset rs.Open strSql, cn, adOpenKeyset, adLockOptimistic Set mstream = New adodb.Stream mstream.Type = adTypeBinary mstream.Open mstream.Write rs.Fields("画像データ").Value 'ここからどうすればいいのか分かりません… Exit Sub Err_Command1_Click: MsgBox Error End Sub

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • ExcelからAccessデータの抽出

    部署内の機器管理にExcelを使用しています、今回レコード数がExcelでは対応できなくなりデータのみAccessに置いといてデータ処理はExcelマクロで行おうと思っています。 そのAccessファイルからある日付(または期間○日~△日まで等)岳のレコードを抽出したいと思っています。 ネットや書籍でいろいろ調べたのですがうまく抽出できません(SQL文がおかしいと思います)。ご教授お願いします(Access・SQLは全くの素人です) テーブル名は『4』です Sub Macro3() Dim objDB As New ADODB.Connection Dim RS As New ADODB.Recordset objDB.Open _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & "C:\aaa.mdb" With RS .ActiveConnection = objDB .Source = "SELECT * from 4 WHERE 日付<2009/04/15" .Open End With Range("A3").CopyFromRecordset RS objDB.Close Set objDB = Nothing End Sub

  • ADOでRecordsetオブジェクトをレコードソースに設定したい

    Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。 宜しくお願いします。 Private Sub FormNoKansu() Dim cn as New ADODB.Connection Dim rs as New ADODB.Recordset Dim strSql as String 'ODBCでサーバーに接続 cn.ConnectionString = "ODBCでMySQLに..." ... strSql = "SELECT * FROM ..." rs.Open strSql, cn 'ここに[rs]を入れられたらと思っています Me.Recordset = "" End Sub

  • MSFlexGridでデータの追加の方法は?

    VB6.0 WINXP DB:Oracle10g  よろしくお願いします。 SELECT文でデータベースからデータを取ってきてMSFlexGridにデータを送ったのですが、そのデータに更に追加したいと思います。 ' ADOのオブジェクト変数を宣言する Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim STRSQL As String 'Oracleとの接続 cn.Open "Provider=MSDAORA;" & _ "Data Source=NT;", "scott", "tiger" ' SQLステートメントを指定してレコードセットを作成する re.Open STRSQL = "select * from TOKUI WHERE A01 = 100" rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic 'グリッドに送る Set MSFlexGrid1.DataSource = rs 'ここからのSELECT文を追加したいと思います。 STRSQL = "SELECT TOKUI FROM WHERE A01 = 200" Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic よろしくお願いします。

  • Excelファイルのデータをテーブルへインポートできない

    お世話になります。 このコードは「ここが知りたかった!ACCESS VBA 500の技」 の452ページに載っているものです。 エラーで動作しません。 私には分からないので教えて下さい。 Sub ExceltoMDBTable() Dim adoExcelCon As New ADODB.Connection Dim adoSheetRst As ADODB.Recordset Dim strSQL As String Dim adoMdbCon As New ADODB.Connection adoExcelCon.Open "Driver={Microsoft Excel Driver (*.xls)};" & _ "DBQ=c:\temp\test.xls;ReadOnly=0;" Set adoMdbCon = Application.CurrentProject.Connection Set adoSheetRst = adoExcelCon.Execute("select distinct 得意先コード,得意先名 from [Sheet1$]") Do Until adoSheetRst.EOF = True strSQL = "" strSQL = strSQL & "insert into test" strSQL = strSQL & " (得意先コード" strSQL = strSQL & " ,得意先名" strSQL = strSQL & " ,登録日 )" strSQL = strSQL & "Values ( '" & adoSheetRst("得意先コード") & "'" strSQL = strSQL & " ,'" & adoSheetRst("得意先名") & "'" strSQL = strSQL & " ,#" & Date & "# )" adoMdbCon.Execute (strSQL) adoSheeyRst.MoveNext Loop adoSheetRst.Close adoMdbCon.Close adoExcelCon.Close Set adoSheetRst = Nothing Set adoMdbCon = Nothing Set adoExcelCon = Nothing End Sub

専門家に質問してみよう