プロが教えるわが家の防犯対策術!

excelマクロでサーバから画像を取得して貼り付ける処理です。
繰り返しの処理で、100回くらいは正常に動作しますが、途中でオートメーションエラーとなり、処理が止まります。(ソースはその一部)
この処理は任意の抽出条件でデータ処理をしますが、抽出件数が多いときに正常終了することもあります。
これは特定のPCでエラーが発生しますが、別のPCで処理をすると正常終了します。
メモリの状況も確認しながら実行しましたが、正常値の範囲でした。メモリ2Gのうち1G程度使用です。
原因がさっぱりわからず困っております。どなたかお知恵を…お助けください。

For cntH = 1 To 9 Step 1
If Right(pathD(cntH), 3) = "jpg" Then
Set pic = LoadPicture(pathD(cntH)) ← ここでエラーになります。
If pic.Width > pic.Height Then
With ActiveSheet.Pictures.Insert(pathD(cntH))
.Width = 100
End With
Else
With ActiveSheet.Pictures.Insert(pathD(cntH))
.Height = 100
End With
End If
End If
Next

「LoadPicture のオートメーショ」の質問画像

A 回答 (3件)

EXCELのバージョンは、2013以上でしょうか。


この所、私のほうはファイル読み込みで2013/2016で、軒並み失敗していますから、珍しい話ではなくなってきてしまっています。2010では通っていたものが、上位バージョンでは通りません。

>メモリの状況も確認しながら実行しましたが、正常値の範囲でした。メモリ2Gのうち1G程度使用です

メモリの使う場所が違うでしょう。タスクマネージャーの詳細の部分で、どんどん肥大化してきているのだろうと思います。Excelは仮想メモリを使っていますが、Excelのメモリの限界の出し方とか、Microsoft のサポートにありました。試してみると、限界が定量だとかではなくて、限界が来たら、休んでもう一度、それを行うと、今までの3倍とかのサイズまでインポートが可能になります。しかし、そのためのマクロも考えましたが、どれも期待薄なのです。

そこで、今回でも同じですが、途中で休みを入れればよいのだと思います。

>繰り返しの処理で、100回くらいは正常に動作しますが
だから、一回の枠を100回にして、インポートの分散型のマクロを作ればよいのではないでしょうか。自動で行うなら、OnTime を使って、事実上、マクロ自体を休ませるわけです。Sleep や Wait は、メモリを開放しませんが、OnTime は、一旦、それを開放します。

それと、もうひとつは、
Activesheet.AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)
を試してみる方法がありますね。これは、実際には、ActiveSheet というよりも、ActiveCell に対してインポートします。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。
その後、調査の結果、そもそもjpgファイルが崩れているのが判明しました。PCによって処理ができる場合とエラーになる場合があり、画像ファイルに問題があると疑うことをしていませんでした。
処理が成功したPCとエラーになるPCのエクセルのバージョンは同じでしたが、windows10とwindows7の違いがありました。jpgの崩れた画像でもwindows10ではエラーにならなかったのかもしれません。

お礼日時:2019/06/15 17:17

こんにちは



LoadPictureって使ったことがないので、ほとんど知らないのですが・・・

ご提示のコードを見ると、jpgファイルだけ特別扱いをしているようですが、内容を見ると事前にサイズをチェックしているだけのように見えます。
結局は、いずれの場合も、Pictures.Insertで改めて読み込んでいるので、サイズのチェックを読み込み後に行えば済むことのように思えます。
そうすることで、LoadPictureの文そのものが不要になると推測しますし、全体の流れも一つにできて、サイズ指定の部分だけを場合分けするような感じにできるのではないでしょうか。


※ MSDNでLoadPictureを探してみましたが、ACCESSでのメソッドとしての解説しか見つかりませんでした。
https://docs.microsoft.com/ja-jp/office/vba/api/ …
Excelとまったく同じとは限りませんが、説明には「.bmp、.ico、.rle、.wmf のいずれか」と記されていて、.jpgは記載は明記されてはいないようですね。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。
他のPCでは問題なく処理がされ、特定のPCでのみエラーとなったので、ソース上の問題とも思えず…です。

お礼日時:2019/06/15 17:15

オートメーションエラーは原因の特定が困難で厄介ですね。


VBAでは、画像系の処理が上手くいかないことはよくありますが、内容からサーバーからのデータ取得と処理にタイムラグが起こっている可能性もありそうです。
エラー発生行の直前にDo Eventsや、時間稼ぎのループなどを入れて試してみては如何でしょうか?
実行時間は延びますが、エラーになるよりはマシなのではないかと。
    • good
    • 0
この回答へのお礼

説明が不十分でしたが、任意の抽出条件を設定し、エラーが出る場合は、毎回同じ場所でエラーとなります。
PC再起動後などでも同じ場所でエラーになります。
Doeventsの処理を直前に入れましたが、やはり同じ場所でエラーになりました。

お礼日時:2019/06/14 13:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!