• 締切済み

Access VBA 処理 落ち 不具合

AccessVBAの処理落ちで困っています。 開発環境は Office 2003 Access OSはWindowsServer2003 Standard Edition(VM Ware上で稼働)、データベースは別に用意したAccess2003MDBファイルです。 処理概要は データベース上の業務データが登録されているテーブル(以後テーブル1と呼ぶ)のデータ(主キー)を元にデータベース上の商品単価が登録されているマスタテーブル(以後マスタ1と呼ぶ)のデータを抽出し、テーブル1に金額をセットするものです。 業務データは月毎に約4000件存在します。 金額のセット処理はレコードセットを用い、テーブル1の該当する月のデータ件数分繰り返し行います。 テーブル1の金額フィールドにテーブル1のデータを主キーとして用い、マスタ1の該当する金額を抽出し、セットしなければならないのですが、金額が正しく登録されている物と全く違う金額が登録されている状態が発生しています。 テストデータは 例:2009年4月分のデータのみ(テーブル1、マスタ1共に) という状態でテストしています。 作成したソースコードをチェックしてみましたがロジック上は 何処にも異常は見当たりません。 ループの中でソースコードの命令外の処理が行われているようにしか思えません。 説明が分かり辛ければ申し訳ありません、ご指摘頂ければ補足します。 どなたかこの現象についてご存じの方はご教授願えませんでしょうか? どうか宜しくお願い致します。

みんなの回答

回答No.2

Access のバグという可能性は・・・クエリ文なども含めて、 msdn.microsoft.com で調べるというのもありかとおもいます。 1.まずは手元で再現させて、再現する場合としない場合を見つける これに尽きます。 そこから、あやしそうなところをデバッグすればよいです。 コードだけみていてもダメです。 複数ユーザでアクセスしたときに再現するとか、、 ある特定のクライアントマシンで再現するとか、、

se_hiro
質問者

お礼

有難うございます、調べてみます。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

Accessで落ちることはよくあることですが、原因はほとんどがプログラムミスです。 ソースコードのチェックでロジック上異常がないとのことですが、1ステップづつ実行して変数やテーブルのフィールドの値を確認しながらチェックしたにもかかわらず突然金額フィールドの値が変わったのでしょうか。 もしそうなら、申し訳ありませんが分かりかねますので以下は無視してください。 そうでなければ、デバッグの仕方を工夫してみてはどうでしょうか。 まずは現象をはっきりさせることが必要です。 ・すべてのデータの金額フィールドが変わるのか、特定のデータだけ変わるのか、それとも実行するごとに変わるデータが変化するのか。 金額フィールドが変わるデータが判明したら、ソースコードのどのステップで変わるかを調べます。 ・ソースコードの特定のステップで金額フィールドが変わるのか、それとも不定(処理ごとに違うステップで変わる)なのか。 データ量が多い場合は、極端に減らしてからデバッグしてみてください。 特定のステップで金額フィールドが変わる場合は、プログラムミスかAccessのバグかは分かりませんが、その箇所のコードが原因ですので別のロジックに変えれば直るかもしれません。 そうでなければお手上げです、申し訳ありません。 あと、ご存知とは思いますが、Accessはイベント駆動型のプログラム言語です。 ですので、思ってもいないところで予想外の処理が実行されることが多々あります。 たとえば、ある処理のあるステップを実行した直後、その次のステップを実行する前に別の処理が実行されることがあります。 特にデータベースを操作している場合や画面の操作をしている場合に多いです。 デバッグする際は、いま現在どの処理が実行されているのかを常に監視しておく必要があります。

se_hiro
質問者

お礼

有難うございます、試してみます。

