Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


610 / 2272 ツリー ←次へ | 前へ→

【10900】エクセルからアクセスへAddNewで ON 08/12/31(水) 11:08 質問[未読]
【10907】Re:エクセルからアクセスへAddNewで ON 09/1/6(火) 15:38 質問[未読]
【10908】Re:エクセルからアクセスへAddNewで ON 09/1/6(火) 17:11 質問[未読]
【10910】Re:エクセルからアクセスへAddNewで ON 09/1/6(火) 18:49 質問[未読]
【10912】Re:エクセルからアクセスへAddNewで neptune 09/1/6(火) 22:32 発言[未読]
【10916】Re:エクセルからアクセスへAddNewで ON 09/1/7(水) 16:51 質問[未読]
【10923】Re:エクセルからアクセスへAddNewで ON 09/1/9(金) 12:52 発言[未読]
【10925】Re:エクセルからアクセスへAddNewで neptune 09/1/9(金) 15:36 発言[未読]
【10926】Re:エクセルからアクセスへAddNewで ON 09/1/9(金) 19:28 お礼[未読]
【10929】Re:エクセルからアクセスへAddNewで neptune 09/1/10(土) 12:45 発言[未読]
【10940】Re:エクセルからアクセスへAddNewで ON 09/1/14(水) 18:18 お礼[未読]
【10948】Re:エクセルからアクセスへAddNewで 小僧 09/1/22(木) 20:43 発言[未読]
【10962】Re:エクセルからアクセスへAddNewで ON 09/1/26(月) 16:15 お礼[未読]

【10900】エクセルからアクセスへAddNewで
質問  ON  - 08/12/31(水) 11:08 -

引用なし
パスワード
   よろしくお願いいたします

ファイルサーバー上のMDBに
各ローカルPCからエクセルマクロを実行し
アクセスにレコード書き込みを実行しています
数台のPCからの同時書き込み?(せいのでマクロ実行)
では不具合はありませんでした

以前どこかでmdbへの同時接続、同時使用?の制限があるような
記述を見たことがあったのですが
・同時に開いて使用するのが5人?
・同一レコードへの書き込みはロックがかかる
 (同時にTBLを開いて同一レコードを操作した場合になるは体験済み)
とかよく理解できていません

実際には下記のコードでレコード追加しているのですが
多分一瞬のことで同時に実行されることは少ないと考えていますが
よくわかりません

下記Qの他、適正なコード等アドバイスありましたらよろしくお願いいたします

・同時書き込みが生じた場合
Q1)アクセス側で発生する書き込み不可のメッセージ等は、ローカルPCに出るのでしょうか
Q2)エクセルマクロは途中で停止するのでしょうか
Q3)エクセルのメッセージで再実行とか出るのでしょうか

同時書き込みのテスト方法わかりませんでした
テストコードご教授頂けるとうれしいです

最悪、アクセス側の書き込みレコードを見れば、未書き込みPCは把握できるので
再度、実行してもらえばいいのではと考えています


エクセル側マクロ
参照設定 Microsoft DAO 3.6 Object Library

Public Sub Add2DT(C_ROW As Long) 'C_ROW As Long

  Dim Wsp As Workspace
  Dim Db As Database
  Dim Rst As Recordset
  Dim intCount As Integer
  
  Dim C As Integer
  
  Const strDBName As String = "\\hoge\fuga\KIKI_ROG.mdb"
  
  Set Wsp = Workspaces(0)
  Set Db = Wsp.OpenDatabase(strDBName)
  Set Rst = Db.OpenRecordset("T03_KIKI_LOG", dbOpenTable)
  
  'For intCount = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
  'For intCount = 1 To ActiveSheet.Cells.SpecialCells(xlLastCell).Row
  
  Rst.AddNew
  
    For C = 0 To 22
  
      Rst(C) = Cells(C_ROW, C + 1).Value
    
    Next
    
      Rst(23) = Now()
  
  Rst.Update
  
  'Next intCount
  
  Rst.Close
  Set Rst = Nothing
  
  Db.Close
  Set Db = Nothing
  
  Wsp.Close
  Set Wsp = Nothing


End Sub


関連Q
【59481】ローカルPCからのデータ取得
://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=59481;id=excel

【10907】Re:エクセルからアクセスへAddNewで
質問  ON  - 09/1/6(火) 15:38 -

