質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

3061閲覧

ACCESSでのインポーと操作について

harpy

総合スコア42

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2017/02/24 07:48

ACCESSで作ったシステムで毎回起動してから一度目の操作ではエラーが出るところがあります。

そこの処理は
ボタンを押すとリモートにある.DATファイルを.CSVファイルに変換して、CSVファイルを「保存済みのインポーと操作」でインポートして、クエリでちょちょちょいとデータを処理して、最後にインポート元のCSVファイルをけす、といった感じです。

エラーメッセージを「すべてのマクロを停止」で停止してから、もう一度ボタンを押すと正常に処理されます。

おそらくマクロが実行された時点(ボタンが押された時点)でインポート元のcsvファイルがないのが問題なのだと思います。解決策としてはVBAでモジュールを作ってエラー処理をするしかないのでしょうか?

なんらかのちょっとしたアドバイスや、何でも思いついたことをおっしゃってくださってかまいませんので、少々手を貸していただけませんでしょうか?

よろしくお願いします。m(__)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

予期せぬエラーに対して対策をしておくのはよいことですが、今回のように予期されるエラーであればエラーにならないよう回避してあげる方がよいと思います。
※エラーの内容によっては回避策を練るよりエラー処理で回避したほうが手っ取り早い場合もありますが。


今回の場合「インポート元のcsvファイルがないのが問題」ということですので、
・csvファイルが存在しない場合は処理を終了する(またはcsvファイルを必要とする処理をスキップする)
・変換処理が終了するまでcsvファイルを必要とする処理の開始を待機する
・csvファイルの存在チェックを行い、csvファイルが作成されるまで待機する
・csvファイルが存在しない場合はダミーのcsvファイルを作成してとりあえず処理を進める
といった対応が考えられます。

待機方法については
・Sleep関数やタイマー機能(これはVBAでは少し面倒ですが)等を利用して一定時間待機する
・ファイルの存在チェックを行い、存在しないうちは次の処理に進まない
など、いくつか方法があります。
外部モジュールの変換処理をShell関数などで起動しているのなら、処理が終了するまで次の処理に進まないようなオプションが使えるかもしれません。

そんな具合でいくつか対策は考えられますが、もう少し具体的な実装がわからないとこれ以上のアドバイスは難しそうです。


まずは「インポート元のcsvファイルがなくてもエラーとならない」ような対応策を検討してみてください。
そしてそのエラー回避策を実装するにあたり、
例えば
・エラー発生ケースが多すぎて対応しきれない
・現実的なスピードで行えない
といった問題があるようでしたら、エラー処理(On Error)でエラーをキャッチする方法もありかもしれません。

状況に合わせて対応方法をご検討ください。

投稿2017/02/24 08:23

編集2017/02/24 08:40
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2017/02/24 09:11

すみません、前提を勘違いして回答していたかもしれません。 >VBAでモジュールを作ってエラー処理をするしかない 「マクロ」=「VBAマクロ」の認識で回答していましたが「Accessのマクロ機能」を指していそうですね。 そこでひとつ確認したいのですが、「.DATから.CSVへの変換処理」というのはどのように行われているのでしょう? ここをVBAで作成しているのなら、先のアドバイスも全くの無駄ではなかったかもしれません。 また、外部のバッチ処理などを起動しているのであれば、CSVの存在チェックを行うVBAマクロを作成し「変換処理」と「インポート処理」の間でcsv作成を待機する方法も使えそうです。
harpy

2017/02/27 01:22

申し訳ありません、返信遅れました。 Accessのマクロ機能のことです。 .datから.csvへの変換は、同じディレクトリにVBAでcopy関数を使って.datファイルを.csvファイルにコピーしています。
jawa

2017/02/27 02:29

>同じディレクトリにVBAで VBSでしょうか? もしくはVBAは別のaccessファイルで行っているということですか?
harpy

2017/02/27 03:55