関連するQ&A

  • SQLの記述について

    SQLの記述で Aトランザクションテーブル(以後Aテーブル)とBマスタテーブル(以後Bマスタ)が有り, AテーブルにBマスタの内容を反映させ或る条件のデータだけ抽出は可能でしょうか? 例 Aテーブルの内容をBマスタを検索しデータがAの場合のみ抽出 Aテーブル        Bマスタ キー  データ     キー  データ      001 0001    001 A 001 0002    002 B 002 0003    003 A 001 0004    004 C 002 0021 003 0005 004 0001 実行結果 キー  データ 001 0001 001 0002 001 0004 003 0005 上記の結果のように,Aテーブルの内容からBテーブルを見て条件を判断しての抽出は可能でしょうか?

  • ACCESS VBA コマンドDoCmd.OpenFormの引数

    2つの項目で主キーを構成するテーブルを定義しました。 この場合、VBA コマンドを使って登録画面を開く為の コマンドの引数の指定方法がわかりません。 テーブル名: T運転手割当 1)W業務依頼日 <=主キー 2)W使用車両  <=主キー 3)W運転手番号 DoCmd.OpenFormの書式 ■第4引数 WhereCondition/レコード抽出条件(省略可能) テーブルやクエリと連結しているときのレコード抽出条件を指定します。 1)仮に主キーが1つの時、以下の表記で正常に表示されます。 'フォームを開く DoCmd.OpenForm "F運転手割当登録", acNormal, , "W業務依頼日 = " & Me![lstWariate] 2)主キーが2つの時、以下の表記ではF運転手割当画面は表示されるのですが、 肝心のデータがセットされずに空白で表示されます。 'フォームを開く DoCmd.OpenForm "F運転手割当登録", acNormal, , ("W業務依頼日 = " & Me![lstWariate]) & " And " & ("W使用車両 = " & Me![lstWariate]) [lstWariate]とは、データの検索画面で検索結果を表示するリストボックスの名称です。 検索結果から該当データを選択して、個別データの修正画面に移行したいのですが・・・。 Me![lstWariate]の表記が良くないのだと思うのですが、具体的な表記方法が分かりません。 よろしくお願いします。

  • Access アクセスについて

    Accessでデータベースを作っています。 テーブル、クエリは下記のようになっており、リレーションシップで紐付けしてあります。 クエリからフォームを作成し、商品番号を入力することでマスタテーブルに登録されていれば自動で商品名等の情報が表示されるようになっています。(フォーム1) 商品番号を入力しカーソルが移動した時、マスタテーブルに該当する項目がなかった場合、マスタテーブルから作成した新規追加用のフォームが表示されるようになっています。(サブフォームではありません) 新規追加用フォームに商品名を入力し、閉じてもフォーム1の商品名の欄に反映されません。新規追加用フォームを閉じる時にVBAで”Requery”,”Refresh”もやってみましたがダメでした。商品番号を入力し直すと表示されます。 どうすれば自動で商品名が表示されるようになるか教えてください。 テーブル1(入力用) 1.ID(主キー) 2.商品番号 3.etc. テーブル2(マスタテーブル) 1.商品番号(主キー) 2.商品名 3.etc. クエリ 1.ID(テーブル1) 2.商品番号(テーブル1) 3.商品名(テーブル2) 4.etc.(テーブル2) 5.etc.(テーブル1)

  • Access2000のVBAで上書き更新

    お世話になります。 Access2000のVBAで作成しております。 Excelに記載した情報をAccessのテーブルに 取り込むために下記のソースを作成致しました。 既にテーブルに主キーが重複しないものを取り込むときは 正常に処理が走るのですが、 主キーが重複する場合は、重複する旨メッセージを出して 処理が止まります。 どのようにソースを修正すれば、「主キーが重複する場合、上書き更新」 するように処理が走るのでしょうか? 以上宜しくお願い致します。 --------------ソース------------------------------ Dim rs As New ADODB.Recordset Dim oApp As Object Dim iRow As Long Set oApp = CreateObject("Excel.Application") oApp.Workbooks.Open Filename:="hogehoge.xls" rs.Open "テーブル", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 ' ★ While( ループ )   rs.AddNew   rs("ID") = oApp.Cells(iRow, 1)   rs("名前") = oApp.Cells(iRow, 2)   rs.Update   iRow = iRow + 1 Wend rs.Close oApp.Quit Set oApp = Nothing

  • accessで複合キーの処理が遅い

    あるマスタデータと明細データがありキーとなる列が2つ(2列)あります マスタデータのテーブルのキー列のA列、B列を主キーとして定義し 明細データのテーブルのキー列のA列は重複ありのインデックス B列も重複ありのインデックスとしてそれぞれ設定しています その2つのキーをクエリで結合して更新する更新クエリを作成しているのですが データ量が多くなってくると非常に反応が遅くなります 同じデータ量で 2つのキー列の値をあるひとつの列に結合した値を格納しその結合列で 更新クエリを作成したところ高速に処理が動作しましたので 複合キーだった場合の処理速度が遅いのだと推測しました (※C列にA列 & B列 の結合した値を格納してC列をキーにするという事です) accessで複合キーの更新クエリを作成する場合、高速に動作させるには なにか工夫が必要なのでしょうか? アドバイス下さい 上記のように複数のキーをひとつの列に結合する工夫で早くはなったのですが・・・ 余分なデータを格納する事になるので非常に容量が大きくなってしまう問題があります

  • Accessのシステム改修について

    DBシステムで使用するマスタの登録画面があります。 このマスタ画面は、商品の製造メーカとパターン1,2,3を選んで検索ボタンを押下することで、 登録済みのデータ抽出・データ追加等を行えるようになっています。 (フォームで登録したデータは、Aテーブルに保存され、このAテーブルのデータを抽出・追加しています。) このマスタ画面を、商品の販売店ごとにコンボボックスで指定するなどして 切り替えて抽出・データ追加できるようにしたいのですが、どのようにしたら良いのでしょうか? 商品販売店ごとのAテーブルはそれぞれの販売店ごとに既存の物があります。 今回は、システムを統合するため各販売店ごとのAテーブルを使用してフォーム上に表示させることは 出来ますでしょうか? やりたいことは・・・、 ・マスタ登録画面をひらく。 ・登録or抽出する販売店用の画面にコンボボックス等を使用して切り替える。 ・製造メーカ、パターンを既存のコンボボックスを使用して指定する。 ・データの登録or抽出をする。 下の2つについては、既存であるのでそのまま使えるかと思います。 良いやり方があれば教えて下さい。

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • accessのクエリ

    こんにちわ。 いまaccess2000を使っています。 あるフォームのコントロールソースとして ある選択クエリを指定しました。 そのクエリは元になるトランザクションテーブルと それに関連するマスタテーブルから構成されています。 そこでこのフォームの詳細セクションでデータを入力すると, トランザクションテーブルにそのまま登録されるように なっていますが,なぜか関連するマスタにまでデータが 登録されてしまいます。 なおそのときはマスタの名称項目のみに登録され, コード項目には何も登録されません。 トランのみに反映しマスタには反映しないようにしたいのですが, どうすれば良いでしょうか? 教えてください。お願いします。

  • Accessでのエラー

    Access修行中の身で、勉強をかねて書類BOXのデータベースを作成中です。 親テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・・・、保存箱ID 子テーブルのフィールド  保存箱ID(主キー、オートナンバー)、保存箱名、・・・・ リレーション  親:保存箱ID-子:保存箱ID という構成です。 クエリで以下のような複合テーブルを作成し、 複合テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・、保存箱名、・・・・ データを入力しようとすると、「レコードを追加できません。テーブルの結合キーがレコードセットにありません。」というエラーがでます。また、保存箱IDに入力のないレコードは、抽出されません。 どのようにしたいかというと、保存箱IDは入力しなくてもいいフィールド(関連させなくてもよいデータ)にしたく、複合テーブルで保存箱名を入れると、子テーブルに新たにレコードが追加されるようにしたいです。 できれば、SQLを使用せずに解決したいと甘えておりますが、無理でしょうか。

  • Access2000でメインサブフォーム

    テーブル1 商品ID 数値型(主キー) 商品名 テキスト型 ------------------ テーブル2 売上ID  数値型(主キー) 商品ID  数値型 月日   日付型 売上個数 数値型 --------------------- 以上のようなテーブルがあり、テーブル1を「メイン」テーブル2を「サブ」のメインサブフォームを作成しました。 しかし、「サブ」のデータが多いため、さらに、サブフォームの日付フィールドを使い、抽出をしたいのですが、方法がわかりません。(例えば、9/1以上9/10以下のような抽出) いろいろやってみは見たのですが、思うようにできません。メインサブフォームでさらにサブフォームのデータを抽出するということは無理なのでしょうか?

専門家に質問してみよう