[[20150324150026]] 『他のユーザーが使用している』(ひご寝屋) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『他のユーザーが使用している』(ひご寝屋)

エクセル2010でadoを使用しデータの検索と更新を行っているのですが、データを更新するときに以下のエラーメッセージが表示されます。

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

どのようにすればよいのでしょうか?
サーバーの再起動、クライアントの再起動をおこなっても解決できませんでした。

保存と検索などはできます。

宜しくお願いします。

ちなみにadoのドライバーはexcel driverです。

< 使用 Excel:Excel2010、使用 OS:unknown >


ODBC経由で、EXcelシートをDB扱いしている、ということですね?

サーバとクライアント、両方を再起動した後にマクロ実行しただけで排他のエラーになるということは、
そのマクロ内で排他したDBに対し、複数の接続を行っているのではないでしょうか? つまり、バグ。
読み込みだけでも排他しているとか、closeしていないとか、書き込みには別のオブジェクトを作っているとか。

ソースコードとかDB構造をを見せてもらわないと、問題箇所なんて全く判りませんよ。
(???) 2015/03/24(火) 16:12


返信ありがとうございます。

やはりバグの可能性が高いのですかね?

ただ、気になるのが、
Excel2003ではエラーになりません。
同じファイルをExcel2010で実行すると、排他のエラーがでます。
プログラムはExcel2003で作成しました。

なにか違いがあるのでしょうか?
(ひご寝屋) 2015/03/24(火) 16:29


バージョンが違う!? 2003以前と2007以降は、仕組みが変わっているので、その影響かも。
例えば、古いバージョンでは以下のように、JETを使います。
    Dim CN As New ADODB.Connection
    CN.Provider = "Microsoft.Jet.OLEDB.4.0"
    CN.Properties("Extended Properties") = "Excel 8.0"
    CN.Open "C:\test\DB.xls"

2007以降だと、こうなります。

    CN.Provider = "Microsoft.ACE.OLEDB.12.0"
    CN.Properties("Extended Properties") = "Excel 12.0"
    CN.Open "C:\test\DB.xlsm"

詳しくは、現状のコーディングを見ないとなんとも…。
ODBCを使わずともシートをDB扱いできるので、この例から調べてみてください。
(???) 2015/03/24(火) 17:27


返信ありがとうございます。

adoCon.Open "Driver={Microsoft Excel Driver (*.xls)};" & _

                "DBQ=" & ThisWorkbook.FullName & ";" & _
                "ReadOnly=0"

上記でオープンしたものをSelectで他のシート(A)のデータを引っ張ってきて、その条件にもとづいて別のシートのデータ(B)をupdateしているのですが、updateするとエラーメッセージが表示されます。

保存ボタン(フローピーマーク)をおしてから、すぐに登録ボタン(マクロ)を押下してしまい排他がかかってしまったのかなとも思います。

Excel2010ではシートのデータのコピーは手動でできています。
adoを使用し、更新するとエラーがでます。

ちなみに
Excel2010で排他の解除方法とかはありますでしょうか?
(ひご寝屋) 2015/03/25(水) 18:57


ブック保存からマクロ実行までの時間が影響するなら、マクロ実行ボタンをゆっくり押すだけですよね。排他情報はブックを閉じてしまえば消えますから、問題ないはず。

構成的には、読みだけのシートと、更新する対象のシートがあるのですね。
排他するかどうかは、ReadOnly=0 というのが読み書き可能の意味なので、これを1にすれば読みだけになり、排他されなくなるはずです。

ODBC接続とOLE DB接続は、どちらでもできることは同じはずなのですが、自ブック内のシートという点が気になります。
2003以前では、自ブック内シートを扱った場合、何かが解放されきれずにメモリリークしていくという不具合がありました。
データ量が増えていったり、DBを使用する回数が増えていくといろいろ問題が出てましたが、今回のケースは2010の問題ですよねぇ。
が、コーディングが2003時と同じな点が気になるので、別ブックのシートを扱うように変更してみて、どうなるか見てみてください。
(xlsx形式にして、OLE DB接続すれば手堅いのですが…)

といっても、リークの問題と排他の問題では関連しない可能性大。ですが、旧形式のブックを互換オープンしており、上記不具合が影響してしまっている可能性が気になりました。
(???) 2015/03/26(木) 09:31


実際に、2003形式ブックに元データシートと出力先シートを用意。以下のようなマクロを実行してみましたが、何も問題は起こりませんでした。
メモリリーク問題も出ないようですね。直ってる。自ブック内シートでも、排他問題は出ないようです。

 Sub test()
    Dim adoCon As Object
    Dim RS As Object
    Dim cw As String

    Set adoCon = CreateObject("ADODB.Connection")
    Set RS = CreateObject("ADODB.Recordset")

    adoCon.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
                "DBQ=" & ThisWorkbook.FullName & ";" & _
                "ReadOnly=0"

    cw = "select * from [Sheet2$] where F1=3"
    RS.Open cw, adoCon

    cw = "update [Sheet3$] set F2='" & RS("F2") & "',F3='" & RS("F3") & "' where F1=3"
    adoCon.Execute cw

    RS.Close
    adoCon.Close
 End Sub

マクロ実行は、もしかしてサーバ上のブックだったりしますか? ローカルに持ってくるとどうなりますか?
ローカルだったとして、ウィルスチェックのアプリ等が、勝手にファイルを開いていたりしませんか?
(???) 2015/03/26(木) 10:06


返信、ありがとうございます。

