実行時エラー -2147217887とは?エクセルADOの更新エラーを回避する方法

このQ&Aのポイント
  • 実行時エラー -2147217887は、他のユーザーが同じデータに対して同時に更新を試みた場合に発生するエラーです。プロセスが停止します。
  • エクセルADOの更新時に発生するエラーは、UpdateまたはCancelUpdateメソッドに、対応するAddNewまたはEditメソッドが必要であるというエラーです。
  • エラーを回避するためには、アクセスファイルにロックをかけて他のユーザーが更新できないようにするか、他のユーザーが更新を試みた場合は待機するようにすることが重要です。
回答を見る
  • ベストアンサー

実行時エラー -2147217887

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

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

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは https://msdn.microsoft.com/ja-jp/library/cc376533.aspx ここが参考になりますか? エクセルADOを優先するなら、最初からテーブル排他で開くしかないかも。

ypixajovksa
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • 実行時エラー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 この部分はコピペで、意味が分からないまま使っています。

  • 実行時エラー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メソッドは不要だと思っています。

  • データの競合?回避する方法は?

    オフィス2010です。 一つのアクセスファイル(test.accdb)に対して test.accdb自身も自分のファイルの中のテーブルにADOで操作し エクセルからもtest.accdbに対してADOで操作をしています。 rs.Open "SELECT * FROM T", cn, adOpenStatic, adLockPessimistic rs.Filter = "番号 = " & 番号 rs("文") = str文 で発生します。 そのすると 画像の様に 実行時エラー -2147217887(80040e21) 「他のユーザーが同じデータに対して同時に変更を試みているのでプロセスが停止しました」 が発生します。 エクセル側で発生します。 このエラーが出て中断したvbaを再度実行すると エラーのコードは同じですが エラーの内容が 「UpdateまたはCancelUpdateメソッドには、 対応すうAddNewまたはEditメソッドが必要です。」 に変わります。 https://support.microsoft.com/ja-jp/kb/966148 これと同じエラーの番号ですが、現象を読むと 「このエラーは FRx レポート サーバーにレポートの生成時に発生します。」 と書いてありますが、 「FRx レポート サーバーにレポートの生成時」に該当してないように感じます。 原因の「地域設定短い日付形式がエラーを引き起こしています。」に関しても 単独でそれぞれVBAを実行する限りではエラーが発生しない為 これも違うと思います。 SQLServerは一切使っていません。

  • 引数が無効です アクセス ADO AddNew

    アクセスのテーブルにアクセスVBAで値を追加しようとしてるのですが Set cn = CurrentProject.Connection rs.Open "SELECT * FROM TAccess", cn, adOpenStatic, adLockPessimistic rs.AddNew rs("主キー") = Me.txt_主キー.Value rs.Update を実行しようとすると、 rs.AddNewの部分で、「引数が無効です」と言うエラーが発生し、 一時的にVBAコードが止まります。 しかしそのままF5で処理を実行すると、問題なくコードが動き、データが追加されます。 でもかならずrs.AddNewでエラーが発生します。 エラーが発生するのにそのまま実行すると問題ないのはなぜでしょうか? 「引数が無効です」は、どういう意味のエラーなのでしょうか?

  • アクセス2000の実行時エラー'-2147352567(80020009)'に関して

    Windows2000にて、先日までエラーの出なかったコードがいきなりエラーになって困っています。 フォーム上で単純なテキストボックスを配置し、入力値の加工用サブルーチンに飛ぶときに、 「Update または CancelUpdate メソッドには、対応する AddNew または Edit メソッドが必要です。」 の実行時エラーが出ます。 テキストボックスの object名 RTrimTest に対するコードは、以下のものだけです。 Private Sub RTrimTest_LostFocus()   If IsNull([RTrimTest]) Then [RTrimTest] = Space$(20)   [RTrimTest] = Left(RTrim([RTrimTest]) & Space$(20), 20) End Sub 実行時のエラーメッセージもなんかスッキリしないのですが、どなたかこの現象に関してご存知の方がいらっしゃいましたら、ご教授ください。

  • adoでBetween は使えないのでしょうか?

    ADOで期間で抽出したいのですが rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 = #2015/01/01#" は問題なく通るのですが、 rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 Between #2015/01/01# And #2015/01/31#" だと 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 と言うエラーになります。 adoでBetween は使えないのでしょうか?

  • 実行時エラー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というエラーになってしまうようです。

  • 実行時エラー3251

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

  • ADO WHERE句でエラーになる

    アクセス2003です。 ADOを使ってテーブル1の済「 (Yes/No型) 」に rs.Open "テーブル1 WHERE 済=True", cn, adOpenStatic, adLockPessimistic と言う風にフィルタをかけたいのですが 「キーワードWHERE''付近意不適切な構文があります。」 というエラーがでてしまいます。 どこか文法がおかしいでしょうか?よろしくお願いします。

  • vbaを修正するとADOが実行できなくなる。

    アクセス2003、vistaを使用しています。 vbaを使っていて、ADOを使っています。 アクセスを使っている間に いくつか修正したいところがあり、vbaコードをいじって保存し、 vbaを実行すると、 CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.FullName ←の部分で RS.Open "Qタイトル", CN, adOpenStatic, adLockPessimistic 実行時エラー '-2147467259(80004005)' 「マシン '<マシン名>' のユーザー 'Admin' が データベースを開けない状態、またはロックできない状態にしています。」 となります。 一度ファイルを閉じて再度開くと問題なく作業できますが これは何故起こるのでしょうか? 一応調べてみましたが http://www.accessclub.jp/bbs/0017/beginers7727.html http://okwave.jp/qa4388870.html 解決には至りませんでした。 よろしくお願いします。

専門家に質問してみよう