Excel VBAでのEOFエラーの解消方法とは?

このQ&Aのポイント
  • Excel VBAを使用してテキストボックスにDateを入力し、SQL Serverに接続し、Selectの結果をシートに書き込む際に発生するEOFエラーについて、解消方法を教えてください。
  • EOFエラーは、「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています」というエラーメッセージが表示されるものです。このエラーの原因と解決策について詳しく教えてください。
  • EOFエラーが発生する原因の一つは、Recordsetオブジェクトが最後のレコードに到達した後に更にMoveNextメソッドを呼び出した場合です。この状態でフィールドにアクセスしようとすると、EOFエラーが発生します。この場合、EOFエラーを回避するためにはどうすれば良いのでしょうか?
回答を見る
  • ベストアンサー

Excel VBA EOFに関して

テキストボックスにDateを入力し、SQLServerに接続しSelectの結果をシートに書き込むだけのものなのですが、「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています」というエラーでさっぱりわかりません。どなたかアドバイスをお願い致します。 -前後省略- stdate = UserForm1.stdate.Value endate = UserForm1.endate.Value strsql = "select ***" strsql = strsql & "from ***" strsql = strsql & "where *** and ***.start_date between '" & stdate & "' and '" & endate & "' " con.Open connectionString Set rs = con.Execute(strsql) Sheets("Data1").Select rs.MoveFirst i = 2 Do Until rs.EOF Cells(i, 1) = rs.Fields(0).Value Cells(i, 2) = rs.Fields(1).Value Cells(i, 3) = rs.Fields(2).Value Cells(i, 4) = rs.Fields(3).Value i = i + 1 rs.MoveNext Loop con.Close Set con = Nothing Exit Sub Err_DBConnectOpen: MsgBox Err.Description If con.State <> ADODB.adStateClosed Then con.Close End If Set con = Nothing End Sub

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

  • ベストアンサー
  • jam-best
  • ベストアンサー率27% (94/344)
回答No.3

問題ないように見えますが。 せめてデバッグして、どこでエラーになっているかは見てみたらどうでしょうか。 DBの接続はできてるのか。 sqlの実行は上手くいってるのか。 rsの中身をみてみるなど。 rsのNothingも必要かと思います。

luvyak
質問者

お礼

ありがとうございます。 デバッグしたところ実際のデータが指定した日付では既にアーカイブされていたことが判明致しました。その為にEOFがTrueに読みこんだ時からなっていたようです。 お騒がせしました。

その他の回答 (2)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

ソースはまだ読んで居ませんが……。 どの行でエラーが出ているのか補足してください。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

rs.MoveFirst これ、不要じゃないですか?

luvyak
質問者

補足

rs.MoveFirstを入れなくても現象はかわりません。

