いつもお世話になります
今、Scriptファイルを利用してExceのデータでAutoCad上に作画させていますが
時々データ量および処理速度の差によって、Scriptファイルの書き込みエラーが
発生します
今はApplication.Waitで調整していますが、妙案があったら教えてください
'...ファイルの定義
Set stm = New ADODB.Stream
stm.Charset = "UTF-8"
stm.LineSeparator = adLF
stm.Open
(作図)ファイル作成
Application.Wait [Now() + "00:00:03"] '...エラーが起きないように3秒調整
stm.SaveToFile PLTFname1, 2 '...ファイル書き込み(ここでエラーが起きる)
stm.Close
Application.Wait [Now() + "00:00:01"]
SendKeys "script" & Chr(13) & PLTFname1 & Chr(13)
stm.Open
(作図)
Application.Wait [Now() + "00:00:03"]
stm.SaveToFile PLTFname1, 2
・
・
(作図とScript 処理を繰り返します)
いつもすみません、変な質問で
以上、よろしくお願い申しあげます
No.3ベストアンサー
- 回答日時:
こんにちは
以下は、想像と空想での回答ですので、対策になるのかもわかりませんけれど・・
通常、ADODB.Streamからの出力処理にApplication.Waitが必要だというような情報は見つかりませんので、ご提示のケースに特有の問題であろうと推測します。
ご提示の処理ですと、VBAからのファイル出力とAutoCad側でのファイル読み込みとが交互におきるため、多分、その排他処理の交通整理で発生しているのではないかと推測します。
(その割には3秒は長いような気もしますけれど・・)
実際に問題となっている原因を調べられれば、それを回避する方法のヒントになると思いますけれど・・
AutoCad側のスクリプト処理がどのような仕組みなのか知りませんけれど、小分けにせずにまとめて1ファイルに出力することは不可能なのでしょうか?
(これなら、Waiteは出力後の1回だけで済むはずと思います)
また、スクリプトの処理時間が瞬時なのか、多少時間がかかるのかなども関係してくると思います。
小分けすることが必須であるのなら、同じPLTFname1を上書きして使い回すようなことはせずに、連番などで別ファイルとして出力すれば、出力時にエラーが起きることは回避できるのではないかと推測します。
(全部の処理が終わったところで、ファイル群は削除すれば済むでしょう)
ただし(AutoCad側の仕様は知りませんけれど)、スクリプトの実行速度とVBAからの次のSendKeyとの関係を制御することが必要なのかも知れません。
(前の処理が終わらないうちに、次のkeyが送信された場合の反応が不明なので)
AutoCad側の状態(コマンドを受け付けられるか否か)などを取得する方法があれば(statusなどで)、そちらを監視してコマンドを送るようにすればタイミングを測れるので(あるいはエラーが返るのならエラー処理で監視してもよい)、一律のWaiteをかける必要もなくなるのではないでしょうか?
こんにちは
いつもお世話になります
作図には少し時間が掛かる量なので小分けにしています
Scriptファイルの名前を変える方法は良いかもしれませんね
チャレンジしてみます
本当にいつも助かります
これからもよろしくお願い申しあげます
No.4
- 回答日時:
No3です。
>作図には少し時間が掛かる量なので小分けにしています
>Scriptファイルの名前を変える方法は良いかもしれませんね
妄想の続きですが・・
ファイル名を変えれば、出力時のエラーはなくなるのではないかと推測します。
ただし、AutoCad側の処理に時間がかかるとのことですので、作図処理が終わらないうちに連続してコマンドを送った場合にどうなるのかが問題になりそうな気がします。
以下では、考え方も方法も変わってしまいますけれど・・
AutoCadでもMS VBAが使えたと記憶しています。
ですので、エクセルからSendkeysでCadを操作することをやめて(=あまり良い方法とは言えないと思いますので)、AutoCad側のVBAをメインとして、
・エクセルを開き
・そのデータを利用して作図する
ような仕組みにしておけば、Sendkeysのような必要もなくなるはずです。
時間待ちなどの煩わしい制御を考慮する必要もなくなるので、ご質問のような問題も生じないのではないかと推測します。
「計算はエクセル側で処理したい」という事情があるのなら、AutoCad側のVBAからエクセル側のプロシージャを呼び出して結果を受け取るような構造にしておけば、ファイルを介さずともデータの受け渡しが可能になりそうに思いますし、作成してある「エクセル側の計算処理」もほぼそのまま利用できるのではないかと想像します。
こんにちは
再度、ありがとうございます
私たち社員が使っているのはAutoCad LTと廉価版Ares StanDardを
使っていますので、Cad側にはVBAは無いのです
その環境下でプログラムを構築していかなければなりません
今後はどうなるかは会社上司の考え方とお金次第になると思います
プログラマは私一人(78歳)プログラム歴50年です
これからもよろしくお願い申しあげます
No.2
- 回答日時:
On Error Resume Next <---- ここを追加した
'...ファイルの定義
Set stm = New ADODB.Stream
stm.Charset = "UTF-8"
stm.LineSeparator = adLF
stm.Open
(作図)ファイル作成
Application.Wait [Now() + "00:00:03"]
For i = 0 To 10 <---- ここを追加した
stm.SaveToFile PLTFname1, 2
If Err.Number = 0 Then <---- ここを追加した
Exit For <---- ここを追加した
End If <---- ここを追加した
Application.Wait [Now() + "00:00:01"] <---- ここを追加した
Next <---- ここを追加した
stm.Close
Application.Wait [Now() + "00:00:01"]
SendKeys "script" & Chr(13) & PLTFname1 & Chr(13)
:
:
:
早速ありがとうございます
そうですね、
3秒のWaitタイムはいらないですね
やってみますね
ありがとうございました
これからもよろしくお願いいたします
No.1
- 回答日時:
(1) On Error Resume Next を最初に記載し、エラーが発生しても処理が止まらないようにする
(2) SaveToFile を実行している処理を ループにして
1秒待つ→書き込む→エラーならループ2週目(2秒待つ)→書き込み→エラーならループ3週目(3秒待つ)→・・・
のように上限を設けたループにして書き込みができるタイミングに書き込みするように制御する
※エラーかどうかは「Err.Number」の値が0か否かで判定する
などはいかがですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
歩いた自慢大会
「めちゃくちゃ歩いたエピソード」を教えてください。 長時間でも長距離でも結構です。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VBAの間違い教えて下さい
Visual Basic(VBA)
-
サブフォルダに格納されているファイルを、ファイル名ごとに条件分岐させたい
Visual Basic(VBA)
-
IF文、条件分岐の整理方法
Visual Basic(VBA)
-
-
4
pdfファイルの複数添付 引数の型
Visual Basic(VBA)
-
5
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
6
VBAコードのインデント表示
Visual Basic(VBA)
-
7
ExcelVBAマクロで実行した時の疑問
Visual Basic(VBA)
-
8
Excel VBA 選択範囲の罫線色の変更プロージャの動作速度の改善について
Visual Basic(VBA)
-
9
Excel_VBAについて質疑です。(for~next)
Visual Basic(VBA)
-
10
エクセルVBAにて =A1=B1とすれば A1とB1のセル内容が一緒だった場合 TRUE 違っていれ
Visual Basic(VBA)
-
11
VBA一覧取得 再投稿
Visual Basic(VBA)
-
12
VBAなくなるの?
Visual Basic(VBA)
-
13
VBA初心者です。次のVBAコードで、17行目を削除したいのですがうまく動きません 改善策を教えてく
Visual Basic(VBA)
-
14
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
15
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
16
Excel VBA 定義されたプロージャ名、関数名の取得
Visual Basic(VBA)
-
17
VBA SaveChanges 上書きされない
Visual Basic(VBA)
-
18
VBA レジストリの値の読み方について教えてください
Visual Basic(VBA)
-
19
Vba 実数および実数タイプの変数について教えてください
Visual Basic(VBA)
-
20
エクセルVBA
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Returnに対するGoSubがありません
-
batファイルでレジストリキーの...
-
VB6 Dir関数で52エラー発生
-
PowerShellを使って関連付けら...
-
gccを行ってもexeファイルが生...
-
アクセスのクエリでコンパイル...
-
fgets関数のEOFの扱い方について
-
「複数の選択範囲に対して実行...
-
NAS上のファイルの使用中が解除...
-
Access2013にてドラッグ&ドロ...
-
「アクティブ ユーザーが多すぎ...
-
EXCELのVBAでWORDが開いてある...
-
VISIOは上位互換のはずなのにフ...
-
VBから参照できないCのDLLを使...
-
Microsoft Visioで作成したフ...
-
Win32API ファイルの書き込み、...
-
RAR圧縮ファイル(分割)の順番が...
-
ワークブックに名前をつけて保...
-
FTPの送信結果を検知したい
-
VB実行時エラー75:「パス名が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「パス名が無効です」の発生原因
-
batファイルでレジストリキーの...
-
アクセスのクエリでコンパイル...
-
Returnに対するGoSubがありません
-
NAS上のファイルの使用中が解除...
-
VBから参照できないCのDLLを使...
-
PowerShellを使って関連付けら...
-
access テキストボックスの値取得
-
ACCESS VBAでのインポート
-
FTPの送信結果を検知したい
-
VBでファイルが開かれているか...
-
VB6 Dir関数で52エラー発生
-
【COBOL】read文でエラー
-
エクセル VBA dll 読み込...
-
VBA ExecuteExcel4Macro 型が一...
-
fgets関数のEOFの扱い方について
-
「複数の選択範囲に対して実行...
-
アクセスでイベントのロジック...
-
エクセルマクロでエラーの原因...
-
すでにファイルが開かれている...
おすすめ情報