調べたところVBAで間違っていないと思います。 VBAで書いたのは「すべてのAccessオブジェクト」の中の「モジュール」の中に書いたものです。
jawa

2017/02/27 04:53 編集

またしても受け取り違いをしていたようで・・・理解が悪くて申し訳ありません。 マクロを作成しているAccessファイルと同じディレクトリにある別のAccessファイルにVBAでcopy処理を作成しているものと受け取っていました。 マクロを作成しているAccessファイルにVBAモジュールも作成してあり、その中でcopy関数をつかって.datファイルを同じディレクトリの.csvファイルに出力しているということですね。 手元の環境でFileCopyコマンドで.dat⇒.csvへコピーするVBAモジュールを作成し、 accessマクロのデザイナ画面で ①作成したコピー関数を実行 ②メッセージボックス表示 というマクロを作成し実行してみましたが、①のファイルコピーが完了するまで②のメッセージ処理がおこなわれることはないようでした。 ※数百メガのファイルでコピー完了まで1分ほど掛かりましたが、ファイルコピー完了前にメッセージ表示されることはありませんでした。 harpyさんの環境では①のファイルコピーが完全に終わる前に次のインポート処理が開始してしまう、ということでしょうか? 少し待てば.csvファイルが作られるのであれば、回答本文にも記載したようにファイルの存在チェックをするVBAモジュールを作成してもいいですし、簡単に済ませるのであればコピー処理とインポート処理の間でメッセージ表示するaccessマクロをはさみ、csvファイルが作成できたらメッセージボックスのボタンをクリックするような運用回避案もあるかもしれません。
harpy

2017/02/27 06:42

いえいえ、私の記述が詳細を欠いてるということも大きく迷惑をおかけしていると思います。 >マクロを作成しているAccessファイルにVBAモジュールも作成してあり、その中でcopy関数をつかっ  て.datファイルを同じディレクトリの.csvファイルに出力しているということですね。 その通りです。AccessファイルにVBAモジュールを作ってあり、その中でcopy関数を使ってリモートにある.datファイルを同じディレクトリの.csvにコピーしているということです。 >harpyさんの環境では①のファイルコピーが完全に終わる前に次のインポート処理が開始してしまう、ということでしょうか? ファイルコピーが完全に終わる前というよりは、ボタンを押した瞬間にエラーが出るのでインポートのタイミングの問題でもないような気がします。
jawa

2017/02/27 06:56

①リモートにある.DATファイルを.CSVファイルに変換 ②CSVファイルを「保存済みのインポーと操作」でインポート ③クエリでちょちょちょいとデータを処理 ④最後にインポート元のCSVファイルをけす という流れがAccessマクロで登録されていて、ボタンを押すと呼び出されるようになっているということでよかったですよね? この①~④の中のどこで処理に失敗しているのかがキーになりそうです。 推測では①の処理が空振って何も処理せず終了してしまい、②でエラーになっているような気がしています。 VBAのデバッグ実行はご存知でしょうか? ①の処理を行っているVBAモジュールをエディタ画面で開き、ソースの任意の行でF9を押してブレイクポイントを作成しておくと、そのコードが実行される直前に処理が中断し、1行ずつ処理を実行したりすることができます。 まずはデバッグによってファイルコピーが正しくできているか確認してみてはどうでしょうか?
guest

0

応急処置ならVBA で sleep API を定義して、CSVファイル創成後に数秒待つか、

CSVファイル創成後にCSVファイルが存在するかを確認してから次の動作に移るようにプログラミングすると改善されるのではないでしょうか。

moug サイトの「指定時間だけ処理を中断する」の記事を参考にすれば、sleep関数の定義はできます。

投稿2017/02/24 08:08

seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

丁寧なエラー対策が必要なら、VBA一択です。
On Error Resume Nextして、
何か処理した後にErr.Numberをチェックしてエラーを検出するやり方になります。

投稿2017/02/24 07:53

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問