オートメーションエラーについて


にの  2006-05-02 20:08:48  No: 131225

初心者なもので、よろしくお願いします。
シートを削除しようとすると
「実行時エラー'-2147221080(800401a8)':オートメーションエラーです」と表示されます。
どうすればいいでしょうか?

ソースコードを書きます。
勤務表③のみを残して、他のシート全てを消去したいと思っています。
=============================================================
ソースコード
=============================================================
Private Function funcExcelCopy2(i_PCord As String) As Boolean
  Dim wsコピー元シート      As String
  Dim wsコピー先シート      As String

〜中略〜  

  On Error GoTo Exit_funcExcelCopy2
  funcExcelCopy2 = False
  
  
  Application.Visible = False
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  
  ActiveWorkbook.Save 

  wsコピー元シート = Application.ActiveWorkbook.Path & "\" & Application.ActiveWorkbook.name
  wsコピー先シート = Application.ActiveWorkbook.Path & "\" & "勤務表" & i_PCord & Format((Sheets("月次勤務報告書").Cells(1, 3).Value + 1988), "0000") & Format((Sheets("月次勤務報告書").Cells(1, 5).Value), "00") & Sheets("基本情報").Cells(3, 3).Value & ".xls"
  
〜中略〜 
  
  'wsコピー先シートという名前で保存する。
  ActiveWorkbook.SaveAs wsコピー先シート
  
  'エラーをクリア
  Err.Clear
  On Error GoTo Exit_funcExcelCopy2
  
  '勤務シートを選択
  Sheets("勤務表③").Select
  
  'いらないシートを消去
  Sheets("月次勤務報告書").Delete  ☆この部分でエラーが発生する。
  Sheets("勤務表①").Delete
  Sheets("勤務表②").Delete
  Sheets("操作説明").Delete
  Sheets("入力サンプル").Delete
  Sheets("PJ集計①").Delete
  Sheets("PJ集計②").Delete
  Sheets("選択項目").Delete
  Sheets("ISES取込").Delete
  Sheets("ISES基本").Delete
  Sheets("基本情報").Delete
  Sheets("ISES").Delete
  
  ActiveWorkbook.Save
  funcExcelCopy2 = True

'異常時処理(終了処理)
Exit_funcExcelCopy2:
  Application.DisplayAlerts = True 
  Application.ScreenUpdating = True
  Application.Visible = True 
End Function


特攻隊長まるるう  2006-05-02 21:13:04  No: 131226

開発環境が書かれていません。
[Excel VBA]ですよね?Office(Excel)のバージョンも書いておいてください。

とりあえず、デバッグ中は DisplayAlerts = True にしておいてください。

複数のブックを操作している状態で対象のブックを指定しない
Sheets は使わない方がいいと思いますが…まずは

>  'いらないシートを消去
  Dim objSheet As Object
  For Each objSheet In Sheets
    Debug.Print objSheet.Name
  Next
>  Sheets("月次勤務報告書").Delete '☆この部分でエラーが発生する。
というコードを挿入して、削除したいシートが存在するか確認してください。


にの  2006-05-02 22:20:47  No: 131227

開発環境を書き忘れていました。
すみませんでした。
[Excel VBA]でOffice(Excel)のバージョンは2000です。

>Dim objSheet As Object
>  For Each objSheet In Sheets
>    Debug.Print objSheet.Name
>  Next
挿入してみましたが、削除したいシートは存在しました。


特攻隊長まるるう  2006-05-02 23:22:31  No: 131228

ああ、それと実際に使ってるコードをコピペするのは
やめた方がいいですよ。回答者が再現するのが面倒
ですし、情報漏えいにつながる場合があります。

削除部分を以下の関数に置き換えてみてください。
どの段階でエラーになりますか?
[Excel VBA]
>  'いらないシートを消去
  Call TestDelete
  MsgBox "終了しました。"
>  Sheets("月次勤務報告書").Delete '☆この部分でエラーが発生する。
Private Sub TestDelete()
    Dim TargetWorkbook As Excel.Workbook
    On Error GoTo ErrorHandler
'    Set TargetWorkbook = Application.Workbooks("Book1")
    Set TargetWorkbook = ActiveWorkbook