引用なし
パスワード
   追記です

【59481】ローカルPCからのデータ取得
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=59481;id=excel
での希望は、データの自動取得で
これについては

下記の方法で
各ローカルPCでATコマンドで毎週月曜12:00に上記のコードを自動実行
すればいいのではと思っていますが
これを100台のPCで自動書き込みされるとMDBが壊れるような気がします

場合によっては
Atコマンド登録の際、起動時間を数分ずつずらせて設定すればいいような気もしますが・・・


レベル低いです
アドバイス頂けるとうれしいです

よろしくお願いいたします

【10908】Re:エクセルからアクセスへAddNewで
質問  ON  - 09/1/6(火) 17:11 -

引用なし
パスワード
   追記です

>各ローカルPCでATコマンドで毎週月曜12:00に上記のコードを自動実行
>すればいいのではと思っていますが

は、調査中です 現状は、動作できていません

【10910】Re:エクセルからアクセスへAddNewで
質問  ON  - 09/1/6(火) 18:49 -

引用なし
パスワード
   追記です

エクセル AT登録まで実行できました

【10912】Re:エクセルからアクセスへAddNewで
発言  neptune  - 09/1/6(火) 22:32 -

引用なし
パスワード
   ▼ON さん:
こんにちは

ネットワークは詳しくないのでRes付けんかったんですが、Resが無いようなので。
答えには多分を付けて考えて下さい。
>・同時に開いて使用するのが5人?
これは多分MSDEの間違いでは?MSDEは同時5接続の制限があります。
>・同一レコードへの書き込みはロックがかかる
以下をよく読んでみてください。疑問が解けると思います。
「ファイル サーバーとクライアント/サーバー」
ht tp://msdn.microsoft.com/ja-jp/library/cc376482.aspx
但し、以下のような記述がありますが、
//////////////////////////////////////////////////////////////////////////
ユーザー数には制限があり、Access データベースでは 255 人までの同時使用に対応しますが、
ユーザーが頻繁にデータを追加、更新する場合、ファイル サーバーにおける最適なユーザー数は、
通常 25 から 50 人までとなっています。
//////////////////////////////////////////////////////////////////////////
あくまでも可能な数字であって、こんな使い方をする人はいないと思います。
いても怖いもの知らずか、実体を知らないのかでしょう。
以下を読んでもいいし、
「ネットワークでの使用」
ht tp://www.naboki.net/access/achell/achell_02.html
「mdb マルチユーザー 接続」をキーワードにググって見ても実態は把握できると思います。

なので、ファイルサーバーを弄くれる立場なら、Office付属のMSDN、最新では
SQL Server 2005、2008(無償のバージョンもあります。無償のバージョンでも
多分同時5接続は保障されているはず。)をお使いになることをお勧めします。

>Q1)アクセス側で発生する書き込み不可のメッセージ等は、ローカルPCに出るのでしょうか
はい。ADO +SQLServerでは出ます。

>Q2)エクセルマクロは途中で停止するのでしょうか
マクロはExcelで動いている。同期処理なので多分はい。

>Q3)エクセルのメッセージで再実行とか出るのでしょうか
エラー処理にその処理を書いておけばどうですか?

>同時書き込みのテスト方法わかりませんでした
これについては知りません。

気になる点
・ADOで書いておけば、SQLServerへの移行は接続を変えるだけですみます。
・ネットワークで、レコードセットを開くようなことは極力しない。管理者に怒られそう。
 クエリ(パラメータクエリ含む)を使うべき・・・トラフィックの問題

【10916】Re:エクセルからアクセスへAddNewで
質問  ON  - 09/1/7(水) 16:51 -

引用なし
パスワード
   ▼neptune さん:
いつもありがとうございます

詳細な説明助かります

>気になる点
ありがとうございます

>・ADOで書いておけば、SQLServerへの移行は接続を変えるだけですみます。
そーなんですか 今後のことも考え ADO で記述するようにしたいと思います
当コードにつきましては、DAO → ADO に修正しました


>・ネットワークで、レコードセットを開くようなことは極力しない。管理者に怒られそう。
> クエリ(パラメータクエリ含む)を使うべき・・・トラフィックの問題
ですね
了解ですが、スキルがないです

