[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『他のユーザーが使用している』(ひご寝屋)
エクセル2010でadoを使用しデータの検索と更新を行っているのですが、データを更新するときに以下のエラーメッセージが表示されます。
「他のユーザーが同じデータに対して同時に変更を試みているので、プロセスが停止しました。」
どのようにすればよいのでしょうか?
サーバーの再起動、クライアントの再起動をおこなっても解決できませんでした。
保存と検索などはできます。
宜しくお願いします。
ちなみにadoのドライバーはexcel driverです。
< 使用 Excel:Excel2010、使用 OS:unknown >
サーバとクライアント、両方を再起動した後にマクロ実行しただけで排他のエラーになるということは、
そのマクロ内で排他したDBに対し、複数の接続を行っているのではないでしょうか? つまり、バグ。
読み込みだけでも排他しているとか、closeしていないとか、書き込みには別のオブジェクトを作っているとか。
ソースコードとかDB構造をを見せてもらわないと、問題箇所なんて全く判りませんよ。
(???) 2015/03/24(火) 16:12
やはりバグの可能性が高いのですかね?
ただ、気になるのが、
Excel2003ではエラーになりません。
同じファイルをExcel2010で実行すると、排他のエラーがでます。
プログラムはExcel2003で作成しました。
なにか違いがあるのでしょうか?
(ひご寝屋) 2015/03/24(火) 16:29
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
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
OLE DB接続に変えるとどうなるか試して欲しいのと、データ量が少なければ再現しなくなるかどうかを試して欲しいですね。
OLE DB利用にすると、データのあるブックをxlsxまたはxlsmに変えることになります。互換で2003形式を開くところを疑っています。
(2003形式をODBC接続でも、数レコードの実験では成功していますけどね)
(???) 2015/03/27(金) 08:56
OleDBでも、データ量減らしてもだめでした。
ただ、ブックの共有にするといけました。時間がかかりすぎですが・・・。
なんなのでしょうね?
(ひご寝屋) 2015/03/27(金) 12:00
ステップ実行してみて、何処で他の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/04/02(木) 15:04
変換して、マクロ有効ワークシートにしてもだめでした。
データの一部がupdateするとだめのようです。
(ひご寝屋) 2015/04/02(木) 15:55
数式が入っているセルがあるならば、CTRL+@で数式表示状態にしてからコピーすればOK。
(???) 2015/04/02(木) 16:28
データシートの値のみを別シートにコピーする。
その後、データシートを削除してから新たにシートを作成し、そこにデータのみを貼り付けたらいけました。
但し、なぜかシートの書式を日付に変えるとエラーになってしまいます。
書式ってなにか関係があるのでしょうか?
(ひご寝屋) 2015/04/03(金) 10:16
なぜか、空白行がありました。PGを見直さないといけないですね。
**********************
あと、別件なのですが、質問があります。
更新モードでオープンしたコネクションを使用し検索と更新を行った場合、例えば、Aシートを先に検索して、その後にAシートに更新をかけると排他が勝手にかかるのでしょうか?
オブジェクト(コネクション)分けたら、排他のエラーがでなくなったため、知識不足のため少し疑問に思っております。
更新と検索でコネクションをわけるのが普通なのでしょうか?
また、分けるのが普通の場合、そのようにするのはなぜでしょうか?
宜しくお願いします。
(ひご寝屋) 2015/04/04(土) 12:02
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.