[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートメーションエラーについて』(かな)
複数ブックからの抽出時のオートメーションエラーについて教えてください。
以前こちらで紹介されていたコードを加工させていただき、
下記のコードを使用させてもらってます。
(ごめんなさい、引用のタグ付け?が分からなかったので、
こちらで加工したコードを載せさせていただきます。)
Sub 抽出()
Dim myPath As String, myXls As String Dim wb As Workbook, r As Range, dst As Range Dim i As Long, n As Long, o As Long
myPath = "▲▲▲" myXls = Dir(myPath & "*.xls*")
Application.ScreenUpdating = False Application.DisplayAlerts = False
With ThisWorkbook.Sheets("Sheet1") Set dst = .Range("A2") End With
Do Until myXls = "" Set wb = Workbooks.Open(myPath & myXls) Set r = wb.Sheetsの("No1").Range("D1").CurrentRegion r.AutoFilter r.AutoFilter Field:=4, Criteria1:="<>", _ n = r.Columns(4).SpecialCells(xlCellTypeVisible).Count - 1 If n > 0 Then r.Offset(1).Copy dst.Offset(o).PasteSpecial xlPasteValues End If o = o + n wb.Close False End If myXls = Dir() Loop Application.ScreenUpdating = True Application.DisplayAlerts = True
End Sub
ここから質問なのですが、
このコードを実行すると、
”オートメーションエラーです
例外が発生しました ”
、と出ます。
ステップインで1行づつ試すと、エラーなく終わるのですが
一気に試すと上記エラーになります。
この場合どういったエラーが考えられるでしょうか??
< 使用 Excel:Excel2013、使用 OS:Windows7 >
>ステップインで1行づつ試すと、エラーなく終わるのですが
と言うことは、これが生きているか死んでいるかの違いでは? ↓ >Application.ScreenUpdating = False
一度、そのステートメントを殺して、テストしてみたら如何ですか?
(半平太) 2016/06/08(水) 12:39
>Application.ScreenUpdating = False
を消して試してみましたが、新たな疑問が出てきました。
上記の画面更新表示のあるなしに関わらず、
エクセルのシート画面からVBAを実行すると、
オートメーションエラーになります。
ただ、VBEの画面から再生ボタンを押すと、
上記の画面更新表示のあるなしに関わらず、
エラーなく、抽出されます。
ちょっと更に混乱してしまいました、、、
シートから実行するのと、VBE画面から再生ボタンを押すのは
何か違いがあるのでしょうか??
(ステップインじゃないです)
(かな) 2016/06/08(水) 13:50
一般論ですけど オートメーションエラーは、実行しながら関連のオブジェクトを参照していく、その参照ができていないタイミングで そのオブジェクトに関する処理を行う場合に多く発生します。 (コードと次のコードという場合もありますし、1つのコード内でのVBA側の内部処理という場合もあります)
ステップ実行は、コンピュータの内部処理速度に比べると膨大な時間なので、各処理間の間隔が十分に大きく オブジェクトの参照が、しっかりとできるのでエラーにはならないのでしょうね。
VBE画面のメニューからの実行も、ステップ実行ほどではありませんが、通常の実行とは異なる環境を VBEが提供してくれているんだと推察しています。
難問かもしれませんし、ちょっとした変更で解決するかもしれませんが、いずれにしても 【本物の】コードを見せていただきたいですね。
Set r = wb.Sheetsの("No1").Range("D1").CurrentRegion
というコードは実際には書かれていないでしょうし
r.AutoFilter Field:=4, Criteria1:="<>", _ n = r.Columns(4).SpecialCells(xlCellTypeVisible).Count - 1
これも、コード改行をやめると
r.AutoFilter Field:=4, Criteria1:="<>", n = r.Columns(4).SpecialCells(xlCellTypeVisible).Count - 1
こんな、へんてこりんなコードで、これでは実行そのものができないはずですから。
(β) 2016/06/08(水) 14:03
そこは置いておいて、フィルタをかける事と、かけた結果をコピーする事を連続していますが、表示が絞られる前にコピーしようとしてエラー、とかになっていませんかね?
対策は、フィルタをかけた直後にDoEventsを入れてみること。いかがでしょうか?
(???) 2016/06/08(水) 14:09
以下のような原因もあるようです。 そちらのケースとは異なるかもしれませんが。
http://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=175963&rev=0
(β) 2016/06/08(水) 14:09
ひとまず、使用しているコードです。
ごめんなさい、私が携帯から操作してるので、
途中消したりしておかしくなってました!
Sub 抽出()
Dim myPath As String, myXls As String Dim wb As Workbook, r As Range, dst As Range Dim i As Long, n As Long, o As Long
myPath = "★★★" myXls = Dir(myPath & "*.xls*")
Application.DisplayAlerts = False
With ThisWorkbook.Sheets("Sheet1") Set dst = .Range("A2")
End With
Do While myXls <> "" If myXls <> ThisWorkbook.Name Then Set wb = Workbooks.Open(myPath & myXls) Set r = wb.Sheets("No1").Range("D1").CurrentRegion
r.AutoFilter r.AutoFilter Field:=4, Criteria1:="<>", _ Operator:=xlAnd, Criteria2:="<>#N/A" n = r.Columns(4).SpecialCells(xlCellTypeVisible).Count - 1 If n > 0 Then r.Offset(1).Copy dst.Offset(o).PasteSpecial xlPasteValues End If o = o + n wb.Close False End If myXls = Dir() Loop End Sub
(かな) 2016/06/08(水) 14:23
β様にご提示頂いた”分析ツール”のアドインのチェックをはずすを先に試した
ところ、エラー出ませんでした!!
ちょっと私自身、未熟なためなぜエラーがなくなったのか分かりませんが・・・
???様
DoEvents恥ずかしながら初めて知りました。
ちょっと調べてみます
(かな) 2016/06/08(水) 14:30
>>ちょっと私自身、未熟なためなぜエラーがなくなったのか分かりませんが・・・
βもわからないんです。 というのは、βは xl2003以来、PCセットアップ時に必ず、エクセルの、この分析ツールにチェックを入れ FUNCRES がアドインされた状態で使ってきました。その後、xl2007-->xl2010-->xl2013 と、同様にしてきましたが 過去から現在に至るまで、このことで障害が起こったことはないんです。
でも、かなさんも、あるいはご紹介したトピの関係者さんも、この手当てで障害がなくなったといわれているので なにか、あるんでしょうね。
(β) 2016/06/08(水) 14:38
ともあれ、皆様本当にありがとうございました!!
(かな) 2016/06/08(水) 15:29
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.