とりあえず昼休み、TBL量は少 ということで・・・
苦情が来て、スキルがついたら対応したいと思います

ご紹介先、ゆっくり勉強したいと思います


また
【10891】ADOでCSVの取り込み時のフィルタで"種類が一致しません"
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=10891;id=access#10895

>サブクエリの選択リストは、INSERT ステートメントの列リストに一致している
>必要があります。列リストを指定しない場合は、選択リストは、追加される
>テーブルまたはビュー内の列に一致している必要があります。

を、あわせて、
>MSDN、最新ではSQL Server 2005、2008
で今後、チャレンジしたいと思います


時間があまり取れないので
現行で動作できれば、とりあえずそれで運用したいような・・・です


関連Q
【59752】ATコマンドでファイルサーバーのブックが開けない
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=59752;id=excel
あります

何かアドバイスありましたらよろしくお願いいたします

【10923】Re:エクセルからアクセスへAddNewで
発言  ON  - 09/1/9(金) 12:52 -

引用なし
パスワード
   結果報告です

>>同時書き込みのテスト方法わかりませんでした
ですが

▼ 【59752】ATコマンドでファイルサーバーのブックが開けない 
ht tp://www.vbalab.net/vbaqa/c-board.cgi?id=excel
の方法で
ローカルPC6台で、同一時分指定で実行してみましたが不具合は発生しませんでした

で、ふと、1PCで、ATコマンドを同一時分で発行してみたらどうなるのかなと
1PC-20セット × 2台 で実行してみました

ローカルPCのタスクマネージャーのプロセスを見ていると
EXCEL.EXEがたぶん20個表示され・・・

途中で
cn.Openで
実行時エラー '-2147467259 (80004005)'
マシン 'hogefuga' のユーザー'Admin'がデータベースを開けない状態、
またはロックできない状態にしています
となってしまいました
テーブルへの書き込みは、37件登録されていました
更新フィールドへの書き込み時間は 11:27:02-11:27:05 の 4秒間程か・・・


>「ファイル サーバーとクライアント/サーバー」
>ht tp://msdn.microsoft.com/ja-jp/library/cc376482.aspx

>「ネットワークでの使用」
>ht tp://www.naboki.net/access/achell/achell_02.html


>あくまでも可能な数字であって、こんな使い方をする人はいないと思います。
>いても怖いもの知らずか、実体を知らないのかでしょう。

を、頂いていながら・・・・

5人1グループで、20組、1分ずらしでのセッティング程度であれば
何とか動かせそうかな・・・と

本来は
>なので、ファイルサーバーを弄くれる立場なら、Office付属のMSDN、最新では
>SQL Server 2005、2008(無償のバージョンもあります。無償のバージョンでも
>多分同時5接続は保障されているはず。)をお使いになることをお勧めします。
が望ましいことは重々承知ですが・・・

我ながらアフォだとは思いますが
何かありましたら書き込みよろしくお願いいたします

【10925】Re:エクセルからアクセスへAddNewで
発言  neptune  - 09/1/9(金) 15:36 -

引用なし
パスワード
   ▼ON さん:
こんにちは

ATコマンド関連については知識も経験も無いのでパスします。

>実行時エラー '-2147467259 (80004005)'
>マシン 'hogefuga' のユーザー'Admin'がデータベースを開けない状態、
>またはロックできない状態にしています
>となってしまいました
をちょっと調べてみました。多分これ
「Access 2000 の .ldb ファイルについて」
ht tp://support.microsoft.com/kb/208778/ja
の下の方の「.ldb ファイルの用途 」

処理が追いついてないとか、ローカル側で何か問題がおきたとか?
最悪はmdbファイルが壊れかかっているとか。。。

>5人1グループで、20組、1分ずらしでのセッティング程度であれば
>何とか動かせそうかな・・・と
それなら、バックアップは毎日取っておくのが次善の策ですね。
頑張って下さい。

【10926】Re:エクセルからアクセスへAddNewで
お礼  ON  - 09/1/9(金) 19:28 -

引用なし
パスワード
   ▼neptune さん:
お手数かけます ありがとうございます

>それなら、バックアップは毎日取っておくのが次善の策ですね。
了解です ありがとうございます

>頑張って下さい。
ありがとうございます

兎に角、自分が楽になれればだけのQでしたが
なんとなくひんしゅく系のQだったのでしょうか・・・・

