質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • VBA

    1899questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

EXCEL自ブック内のシートに対するADODB操作について【排他エラー】

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,770

ABCDEEFG

score 14

前提・実現したいこと

EXCEL VBAで、Sheet1[Data]に元データを持ち、
必要な情報だけを抽出して、Sheet2に表示する機能を作っています。
また、Sheet2で編集した情報を使い、
Sheet1[Data]を更新するような仕組みにもなっています。

データの呼び出し・更新にはADODBを利用して、
シートをデータベースのようにSQLを発行して操作していますが、
データベースへの更新のタイミング「dbCmd.Execute」で
下記のメッセージが出てしまいます。

※更新データは150行くらいありますが、エラーが発生するのは
毎回決まった行です。(データ内容は全て同じ)

何が原因なのでしょうか?

発生している問題・エラーメッセージ

実行時エラー'-2147467259(80004005)':

他のユーザが同じデータに対して同時に変更を試みているので、プロセスが停止しました。

該当のソースコード

Public Function updDataView() As Boolean

    Dim dbCon As Object
    Dim dbCmd As Object
    Dim strSQL As String
    Dim tgtRow As Long

    Set dbCon = CreateObject("ADODB.Connection")
    Set dbCmd = CreateObject("ADODB.Command")
    dbCon.Provider = "Microsoft.Ace.OLEDB.12.0"
    dbCon.Properties("Extended Properties") = "Excel 8.0;"

    dbCon.Open ThisWorkbook.FullName
    dbCmd.ActiveConnection = dbCon

    For tgtRow = 1 To Range("CHKVIEW").Rows.Count

        strSQL = ""
        strSQL = strSQL & vbCrLf & "UPDATE [DATA$] SET"

        'BLNO(SO No.)
        strSQL = strSQL & vbCrLf & "  A0001 = 'A'"
        strSQL = strSQL & vbCrLf & ", A0002 = 'B'"
        strSQL = strSQL & vbCrLf & ", A0003 = 'C'"
        strSQL = strSQL & vbCrLf & ", A0004 = 'D'"
        strSQL = strSQL & vbCrLf & ", A0005 = 'E'"
        strSQL = strSQL & vbCrLf & ", X9002 = now()"
        strSQL = strSQL & vbCrLf & "WHERE A0000 = '1'

        dbCmd.CommandText = strSQL
        dbCmd.Execute
    Next tgtRow

End Function

試したこと

dbCon.Provider = "Microsoft.Ace.OLEDB.12.0"
の部分を、
dbCon.Provider = "Microsoft.Jet.OLEDB.4.0"
にすると、正常に動作します。

また、エラー画面でデバッグへ移ると、
「dbCmd.Execute」で停止していますが、
F5を押すと、そのまま正常に継続処理可能です。

ループの開始前と後にトランザクションをかませてみたり、
更新時点にWaitを入れてみたりしましたが、改善には至りませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

Excel2010 32ビット版を使用。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

>dbCon.Open ThisWorkbook.FullName
ADOを使ってワークブックを操作する場合は、操作するワークブックと実行するワークブックは分けたほうが良いですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 14:24

    やはりそうなのですね・・・。
    WEB上では自BOOKに対して接続しているサンプルも
    多く見受けられたので大丈夫かと思っていましたが。。。

    今回は、データを持っているシートを別BOOKに分けると影響が大きそうでしたので、
    エラートラップで拾うようにして、該当エラーの場合は
    Resume Nextで継続処理するようにしました。

    ご回答有難う御座います!

    キャンセル

同じタグがついた質問を見る

  • VBA

    1899questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。