最初の頃はちゃんと更新できました。

いつのまにかできなくなりました。

adoを起動すると、Excelがもうひとつ開くぐらいですが、2003でも同じです。

なにか関係があるのでしょうか?

簡単な調べ方などを教えてくれると助かります。
(ひご寝屋) 2015/03/26(木) 19:03


Excelがもうひとつ開く? 自ブック内のシートをDB参照し、別シートにDB更新ですよね? なんだろう…。
問題のブック自体を見ないことには、お手上げです。

OLE DB接続に変えるとどうなるか試して欲しいのと、データ量が少なければ再現しなくなるかどうかを試して欲しいですね。

OLE DB利用にすると、データのあるブックをxlsxまたはxlsmに変えることになります。互換で2003形式を開くところを疑っています。
(2003形式をODBC接続でも、数レコードの実験では成功していますけどね)
(???) 2015/03/27(金) 08:56


返信ありがとうございます。

OleDBでも、データ量減らしてもだめでした。

ただ、ブックの共有にするといけました。時間がかかりすぎですが・・・。

なんなのでしょうね?

(ひご寝屋) 2015/03/27(金) 12:00


別のExcelが立ち上がること。ブックを共有すると通ること。
やはり、何故かもう1つExcelが立ち上がっているのが原因ですねぇ。

ステップ実行してみて、何処で他のExcelが立ち上がるかを特定してみてはいかがでしょうか。
(???) 2015/03/27(金) 13:41


返信、ありがとうございます。

調べてみます。

後、Excelファイルの修復?最適化みたいなものってExce2010にはないのですかね?

(ひご寝屋) 2015/03/27(金) 15:09


 この機能かどうかはわからないが。

 ファイル-開くでブックを選択後、右下の「開く」の右の下三角ボタンをクリック、「開いて修復する」を選択。
(ねむねむ) 2015/03/27(金) 15:21

返信、ありがとうございます。

修復をこころみたのですが、エラーがでてボタンなどが図形化されてしまいました。

残念です。
(ひご寝屋) 2015/03/27(金) 16:55


原因はよくわかりませんが、別シートには更新できたので、それで対応しようと思います。

皆様、ありがとうございました。
(ひご寝屋) 2015/03/30(月) 17:18


ブックが壊れていた…、ということですかねぇ。
(???) 2015/03/30(月) 17:22

返信、ありがとうございます。

できたと思っておりましたが、勘違でした。一部のデータのみコピーしたら、更新できたのですが、全てのデータを別シートにコピーして、それを更新するとエラーになりました。

データ?それともエクセルが排他情報をもっている?
なぞです。

(ひご寝屋) 2015/04/02(木) 15:04


この際だから、open方法を変更の上、2007形式のブックに移行してしまってはいかがでしょうか。
少量のデータをコピーした状態なら動作した、というならば、サイズ的には現行のファイル形式の方が強いですから、直る可能性大です。
(???) 2015/04/02(木) 15:36

返信、ありがとうございます。

変換して、マクロ有効ワークシートにしてもだめでした。

データの一部がupdateするとだめのようです。
(ひご寝屋) 2015/04/02(木) 15:55


2007形式に移行する際、ブック丸ごと別名保存したとか、シート丸ごとコピーしてませんか?
壊れている可能性があるのだから、面倒でも値だけ別シートにコピーしていきましょう。
(自動修復するとおかしな結果になったくらいなのだから、どこか壊れているかと)

数式が入っているセルがあるならば、CTRL+@で数式表示状態にしてからコピーすればOK。
(???) 2015/04/02(木) 16:28


返信、ありがとうございます。

データシートの値のみを別シートにコピーする。
その後、データシートを削除してから新たにシートを作成し、そこにデータのみを貼り付けたらいけました。

但し、なぜかシートの書式を日付に変えるとエラーになってしまいます。

書式ってなにか関係があるのでしょうか?
(ひご寝屋) 2015/04/03(金) 10:16


なにか日付型にしようとしている列内に、DBとしてはまずい情報があるのでしょうか。例えば空欄とか、不正文字とか。
元データでオートフィルタをかけてみて、フィルタできる項目の中に、何か不正なものがないか調べてみてください。
(???) 2015/04/03(金) 10:34

返信、ありがとうございました。

なぜか、空白行がありました。PGを見直さないといけないですね。

**********************
あと、別件なのですが、質問があります。

更新モードでオープンしたコネクションを使用し検索と更新を行った場合、例えば、Aシートを先に検索して、その後にAシートに更新をかけると排他が勝手にかかるのでしょうか?

オブジェクト(コネクション)分けたら、排他のエラーがでなくなったため、知識不足のため少し疑問に思っております。

更新と検索でコネクションをわけるのが普通なのでしょうか?

また、分けるのが普通の場合、そのようにするのはなぜでしょうか?

宜しくお願いします。

(ひご寝屋) 2015/04/04(土) 12:02


ReadOnly=0、としてopenしているならば、排他ですね。

1つのDBを複数openする場合、一方はリードオンリーにして開きっぱなしにして、他方は必要な時だけ排他openすると良いでしょう。
(更新するかどうか調べている間はロック不要で、更新するときだけロックする、という動作にできます)
(???) 2015/04/06(月) 12:01


返信ありがとうございます。

やはり排他かかるようですね。今度から気をつけたいと思います。

結局、データの問題と排他の問題が原因だとわかりました。

助かりました。
(ひご寝屋) 2015/04/06(月) 14:12


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.