エクセルvba 
【59800】VBAによるパソコンへの攻撃について
よくわかりませんが、該当者??
で、回答頂けなかったのかと・・・

【10929】Re:エクセルからアクセスへAddNewで
発言  neptune  - 09/1/10(土) 12:45 -

引用なし
パスワード
   ▼ON さん:
こんにちは

>兎に角、自分が楽になれればだけのQでしたが
>なんとなくひんしゅく系のQだったのでしょうか・・・・
そんな事は無いですよ。ただ、怖いだけです。

>エクセルvba 
>【59800】VBAによるパソコンへの攻撃について
>よくわかりませんが、該当者??
>で、回答頂けなかったのかと・・・
??これはよく判らん??

【10940】Re:エクセルからアクセスへAddNewで
お礼  ON  - 09/1/14(水) 18:18 -

引用なし
パスワード
   大変遅くなりました

>そんな事は無いですよ。ただ、怖いだけです。
ありがとうございます
了解です
>SQL Server 2005、2008(無償のバージョンもあります。無償のバージョンでも
この辺の知識を早くつけたいと思います

>??これはよく判らん??
・・・
コメントありがとうございました
安心しました


とりあえず
怖いの承知で運用してみます

色々ご教授ありがとうございました

今後もよろしくお願いいたしいます

【10948】Re:エクセルからアクセスへAddNewで
発言  小僧  - 09/1/22(木) 20:43 -

引用なし
パスワード
   ▼ON さん:
こんにちは。

>・同時書き込みが生じた場合
>
>  Rst.AddNew
>  
>    For C = 0 To 22
>  
>      Rst(C) = Cells(C_ROW, C + 1).Value
>    
>    Next
>    
>      Rst(23) = Now()
>  
>  Rst.Update

DAO で記述されている場合は
AddNew で排他処理が行われ、Updateで排他が解除されます。

ある端末において AddNew 〜 Update の間の処理を行っていると
他の端末ではエラーが出るかと思われます。
(ステップ実行(1行ずつの実行)を複数端末で行うと検証が可能です。)

処理的には一瞬で終わるものであるため、
大概エラーが出ずに処理が終わるかと思われますが
偶然に頼ることになるため、当然エラーが発生する場合もあります。

あまり運用を大きく変えないのであれば
Excelマクロ側にErrorトラップを仕掛けて
書き込めないようであれば数秒置いてから
処理を再実行するようにしたりする方法もあるかと思われます。


運用面を含め改善する事が可能であれば
当方でしたら


1)サーバ上に \\hoge\fuga\ExcelData のような共有フォルダを設置しておく

2)各端末から共有フォルダにExcelデータをアップロード

3)AccessVBAにて、共有フォルダ内のExcelデータの吸い上げ

のような手段を行うかと思われます。


neptune さんのご回答にあるように SQLServer を使用するのであれば
同時にデータの追加をしてもServer側で制御してくれるのですが、
Accessについてはそういった機能がついていないため
Access側から各Excelを総なめするようなコードの方が
無難なのではないかと思われます。

【10962】Re:エクセルからアクセスへAddNewで
お礼  ON  - 09/1/26(月) 16:15 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは ありがとうございます
遅くなりました m(_ _)m

>DAO で記述されている場合は
>AddNew で排他処理が行われ、Updateで排他が解除されます。
なるほどです
同時アクセス時に体感的に感じていたことですが
仕組みの理解の無いままでした

 エラーの検証方法
 エラー処理方法

勉強になりました
ありがとうございました


>運用面を含め改善する事が可能であれば

>Access側から各Excelを総なめするようなコードの方が
>無難なのではないかと思われます。

真逆のアプローチの紹介ありがとうございます
確かに、アクセスで破損の恐れは皆無な処理と思います


いまさらながらですが、やはり、
>neptune さんのご回答にあるように SQLServer を使用するのであれば
>同時にデータの追加をしてもServer側で制御してくれるのですが、
がベストな気がします


SQLServerについては、何とかものにしたいと思っているのですが
なかなか環境も整えられず手が出せないままで、
我ながら、”なんだかな・・・" の状態となっています

この状態を何とか打破せねば・・・


書き込みありがとうございました


今後もよろしくお願い致します

610 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078197
(SS)C-BOARD v3.8 is Free