'    Call WorksheetDelete(TargetWorkbook, "Sheet2")
    Call WorksheetDelete(TargetWorkbook, "月次勤務報告書")
    Call WorksheetDelete(TargetWorkbook, "勤務表①")
    Call WorksheetDelete(TargetWorkbook, "勤務表②")
    Call WorksheetDelete(TargetWorkbook, "操作説明")
    Call WorksheetDelete(TargetWorkbook, "入力サンプル")
    Call WorksheetDelete(TargetWorkbook, "PJ集計①")
    Call WorksheetDelete(TargetWorkbook, "PJ集計②")
    Call WorksheetDelete(TargetWorkbook, "選択項目")
    Call WorksheetDelete(TargetWorkbook, "ISES取込")
    Call WorksheetDelete(TargetWorkbook, "ISES基本")
    Call WorksheetDelete(TargetWorkbook, "基本情報")
    Call WorksheetDelete(TargetWorkbook, "ISES")
    Exit Sub
ErrorHandler:
    Debug.Print Err.Description
    MsgBox "エラーが発生しました。" _
            & vbCrLf & "Err.Number : " & CStr(Err.Number) _
            & vbCrLf & Err.Description
End Sub

Private Sub WorksheetDelete(ByRef TargetWorkbook As Excel.Workbook, ByVal WorksheetName As String)
    Dim xlWorksheet As Excel.Worksheet
    Dim blnDisplayAlerts As Boolean
    On Error GoTo ErrorHandler
    Set xlWorksheet = TargetWorkbook.Worksheets(WorksheetName)
    If TargetWorkbook.Sheets.Count = 1 Then
        MsgBox "他にシートが存在しないので削除できません。"
        Exit Sub
    End If
    blnDisplayAlerts = Application.DisplyAlerts
    Application.DisplyAlerts = False
    xlWorksheet.Delete '削除
    Application.DisplayAlerts = blnDisplayAlerts
    Exit Sub
ErrorHandler:
    Debug.Print Err.Description
    MsgBox WorksheetName & " が存在しないか、グラフシートです。" _
            & vbCrLf & "Err.Number : " & CStr(Err.Number) _
            & vbCrLf & Err.Description
End Sub


にの  2006-05-02 23:57:40  No: 131229

実際に使っているコードのコピペは控えるようにします。
何度もすみませんでした。

言われたように追加してみました。
全てエラーになりました。
エラーナンバーは438です。
「オブジェクトは、このプロパティまたはメソッドをサポートしていない」という
メッセージもでます。

異常処理の後に
  Sheets("月次勤務報告書").Delete
  Sheets("勤務表①").Delete
  Sheets("勤務表②").Delete
を追加すると削除してもいいですか?というメッセージがでてOKを押すと
消去され、オートメーションエラーはでてきませんでした。

メッセージも出ず、オートメーションエラーもでないようにしたいと考えています。
しかし、いまだ解決策は見つかっていません。
よろしくお願いします。


特攻隊長まるるう  2006-05-03 00:56:05  No: 131230

>全てエラーになりました。
>エラーナンバーは438です。
>「オブジェクトは、このプロパティまたはメソッドをサポートしていない」という
えぇ?エラーの本当の内容を特定するのが目的だったんだけど、どの行でエラー?

  ポイントとして On Error GoTo とかのエラー処理を入れてるとエラーが
起きても処理が継続されてエラーに気づかないのでエラー処理はデバッグ
作業が終了してから最後に実装する。もしくはエラーが起こった時に何かの
出力を必ず行うようにする…ということ。
  それはボクのコードでやったので、どの行でエラーが出るかステップ実行
して確認してください。やり方は
>Private Sub TestDelete()
の行にブレークポイント([F9]キー)を設定する。
プログラムを実行してブレークポイントで止まったら[F8]キーを押しながら
どの行でエラーが発生するか確認する。(エラー処理を外してもいいんだけど…)
確認した行を報告してください。

