- ベストアンサー
マクロの記録で作ったルーチンが動きません
EXCEL2002で「マクロの記録」を使ってこんなマクロを作りました。 <マクロ> Sub Macro1() Sheets("ABC").Select Sheets("ABC").Copy Before:=Sheets(1) Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("ABC").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.Delete End Sub これをコマンドボタンの押下に組込、こんなサブルーチンにしました。 <サブルーチン> Private Sub CommandButton3_Click() Sheets("ABC").Select Sheets("ABC").Copy Before:=Sheets(1) Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("ABC").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.Delete End Sub これを実行すると4行目のCells.Selectで 実行時エラー'1004' RangeクラスのSelectメソッドが失敗しました。 となって止まってしまいます。 ■■質問■■ なぜでしょう?<マクロ>の方はエラーになりません。 ■■追加の質問■■ 一方、マクロの方は 選択したシートに、データが存在する可能性があります。データを完全に削除する には、[削除]をクリックしてください。 となってしまいます。このメッセージを回避する方法ははありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
マクロは標準モジュールにあって、サブルーチンのCommandButton3_Clickはシートのモジュールにあるからではないでしょうか? Sheets(1).Cells.Select にしてあげればどうでしょうか?
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
シートを複数処理対象にしているとき Cells()を使うときは、シートの別(名やインデックス番号)を明示的にはっきりさせないとエラーになります。それと同じ理由と思います。 原則に返って、シート名.Range指定(CellsもRange)とする。 別件だが、Range(Cells(r1, c1), Cells(r2, c2)).Select の時に(シートを複数処理対象にしているとき)良く失敗する。
お礼
回答ありがとうございます。 内容を理解せずに表面だけまねてVBAを使っているので時々トラブルが発生します。 今後はアドバイスを参考にしたいと思います。 お礼が遅くなってすみませんでした。
- nda23
- ベストアンサー率54% (777/1415)
Cells.Selectがエラーになる理由は分かりません。 CommandButton3_Click()の中でMacro1を呼び出すようにしてみては? 警告の抑制は以下のようにします。 Application.DisplayAlerts = False
お礼
回答ありがとうございました。 No.2の方の回答にこれを組み合わせることでうまくゆきました。 お礼が遅くなってすみません。
お礼
回答ありがとうございます。 自分で理解せずにマクロをパクッて自動化しているだけのエクセルユーザなので困っていました。 この方法でうまくゆきました。フォーカス(と言うのかどうかわかりませんが)が新しくできた方のシートに移っていたのでこんな問題があるとは思いませんでした。 No.1の方のアドバイスを取り入れて完全自動化ができました。 ありがとうございました。 また、お礼が遅くなってすみませんでした。たった今確認したところです。