関連するQ&A

  • Excel VBA ADOでのCSV取込みについて

    下記は、Excel VBAでADOを使って、CSVデータを取り出すソースです。ソースは、とあるサイトからほぼ丸写しです。 Sub main()   Const DRIVER As String = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ="   Const PROVIDER As String = "Provider=MSDASQL;Extended Properties="""   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Dim idx As Integer   Dim strSQL As String   cn.ConnectionString = PROVIDER & DRIVER & "C:\"""   cn.Open   '全件数取得   strSQL = "SELECT * FROM Sample.csv"   'CSVファイルの内容を取得   Set rs = cn.Execute(strSQL)   rs.MoveFirst   Do Until rs.EOF     For idx = 0 To rs.Fields.Count - 1       Debug.Print rs.Fields(idx).Value '←ここ     Next idx     rs.MoveNext   Loop   Set rs = Nothing   cn.Close   Set cn = Nothing End Sub ここで、「'←ここ」と示した行のrs.Fields(idx).Valueって、実際には「001」と書かれた値は、ダブルクォーテーションでも入ってない限りは「1」と変換されちゃいますよね?これをちゃんと、実際の値「001」のまま取得することって出来ないのでしょうか?

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

  • EXCEL→SQL VBAを簡略化したい

    EXCELのVBAを使って、SQLサーバーに接続し、 データテーブルを開き、データを200個(xが100個、yが100個) 書き込みさせたいプログラムを作っています。 強引に1つ1つ書き込みし、200個登録は出来たのですが、 もっとプログラムを簡略化したいと思います。 以下に内容をしめします。 ------------------------------------------- 'SQLデータベースに接続 Set rs = CreateObject("ADODB.RecordSet") Set CN = CreateObject("ADODB.Connection") CN.ConnectionString = "Driver={SQL Server};" & _ "server=○○○.○○.○○.○○; database=DB ; uid=ID; pwd=1234;" CN.Open '-----[Dataテーブル] ----- Set rs = New Recordset rs.Open "Data", CN, adOpenKeyset, adLockOptimistic '[Dataテーブル]に書込み rs.AddNew Worksheets("Sheet1").Select '☆☆☆ rs!x1 = Cells(10, 5).Value rs!x2 = Cells(11, 5).Value rs!x3 = Cells(12, 5).Value rs!x4 = Cells(13, 5).Value    ・    ・     ・    ・ rs!x100 = Cells(109, 5).Value rs!y1 = Cells(10, 7).Value rs!y2 = Cells(11, 7).Value rs!y3 = Cells(12, 7).Value rs!y4 = Cells(13, 7).Value    ・    ・     ・    ・ rs!y100 = Cells(109, 7).Value '☆☆☆ '保存 rs.Update MsgBox "追加しました" '後処理 rs.Close: Set rs = Nothing CN.Close: Set CN = Nothing '終了処理 Set rs = Nothing Set CN = Nothing ------------------------------------------- '☆☆☆で挟まれた部分を繰り返し文で簡潔にプログラミングしたいです。 自分が考えた以下の分では、エラーが出てしまいました。   i = 1   n = 10 Do While i < 100    rs!x"& i &" = Cells(n, 5)    rs!y"& i &" = Cells(n, 7)   i = i + 1   n = n + 1 Loop よりシンプルな構文にしたいと思います。 お手数おかけいたしますが、わかる方いらっしゃいましたら 教えて下さい。

  • 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

  • エクセルからSQLサーバー接続 日付範囲Where

    エクセルから、SQLServer2012へ接続しデータを抽出したいのですが、「'>'付近に不適切な構文があります。」のエラーでうまく抽出できません。 テーブル:IncRevDat カラム ・利用日 ・申込先名 ・利用数 ・計上人員 ・計上料金 実行したいSQL文 select 利用日, 利用数, 計上人員, 計上料金 From IncRevDat Where 利用日 >= セルB3の値 And セルD3の値 Order By 利用日 Public Sub GetData() Dim con As New ADODB.Connection Dim connectionString As String Dim sDBSever As String Dim sDBName As String Dim sLoginID As String Dim sPassWD As String sDBSever = "サーバーホスト名" sDBName = "DB名" sLoginID = "ユーザー名" sPassWD = "パスワード" '接続文字列 connectionString = "Provider=Sqloledb;Data Source=" & sDBSever _ & ";Initial Catalog=" & sDBName _ & ";Connect Timeout=15" _ & ";user id=" & sLoginID _ & ";password=" & sPassWD _ & "" On Error GoTo Err_DBConnectOpen '接続 con.Open connectionString 'SQL文を実行(RecordSETで受け取ります) Dim sql As String 'SQL文 sql = "" sql = sql & " SELECT 利用日,,利用数,計上人員,計上室料" & vbCrLf sql = sql & " FROM IncRevDat" & vbCrLf sql = sql & " WHERE 宿泊日 >= " & Cells(3, 2) & "" sql = sql & " AND <= " & Cells(3, 4) & "" & vbCrLf sql = sql & " ORDER BY 利用日" & vbCrLf Set rs = con.Execute(sql) Debug.Print sql 'セルをクリア Range(Range("A4"), ActiveSheet.Cells.SpecialCells(xlLastCell).Address).Select Selection.ClearContents '結果をセルに書き込む Dim i As Long Dim j As Long 'フィールド名をセルに書き込む If rs.EOF Then Cells(5, 1) = "情報が有りません。" Else rs.MoveFirst i = 5 For j = 1 To rs.Fields.Count Cells(i, j) = rs.Fields(j - 1).Name Next i = i + 1 Do Until rs.EOF = True For j = 1 To rs.Fields.Count Cells(i, j) = rs.Fields(j - 1).Value Next rs.MoveNext i = i + 1 Loop End If rs.Close: Set rs = Nothing '接続を閉じる con.Close: Set con = Nothing Exit Sub 'エラー処理 Err_DBConnectOpen: MsgBox Err.Description Debug.Print sql 'Connectionの状態を確認し、クローズ If con.State <> ADODB.adStateClosed Then con.Close End If Set con = Nothing End Sub Where句の部分をコメントアウトし、全出力すると正常にデータを読取ってくれます。 Debug.Printの内容 SELECT 利用日,利用数,計上人員,計上料金 FROM IncRevDat WHERE 宿泊日 >= 2012/08/01 AND <= 2012/08/31 ORDER BY 宿泊日 私だけが使うのならば、AccessクエリをVBAでたたくのですが、他のスタッフも使いAccessがイントールされていないため、エクセルで処理出来ればと考えております。 Where句のコーディング方法が間違っているとは思うのですが、どこをどう直せばよいかが分からず困っています。 間違いをお教え頂けましたら幸いです。 ※内容に間違いが有りましたので、数回質問を削除し、再質問しております。 前の質問を見て頂いた方には、ご迷惑をお掛けしてすいませんでした。

  • Access2000 VBAについて質問です。

    Access2000 VBAについて質問です。 下記ソースコードでUPDATE(更新)しているのですが、バチンとAccessが落ちてしまいます。 Private sub UPDATESQL() StrSQL = "SELECT * FROM T_StandardList WHERE ID = " & Me.ID Set ct = CurrentProject.Connection RS.CursorLocation = adUseClient RS.Open StrSQL, ct, adOpenDynamic, adLockOptimistic RS![filed1] = Me![Value1] RS![filed2] = Me![Value2] RS![filed3] = Me![Value3] RS![filed4] = Me![Value4]      Call CloseButton_Click Set RS = Nothing Set ct = Nothing End Sub Private Sub CloseButton_Click() DoCmd.SetWarnings False 'SQLの実行 DoCmd.RunSQL "DELETE FROM T_TempList" DoCmd.Close acForm, Me.Name DoCmd.SetWarnings True End Sub CloseButtonをクリックしても落ちることがあるので、CloseButton_Click関数が怪しいとは感じます。 どなたか詳しい方アドバイスよろしくお願いいたします。 m(_ _)m

  • なぜrs.Move i ではダメなのでしょうか?

    access2003です。 テーブル1には、 フィールド1 あ い う え お が入っています。 Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long Set cn = CurrentProject.Connection rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic For i = 0 To rs.RecordCount rs.Move i Debug.Print rs.Fields(0).Value Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub をすると、 あ い え とイミディエイトウインドウに表示されるのですが Debug.Print rs.Fields(0).Value の部分で 「実行時エラー'3021' BOFとEOFのいずれかTRUEになっていか、または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 となります。 その時のiの値は、3です。 rs.MoveFirst For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next にすると、 あ い う え お が取得されます。 なぜrs.Move i ではダメなのでしょうか? 理由を教えてください。

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

  • VBAのfor next で繰り返しが出来ず・・・

    すいません1つ質問があります。 以前質問させて頂きましたが、ExcelのVlookupでACCESSのクエリを参照してレコードを取得したいです。 ADOでAccessのテーブルから持ってくることは出来ました。 が、繰り返しても最初の数字の9999しかもって来ません・・・。 下記が私の書いたコードとなります。 ExcelシートとACCESSテーブルを画像として添付します。 D2には9999、D3には55555・・・・と持ってくるようにしたいです。 原因と修正法を教えて頂ければ幸いです。 何卒よろしくお願いします。 Option Explicit Sub test() Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim strSQL As String Dim i As Long Dim Maxrow As Long Set db = New ADODB.Connection db.Provider = "Microsoft.ace.oledb.12.0" db.Open "C:\Users\Kei\Desktop\Test\Test.accdb" Set rs = New ADODB.Recordset rs.Open "Ship", db, adOpenStatic Maxrow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Maxrow strSQL = "select * from Ship where 商品名 =" & Cells(i, 1) & ";" Cells(i, 4) = rs!出荷数 Next i rs.Close db.Close Set db = Nothing Set rs = Nothing End Sub

  • ASPでExcelのセルに罫線、色付け

    WebサーバーにExcelがセットアップされてないので、 Set rs=Server.CreateObject("ADODB.Recordset") を使用し、Excelオブジェクトを作成後、 接続文字列、SQLを渡して、レコードセットを開きました。 strSQL = "select * from DATA_RANGE" Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly 以下のようにして、Excelに値をセットすることはできたのですが、 rs.Fields(0).Value = "AAA" 罫線や、色をつける方法がわかりません。 どうかご教授ください。

専門家に質問してみよう