• ベストアンサー

実行時エラー3251

今まで問題なくできていたのですが エクセルのvbaのADOでアクセスにレコードを追加していました。 なんだか今日いきなりエラーになりました。 エラー内容は 実行時エラー3251 現在のRecordsetは更新をサポートしていません。 プロバイダ―か、選択されたロックタイプの限界の可能性があります です。 発生したコードは rs("不可") = エラー文字列 です。 要するに、今までは更新できるテーブルだったけど 何かの拍子で更新できないテーブルになってしまったから エラーになったのでしょうか?

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

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

・Accessで開いて、レコード操作できる(vbaでやっているのと同じ更新/レコード追加)か、ご確認を。 ・主キーなどのインデックスがなくなったとか・・・ご確認を。 ・データベースが壊れている可能性も・・・・バックアップをとったうえで修復を。

関連するQ&A

  • 実行時エラー -2147217887

    一つのアクセスファイルに エクセルからADOでデータを追加しているのですが その外套のアクセスファイルも捜査をしているタイミングで 実行時エラー -2147217887 他のユーザー が同じデータに対して同時に更新を試みているので、 プロセスが停止しました。 と表示されますが このエラーを表示せず、エクセルADOを優先されるには どういうコードにすればいいですか? ちなみに一度中断モードにして 同じコードを再度実行しようとすると 実行時エラー -2147217887 Update または CancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です とエラー内容が変わります。 コードは rs.Open "SELECT * FROM テーブル", cn, adOpenStatic, adLockPessimistic rs.Filter = "番号 = " & 番号 rs("フィールド") = str文字 ’ココでエラー の時です。

  • 実行時エラー3021

    実行時エラー3021「BOFとEOFのいずれかTRUEになっていか、または現のレコード要求された操作には、現在のレコードが必要です。」 というエラーが発生します。 エラーになるコードの一部を掲載します。 コードの内容は、アクセスのT_店名テーブルで、str店名の値同じレコードの地図フィールドの値を取得する内容です。 地図フィールドがnullなら何も取得しないようにifステートメントで分けています。 ------------------------------------------------------------ str店名="abc会社" rs.Open "SELECT * FROM T_店名", cn, adOpenStatic, adLockPessimistic rs.Filter = "店名 = '" & str店名 & "'" If IsNull(rs("地図")) = True Then Else ’ここでエラーになる str地図 = rs("地図") End If rs.Close: Set rs = Nothing ------------------------------------------------------------ "abc会社"は、コード上(VBA上) IsNull(rs("地図")) = True では、Falseになってしまい、 str地図 = rs("地図") でエラーになります。 目で見た限り "abc会社"は、T_店名テーブルに存在しますし、 地図フィールドはNullっぽいです。 なのになぜ If IsNull(rs("地図")) = True Then で、True にならないのでしょうか? True にならないために、 str地図 = rs("地図") で、実行時エラー3021というエラーになってしまうようです。

  • 実行時エラー3021

    For i = 1 To rs.RecordCount 番号 = rs("番号") rs.MoveNext Next こんな感じで、ADOでループしているのですが、 一番最後のレコードで、 実行時エラー3021 「BOFとEOFのいずれかTRUEになっているか、 または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 が発生します。 rs.Open "SELECT * FROM T全て", cn, adOpenStatic, adLockPessimistic この部分に問題があるのでしょうか? adOpenStatic, adLockPessimistic この部分はコピペで、意味が分からないまま使っています。

  • 実行時エラー'9':インデックスが有効範囲にありま

    WindowsXPで、Access2002を使用しています。 テーブル1のフィールド1の値を、ハイフン区切りで分割して、フィールド2とフィールド3へ格納するVBAを作成しようとしていますが、あと少しのところでエラーになってしまって解決策が見当たりません。 エラー内容は、「実行時エラー'9':インデックスが有効範囲にありません。」で、下記VBAの rs.Update "フィールド3", ksplit(1) の部分のksplit(1)の格納場所が無かった為に発生していると思います。 実際、その部分を無効にすると、エラーは無くなりますが、フィールド3のデータも必要です。 このようになって欲しいです。 例) テーブル1 フィールド1 フィールド2 フィールド3 1000-100       1000       100 50-301         50       301 Private Sub コマンド0_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic Do Until rs.EOF Dim ksplit As Variant ksplit = Split(rs!フィールド1, "-") rs.Update "フィールド2", ksplit(0) rs.Update "フィールド3", ksplit(1) Debug.Print rs!フィールド2,rs!フィールド3 rs.MoveNext Loop rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 以上、初心者で、行き詰っておりますので、よろしくお願いします。

  • 実行時エラー3021「BOFとEOFのいずれかTR

    Sub test() Set cn = CurrentProject.Connection rs.Open "T分類", cn, adOpenStatic, adLockPessimistic rs.Filter = "中分類 = '不明' And (大分類 <> '不明')" For i = 1 To rs.RecordCount str大分類 = rs("大分類") rs("中分類") = str大分類 & "(不明)" rs.Update rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub アクセスADOで上記のようなコードなのですが よく意味の分からないエラーが発生します。 コードの内容は 大分類が不明ではなく中分類が不明なら 中分類のレコードに大分類の値+不明にする です。 例えば該当のレコードが8レコードあれば i=5の時に、 実行時エラー3021「BOFとEOFのいずれかTRUE になっているか、 または現在のレコードが削除されています。 要求された操作には、 現在のレコードが必要です。」 が発生します。 規則としては rs.RecordCountの半分の値までは大丈夫ですが rs.RecordCountの半分+1の時に 上記のエラーが発生します。 ADOでデータの追加をする時にAddNewメソッドを入れ忘れた場合も 上記と同じエラーが発生しますが 今回のコードはフィルターをかけ 更新したいレコードを掴んでいるので AddNewメソッドは不要だと思っています。

  • ACCESSで実行時エラー3008

    ACCESS2000でデータベースを作っています。ADOやDAOは使っていません。 フォームにあるテーブルのデータシートを表示していて、そのフォームのボタ ンクリックイベントでダイアログ形式で別のフォームを表紙し任意の主キーを 取得して、DoCmd.RunSqlで表示しているテーブルに対してUPDATEを投げたいの ですが、 "実行時エラー3008 ・・・排他的に開いているか、ユーザーインターフェイス を介しているので、操作する事はできません。"というエラーがでます。 どうすればクエリが実行できますでしょうか? [ツール]-[オプション]-[詳細]の"既定の開くモード"は"共有モード"に、"既定 のレコードロック"は"ロックしない"にしています。

  • フォームで1レコード削除したのに表示は残ったまま更新されない

    Accessフォーム(表形式)に[削除]ボタンをつけました。 VBAで削除ボタン_Click()を書きました。 ADO接続 SQL発行し、該当レコード削除 (Delete from 予約 where 予約ID= me.予約ID ) というコードです。 削除後も、フォームにはレコードが見えたままなのですが、表示を更新するにはどうしたら良いのでしょうか? ----------------------------------- Set rs = Me.Recordset.Clone '' 予約テーブルからレコード削除処理 ... Me.Requery ----------------------------------- というやり方は、DAOだそうですね。 ADOではフォームのレコードソースを指定できないと参考書にありました。 しかし、DAOでは Delete SQL 発行の仕方がわからないので、できればADOで実現したいのです。 無理でしょうか?

  • MS-ACCESSで、レコードセットを取得したい。

    MS-ACCESS2000での質問です。 VBAのコードで、任意のテーブルから、レコードセットを取得して、ADO.Recordset変数に代入したいのですが、どのような記述をすれば、出来ますでしょうか? 最終的にはそのレコードセットの各レコードに操作をしたいのです。 よろしくお願いします。

  • ACCESSのFindコマンドが遅い

    ACCESS2000でORACLEにリンクテーブルをはり、更新するプログラムを作成しています。 そこでADOでFINDコマンドを使用しているのですが、かなり遅く困っています。 どのようにすれば、早くロック付きの更新ができますでしょうか? Set cn = Application.CurrentProject.Connection Set rs = New ADODB.Recordset cn.BeginTrans rs.Open "テーブル名", cn, addopenkeyset, adLockOptimistic rs.MoveFirst strKey = "ankKey = 'aaa'" rs.Find strKey rs.ankA = "あ" rs.Update cn2.CommitTrans キィを変えてLOOPさせ更新させていると 複数ステップのOLE DBの操作でエラーが発生しました。各OLE DBの状態の値を確認してください。作業は終了しませんでした。 のエラーになります。 1行1行みてみると異常にFINDが遅いものがあり、これが原因でないかと思うのですが、 どのようにロック付きの更新を変更すればいいのかがわかりません。 どのように変更すればいいのでしょうか?

  • BOF と EOF のいずれかが True になっ

    アクセスVBAです。 rs.Open "Q内容", cn, adOpenStatic, adLockPessimistic For intNo詳細 = 1 To rs.RecordCount Call 詳細テーブル_rs_1行のレコードを生成する rs.MoveNext Next intNo詳細 --------------------------------------------------------- の様に、loopしているのですが、 intNo詳細の最高値が100の場合、100の時に、 「BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」 と言うエラーになっています。 ADOで更新・削除・追加は行っていません。 テーブルのデータを取得しているだけです。 それなのになぜ最後の値でエラーになるのでしょうか? AbsolutePageとAbsolutePositionは、adPosEOFになっています。

専門家に質問してみよう