Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2013)
メモリ不足です
投稿日時: 22/03/25 08:44:07
投稿者: yamasho

お世話になります。
 
以下の処理をすると「メモリ不足です」というエラーになってしまいます。
 
1.コマンドでGoogleドライブから特定のフォルダーにcsvファイルをコピー。
 コマンドは手打ちではなくバッチファイルで。
 
Dim retVal As Variant
retVal = Shell(CurrentProject.Path & "\実行ファイル\コピー.cmd", vbNormalFocus)
DoCmd.OpenForm "F_取り込み"
 
 
2.Accessでは「1」のcsvファイルがリンクテーブルになっている。
 
 
3.以下のSQL文を実行。
 
DELETE * FROM T_日報 WHERE 入金日 BETWEEN #" & Me!開始日 & "# AND #" & Me!終了日 & "#"
 
 
「3」の時点で「メモリ不足です」になってしまいます。
ただし、一回「メモリ不足です」になると、次回からはエラーになりません。
 
Windowsを起動して最初の1回だけエラーになります。
Windowsを起動してすぐ実行してるのではなく、
半日たってからでも最初の1回は必ずエラーになります。
 
自分なりに調べましたが、
Accessの容量やテーブルの容量が大きいとそうなるらしいです。
 
しかしファイルサイズは100MB程度、
テーブル「T_日報」は5千件程度です。
この条件には当てはまらないように思えます。
 
ほかにどういった原因が考えられるでしょうか?
 
 

回答
投稿日時: 22/03/25 11:29:26
投稿者: Suzu

1. と 2. と 3. それぞれの オブジェクトと そこでの操作の関連性が全くわかりません。
 
 
DoCmd.OpenForm "F_取り込み" のフォームで 3.を行っている?
SQL の パラメーター Me!開始日 と、Me!終了日 がそこに配置されているのですか?
 
Shell で バッチファイルを実行していますが、
そのバッチファイル内でコピーを行っているとしても
これでは、コピーの命令を出しているだけ。
 
コピーの完了を待って、フォーム 「F_取り込み」を開いている訳ではありません。
もし、フォーム の Open や Initialize で SQLを実行しているのであれば
 コピーの最中に SQL を実行しようとしている可能性もあります。
 
 
 
VBA 云々は おいておいて
手動 で 目的の動作を行った場合にも同じ症状になるのでしょうか?
 
 
実行している SQL は 削除クエリですよね。
これは、リンクテーブルとなっている CSVファイルに対し削除クエリを発行していると言うことでしょうか?
 
そうなのであれば
【Access の 「リンク テーブル内のデータの更新または削除は、この ISAM ではサポートされていません」というエラー】
https://docs.microsoft.com/ja-jp/office/troubleshoot/access/update-delete-query-unsuccessful
 
に該当しませんか?
 
 
手動で 目的の通りに処理できる事を確認してから VBA を作成しましょう。
できるはずだ で コーディンゴを行っても ロクな事になりません。

投稿日時: 22/03/25 14:37:42
投稿者: yamasho

お世話になります。
 
失礼しました。
メインフォームがあり、
そこに「取り込み」というコマンドボタンがあります。
 
コマンドボタンを押すとバッチファイルを実行してから、
「F_取り込み」というフォームを開きます。
 
バッチファイルは、
 
Dim retVal As Variant
retVal = Shell(CurrentProject.Path & "\実行ファイル\コピー.cmd", vbNormalFocus)
 
で実行しており、バッチファイルの中身は、
 
COPY "H:\その他のパソコン\マイ ノートパソコン\Google ドライブ\CSV\日報.csv" "D:\日報管理\CSV\"
 
となっています。
「D:\日報管理\CSV」の中にあるcsvファイルは、
リンクテーブルになっています。
 
フォーム「F_取り込み」には日付を入力するテキストボックスがあります。
テキストボックスに日付を入力しコマンドボタンを押すと、
テーブル「T_日報」の該当する日付のレコードを削除し、
csvファイルのリンクテーブルからINSERT INTOで追加しています。
 
テーブル「T_日報」はcsvファイルのリンクテーブルとは別のテーブルです。
 
バッチファイルのcsvファイルのコピーのところを手動で行っても、
同じ現象になります。
 
【Access の
「リンク テーブル内のデータの更新または削除は、この ISAM ではサポートされていません」
というエラー】
 
には該当しないと思います。
 
 

回答
投稿日時: 22/03/25 15:27:33
投稿者: Suzu

関係性は理解できました。
 
CSV の リンクテーブル に対して DELETE でないなら、ISAM云々は該当しませんね。
 
 

引用:
テーブル「T_日報」の該当する日付のレコードを削除し、
csvファイルのリンクテーブルからINSERT INTOで追加しています。
 
テーブル「T_日報」はcsvファイルのリンクテーブルとは別のテーブルです。
 
バッチファイルのcsvファイルのコピーのところを手動で行っても、
同じ現象になります。

 
1) ファイルコピーを手動で実施、
2)ファイルのコピーが終了した事を確認
    (ファイルを開く事ができる/リンクテーブルも開ける)
3)フォーム上のボタンを押し DELETEステートメントを実施
 
この 3) でエラーになるのでしょうか?
 
DELETEの対象が、CSVのリンクテーブルとは別であり、コピーが関係ないのであれば、
単に、DELETE ステートメント を 実行した場合にはどうなのでしょうか?
 
 
実行している処理をひとつひとつ減らしていき、起因となる処理について特定することを行っていきましょう。

投稿日時: 22/03/26 17:07:03
投稿者: yamasho

お世話になります。
 
フロントの方のAccessファイルは最適化していたのですが、
バックエンドの方のAccessファイルを最適化していませんでした。
 
最適化することで解決しました。
お騒がせしました。
 
親身になってお答えいただきありがとうございました。
ひとうひとつ試してみて、
単純に削除クエリーを実行するだけでもダメで、
最適化することで解決しました。
 
解決法について勉強になりました。
ありがとうございました。