>異常処理の後に
>  Sheets("月次勤務報告書").Delete
>  Sheets("勤務表①").Delete
>  Sheets("勤務表②").Delete
>を追加すると削除してもいいですか?というメッセージがでてOKを押すと
>消去され、オートメーションエラーはでてきませんでした。
えーと。ボクの作成した WorksheetDelete という関数で削除できないと
その時点で問題なので、勝手にコードは追加しないで下さい。
…ついでに(分かってくれてるとは思うけど)
>  MsgBox "終了しました。"
までで削除作業は終わりです。
>  Sheets("月次勤務報告書").Delete '☆この部分でエラーが発生する。
>  Sheets("勤務表①").Delete
>  Sheets("勤務表②").Delete
>・・・
はコメントアウト(コメントにすること)するか、削除しておいてください。


特攻隊長まるるう  2006-05-03 01:15:56  No: 131231

あ、ゴメン。最後に追加したところがエラーになるね。
…プロパティなのに取得できないみたい...(  _)_
……ヘルプには取得できるって書いてあるのになぁ。。。
以下、修正版です。
Private Sub WorksheetDelete(ByRef TargetWorkbook As Excel.Workbook, ByVal WorksheetName As String)
    Dim xlWorksheet As Excel.Worksheet
'    Dim blnDisplayAlerts As Boolean
    On Error GoTo ErrorHandler
    Set xlWorksheet = TargetWorkbook.Worksheets(WorksheetName)
    If TargetWorkbook.Sheets.Count = 1 Then
        MsgBox "他にシートが存在しないので削除できません。"
        Exit Sub
    End If
'    blnDisplayAlerts = Application.DisplyAlerts
    Application.DisplayAlerts = False
    xlWorksheet.Delete '削除
    Application.DisplayAlerts = True
    Exit Sub
ErrorHandler:
    Debug.Print Err.Description
    MsgBox WorksheetName & " が存在しないか、グラフシートです。" _
            & vbCrLf & "Err.Number : " & CStr(Err.Number) _
            & vbCrLf & Err.Description
    Application.Visible = True
End Sub


にの  2006-05-03 01:26:53  No: 131232

記述があいまいでした。すみません。
WorksheetDeleteを呼び出して、blnDisplayAlerts = Application.DisplyAlertsのところでErrorHandler:に飛んでしまいます。
そして、エラーメッセージがでるような流れです。
それが全てのシートで起こります。
シートは消されずに残ったままです。
答えになってませんかね?

>それはボクのコードでやったので、どの行でエラーが出るかステップ実行
>して確認してください。やり方は
>>Private Sub TestDelete()
>の行にブレークポイント([F9]キー)を設定する。
>プログラムを実行してブレークポイントで止まったら[F8]キーを押しながら
>どの行でエラーが発生するか確認する。(エラー処理を外してもいいんだけど…)
>確認した行を報告してください。
↑のやり方で確認しました。


にの  2006-05-03 01:37:51  No: 131233

修正版ありがとうございます。
修正版で試した結果、月次勤務報告シートは削除できたのですが、削除できたあとに
「中断モードでは入力できません」というエラーがでてきて、オートメーションエラーになります。
>Application.DisplayAlerts = False
>xlWorksheet.Delete '削除
>Application.DisplayAlerts = True
の部分がFalseを代入できないみたいです。
Application.DisplayAlertsには、「True」が入っています。
関係ありますか?


特攻隊長まるるう  2006-05-03 02:43:53  No: 131234

>中断モードでは入力できません
んンン。。。そのメッセージはステップ実行中(=中断モード)に
何か操作した時に出たような気が…。デバッグ中の話なので
オートメーションエラーとは直接関係無いような…。
なんかヘンなマクロ残してたりしません?何かのイベントで
セルに何か入力したり…。
面倒でなければ、新規ブックで作り直した方がいいかも
しれませんが…。

ただ、こちらでも
>blnDisplayAlerts = Application.DisplyAlerts
を実行しちゃったあとに何かおかしな動きをしましたので、
修正版のコードにした後に手作業で保存して、一度
すべてのエクセルを閉じていただけますか?
念のためタスクマネージャ([Ctrl]+[Alt]+[Delete]キー同時押し
で表示されるダイアログで[T]キー)で[プロセス]-[イメージ名]に
Excel.EXE が1つも無くなったことを確認して下さい。
(これが残ってるとたまに悪さする…)

