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

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

ただいまの
回答率

90.53%

  • VBA

    1782questions

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

  • CSV

    632questions

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

  • Access

    427questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 790

harpy

score 11

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

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


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

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

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 18:11

    すみません、前提を勘違いして回答していたかもしれません。

    >VBAでモジュールを作ってエラー処理をするしかない
    「マクロ」=「VBAマクロ」の認識で回答していましたが「Accessのマクロ機能」を指していそうですね。

    そこでひとつ確認したいのですが、「.DATから.CSVへの変換処理」というのはどのように行われているのでしょう?
    ここをVBAで作成しているのなら、先のアドバイスも全くの無駄ではなかったかもしれません。

    また、外部のバッチ処理などを起動しているのであれば、CSVの存在チェックを行うVBAマクロを作成し「変換処理」と「インポート処理」の間でcsv作成を待機する方法も使えそうです。

    キャンセル

  • 2017/02/27 10:22

    申し訳ありません、返信遅れました。

    Accessのマクロ機能のことです。

    .datから.csvへの変換は、同じディレクトリにVBAでcopy関数を使って.datファイルを.csvファイルにコピーしています。

    キャンセル

  • 2017/02/27 11:29

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

    キャンセル

  • 2017/02/27 12:55

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

    キャンセル

  • 2017/02/27 13:47 編集

    またしても受け取り違いをしていたようで・・・理解が悪くて申し訳ありません。
    マクロを作成しているAccessファイルと同じディレクトリにある別のAccessファイルにVBAでcopy処理を作成しているものと受け取っていました。

    マクロを作成しているAccessファイルにVBAモジュールも作成してあり、その中でcopy関数をつかって.datファイルを同じディレクトリの.csvファイルに出力しているということですね。


    手元の環境でFileCopyコマンドで.dat⇒.csvへコピーするVBAモジュールを作成し、
    accessマクロのデザイナ画面で
    ①作成したコピー関数を実行
    ②メッセージボックス表示
    というマクロを作成し実行してみましたが、①のファイルコピーが完了するまで②のメッセージ処理がおこなわれることはないようでした。
    ※数百メガのファイルでコピー完了まで1分ほど掛かりましたが、ファイルコピー完了前にメッセージ表示されることはありませんでした。

    harpyさんの環境では①のファイルコピーが完全に終わる前に次のインポート処理が開始してしまう、ということでしょうか?

    少し待てば.csvファイルが作られるのであれば、回答本文にも記載したようにファイルの存在チェックをするVBAモジュールを作成してもいいですし、簡単に済ませるのであればコピー処理とインポート処理の間でメッセージ表示するaccessマクロをはさみ、csvファイルが作成できたらメッセージボックスのボタンをクリックするような運用回避案もあるかもしれません。

    キャンセル

  • 2017/02/27 15:42

    いえいえ、私の記述が詳細を欠いてるということも大きく迷惑をおかけしていると思います。

    >マクロを作成しているAccessファイルにVBAモジュールも作成してあり、その中でcopy関数をつかっ  て.datファイルを同じディレクトリの.csvファイルに出力しているということですね。

    その通りです。AccessファイルにVBAモジュールを作ってあり、その中でcopy関数を使ってリモートにある.datファイルを同じディレクトリの.csvにコピーしているということです。

    >harpyさんの環境では①のファイルコピーが完全に終わる前に次のインポート処理が開始してしまう、ということでしょうか?

    ファイルコピーが完全に終わる前というよりは、ボタンを押した瞬間にエラーが出るのでインポートのタイミングの問題でもないような気がします。

    キャンセル

  • 2017/02/27 15:56

    ①リモートにある.DATファイルを.CSVファイルに変換
    ②CSVファイルを「保存済みのインポーと操作」でインポート
    ③クエリでちょちょちょいとデータを処理
    ④最後にインポート元のCSVファイルをけす
    という流れがAccessマクロで登録されていて、ボタンを押すと呼び出されるようになっているということでよかったですよね?

    この①~④の中のどこで処理に失敗しているのかがキーになりそうです。
    推測では①の処理が空振って何も処理せず終了してしまい、②でエラーになっているような気がしています。

    VBAのデバッグ実行はご存知でしょうか?
    ①の処理を行っているVBAモジュールをエディタ画面で開き、ソースの任意の行でF9を押してブレイクポイントを作成しておくと、そのコードが実行される直前に処理が中断し、1行ずつ処理を実行したりすることができます。
    まずはデバッグによってファイルコピーが正しくできているか確認してみてはどうでしょうか?

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1782questions

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

  • CSV

    632questions

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

  • Access

    427questions

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