初心者なもので、よろしくお願いします。
シートを削除しようとすると
「実行時エラー'-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
開発環境が書かれていません。
[Excel VBA]ですよね?Office(Excel)のバージョンも書いておいてください。
とりあえず、デバッグ中は DisplayAlerts = True にしておいてください。
複数のブックを操作している状態で対象のブックを指定しない
Sheets は使わない方がいいと思いますが…まずは
> 'いらないシートを消去
Dim objSheet As Object
For Each objSheet In Sheets
Debug.Print objSheet.Name
Next
> Sheets("月次勤務報告書").Delete '☆この部分でエラーが発生する。
というコードを挿入して、削除したいシートが存在するか確認してください。
開発環境を書き忘れていました。
すみませんでした。
[Excel VBA]でOffice(Excel)のバージョンは2000です。
>Dim objSheet As Object
> For Each objSheet In Sheets
> Debug.Print objSheet.Name
> Next
挿入してみましたが、削除したいシートは存在しました。
ああ、それと実際に使ってるコードをコピペするのは
やめた方がいいですよ。回答者が再現するのが面倒
ですし、情報漏えいにつながる場合があります。
削除部分を以下の関数に置き換えてみてください。
どの段階でエラーになりますか?
[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
実際に使っているコードのコピペは控えるようにします。
何度もすみませんでした。
言われたように追加してみました。
全てエラーになりました。
エラーナンバーは438です。
「オブジェクトは、このプロパティまたはメソッドをサポートしていない」という
メッセージもでます。
異常処理の後に
Sheets("月次勤務報告書").Delete
Sheets("勤務表①").Delete
Sheets("勤務表②").Delete
を追加すると削除してもいいですか?というメッセージがでてOKを押すと
消去され、オートメーションエラーはでてきませんでした。
メッセージも出ず、オートメーションエラーもでないようにしたいと考えています。
しかし、いまだ解決策は見つかっていません。
よろしくお願いします。
>全てエラーになりました。
>エラーナンバーは438です。
>「オブジェクトは、このプロパティまたはメソッドをサポートしていない」という
えぇ?エラーの本当の内容を特定するのが目的だったんだけど、どの行でエラー?
ポイントとして On Error GoTo とかのエラー処理を入れてるとエラーが
起きても処理が継続されてエラーに気づかないのでエラー処理はデバッグ
作業が終了してから最後に実装する。もしくはエラーが起こった時に何かの
出力を必ず行うようにする…ということ。
それはボクのコードでやったので、どの行でエラーが出るかステップ実行
して確認してください。やり方は
>Private Sub TestDelete()
の行にブレークポイント([F9]キー)を設定する。
プログラムを実行してブレークポイントで止まったら[F8]キーを押しながら
どの行でエラーが発生するか確認する。(エラー処理を外してもいいんだけど…)
確認した行を報告してください。
>異常処理の後に
> Sheets("月次勤務報告書").Delete
> Sheets("勤務表①").Delete
> Sheets("勤務表②").Delete
>を追加すると削除してもいいですか?というメッセージがでてOKを押すと
>消去され、オートメーションエラーはでてきませんでした。
えーと。ボクの作成した WorksheetDelete という関数で削除できないと
その時点で問題なので、勝手にコードは追加しないで下さい。
…ついでに(分かってくれてるとは思うけど)
> MsgBox "終了しました。"
までで削除作業は終わりです。
> Sheets("月次勤務報告書").Delete '☆この部分でエラーが発生する。
> Sheets("勤務表①").Delete
> Sheets("勤務表②").Delete
>・・・
はコメントアウト(コメントにすること)するか、削除しておいてください。
あ、ゴメン。最後に追加したところがエラーになるね。
…プロパティなのに取得できないみたい...( _)_
……ヘルプには取得できるって書いてあるのになぁ。。。
以下、修正版です。
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
記述があいまいでした。すみません。
WorksheetDeleteを呼び出して、blnDisplayAlerts = Application.DisplyAlertsのところでErrorHandler:に飛んでしまいます。
そして、エラーメッセージがでるような流れです。
それが全てのシートで起こります。
シートは消されずに残ったままです。
答えになってませんかね?
>それはボクのコードでやったので、どの行でエラーが出るかステップ実行
>して確認してください。やり方は
>>Private Sub TestDelete()
>の行にブレークポイント([F9]キー)を設定する。
>プログラムを実行してブレークポイントで止まったら[F8]キーを押しながら
>どの行でエラーが発生するか確認する。(エラー処理を外してもいいんだけど…)
>確認した行を報告してください。
↑のやり方で確認しました。
修正版ありがとうございます。
修正版で試した結果、月次勤務報告シートは削除できたのですが、削除できたあとに
「中断モードでは入力できません」というエラーがでてきて、オートメーションエラーになります。
>Application.DisplayAlerts = False
>xlWorksheet.Delete '削除
>Application.DisplayAlerts = True
の部分がFalseを代入できないみたいです。
Application.DisplayAlertsには、「True」が入っています。
関係ありますか?
>中断モードでは入力できません
んンン。。。そのメッセージはステップ実行中(=中断モード)に
何か操作した時に出たような気が…。デバッグ中の話なので
オートメーションエラーとは直接関係無いような…。
なんかヘンなマクロ残してたりしません?何かのイベントで
セルに何か入力したり…。
面倒でなければ、新規ブックで作り直した方がいいかも
しれませんが…。
ただ、こちらでも
>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コピー先シート
で保存したファイルを開いた時に
『このブックには、ほかのデータソースへのリンクが設定されています。』
というメッセージが出たりはしませんか?。
すみません、ゴールデンウィーク中はネットが使えない環境にいましたので、返信が遅くなりました。
>何かのイベントでセルに何か入力したり…。
Function funcExcelCopy2関数を呼び出す前に勤務表③の方で
セルに入力しています。
>念のためタスクマネージャ([Ctrl]+[Alt]+[Delete]キー同時押し
>で表示されるダイアログで[T]キー)で[プロセス]-[イメージ名]に
>Excel.EXE が1つも無くなったことを確認して下さい。
>(これが残ってるとたまに悪さする…)
心がけます。
>〜中略〜
>の部分ですが、シートのコピーとかしてます?その時、Copy メソッド
>使ってます?
使っていますが、今はコメントアウトにしています。
> wsコピー先シート
>で保存したファイルを開いた時に
>『このブックには、ほかのデータソースへのリンクが設定されています。』
>というメッセージが出たりはしませんか?。
そのようなメッセージは出ていません。
追加なのですが、月次勤務報告書・勤務表①・勤務表②・ISES取込以外は
なんのメッセージもなく消去できました。
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 関数を機能毎にもう少し小さい
関数に分け、コピーの処理などでシートが自分のシート以外を参照している
部分を洗いますかねぇ。。。
ツイート | ![]() |