>修正版で試した結果、月次勤務報告シートは削除できたのですが、
削除できた場合…エラーが起こってないというか…エラーの
原因がシート削除の処理以外の可能性も出てきましたが…。
>>Application.DisplayAlerts = False
>>xlWorksheet.Delete '削除
>>Application.DisplayAlerts = True
>の部分がFalseを代入できないみたいです。
>Application.DisplayAlertsには、「True」が入っています。
>関係ありますか?
Application.DisplayAlerts はヘルプに書いてある通り、マクロの
実行中に表示される特定の警告やメッセージを表示しないための
ものです。On Error GoTo と同じでバグ取りが十分でないうちは
False にしない方がいいというだけで、それがオートメーションエラー
の直接的な原因となる可能性は低いです。
シートを削除する前後でなぜ変更しているかといいますと
>削除してもいいですか?というメッセージがでてOKを押すと消去され、
のメッセージを表示しないためです。

違う路線から攻めましょうか…。最初の質問の
>〜中略〜
の部分ですが、シートのコピーとかしてます?その時、Copy メソッド
使ってます?
シートの削除処理は、ひとまず置いておいて(シート削除しないで)、
保存処理を終了してください。
> wsコピー先シート 
で保存したファイルを開いた時に
『このブックには、ほかのデータソースへのリンクが設定されています。』
というメッセージが出たりはしませんか?。


にの  2006-05-08 23:18:13  No: 131235

すみません、ゴールデンウィーク中はネットが使えない環境にいましたので、返信が遅くなりました。

>何かのイベントでセルに何か入力したり…。
Function funcExcelCopy2関数を呼び出す前に勤務表③の方で
セルに入力しています。

>念のためタスクマネージャ([Ctrl]+[Alt]+[Delete]キー同時押し
>で表示されるダイアログで[T]キー)で[プロセス]-[イメージ名]に
>Excel.EXE が1つも無くなったことを確認して下さい。
>(これが残ってるとたまに悪さする…)
心がけます。

>〜中略〜
>の部分ですが、シートのコピーとかしてます?その時、Copy メソッド
>使ってます?
使っていますが、今はコメントアウトにしています。

> wsコピー先シート 
>で保存したファイルを開いた時に
>『このブックには、ほかのデータソースへのリンクが設定されています。』
>というメッセージが出たりはしませんか?。
そのようなメッセージは出ていません。

追加なのですが、月次勤務報告書・勤務表①・勤務表②・ISES取込以外は
なんのメッセージもなく消去できました。


特攻隊長まるるう  2006-05-09 03:05:16  No: 131236

1つ確認漏れがありました。サービスパックはあててますか?
Excel 2000 だと SP3 だっけかなぁ。。。
OS の方も確認しておいたほうが良いでしょう。

…で、続きですが。。。
以下、『800401a8』のエラーナンバーで引っ掛かった情報です。

[XL97:さまざまなとき、エラーは、削除または移動されたシートを参照します。]
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B158997

[XL2000: エラーのマクロでのグラフ場所が変更されると、エラーが表示されます。]
http://support.microsoft.com/?scid=kb;ja;211436&spid=1741&sid=783

[多分、エクセルファンクラブのメルマガの過去ログ]
http://www.keep-on.com/excelyou/2002lng4/200210/02100247.txt

>追加なのですが、月次勤務報告書・勤務表①・勤務表②・ISES取込以外は
>なんのメッセージもなく消去できました。
そのシートが他のシートと何が違うか?調べないと分からないでしょうね。
リンク先の情報を見ると、マクロ中の変数かエクセルの機能の参照か何か…
が、削除(または移動、コピー)したシートを参照している可能性が高いように
思います。が、これ以上は分かりません。シートを削除するのみでは、こちら
でエラーを再現できませんでしたので、これ以上、こちらで調べられる事が
無さそうです。

…とまぁ、ボクができる事は以上なんですが、ボクが同じ立場だったら、まず、
マクロ中の変数の整理をして funcExcelCopy2 関数を機能毎にもう少し小さい
関数に分け、コピーの処理などでシートが自分のシート以外を参照している
部分を洗いますかねぇ。。。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加