- ベストアンサー
エクセルVBAで行削除時にエラーが発生します。
こんにちは。 エクセル2002を使用しています。 VBAで、開始行を入力させ開始行+38行を削除するような マクロを作りました。 Sub 削除() Dim Sline As Integer, Eline As Integer Dim S As String '開始行の入力 Sline = Application.InputBox(prompt:="削除開始 行を入力して下さい。",Type:=1) '開始行が入力された場合 If Sline <> False Then '開始行のチェック '終了削除行のセット Eline = Sline + 37 '削除確認メッセージ S = MsgBox(Sline & "~" & Eline & _ "行を削除します。", _ vbOKCancel + vbExclamation, _ "行削除確認") If S = vbOK Then Rows(Sline & ":" & Eline).Select Selection.Delete Shift:=xlUp End If End If End Sub これを実行すると Selection.Delete Shift:=xlUp のところで、 実行時エラー 1004 RangeクラスのDeleteメソッドが失敗しました。 でとまってしまいます。 どなたか対応策を教えてください。 よろしくおねがいいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
シートの保護とかしてある場合は、解除してから 削除し、再度 保護してください。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
なんか、他の方に使ってもらうことを考慮したか、複雑にしてありますが、骨子の (1) Sub test02() s = InputBox("削除開始行=") Rows(s & ":" & s + 3).Delete End Sub は私もテストしたが、動きました。 (2) Sub test02() s = Application.InputBox(prompt:="削除開始行を入力して下さい。", Type:=1) Rows(s & ":" & s + 3).Delete End Sub も動きました。 (3) Sub test02() s = Application.InputBox(prompt:="削除開始行を入力して下さい。", Type:=1) Rows(s & ":" & s + 3).Select Selection.Delete Shift:=xlUp End Sub も動きました。 ロジックの問題ではないですね。
お礼
imogasiさん、こんにちは。 そうなんです、他の人間に頼まれてこのようなこと をしております。(初心者の私に頼むほど超初心者からの 依頼です) いろいろ試していただいてありがとうございました。
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 Excel97で試しましたが、少なくともExcel97ではシート保護の場合に出るメッセージとは異なるようです。 expression を省略した場合に、起こる事が多い現象だと思っています。 おまじないで削除処理の前に ActiveCell.Activate を入れてみてはどうでしょうか? 例は下記の点も手を加えてます。 1.Integerの範囲を超えるケースを想定し、変数 Sline と Eline を Long に。 2.MsgBoxの戻り値はInteger型なので、変数 S を Integer に。 3.65536行を超えないように処理を追加。 Sub 削除() Dim Sline As Long, Eline As Long, S As Integer Sline = Application.InputBox("削除開始行を入力して下さい。", Type:=1) 'Falseなら抜ける If Sline = False Then Exit Sub '最大行を超えたら最大行まで if Sline > 65536 Then MsgBox "最大行を超えています",vbOKOnly,"終了" : Exit Sub End If Eline = Sline + 37 If Eline > 65536 Then Eline = 65536 S = MsgBox(Sline & "~" & Eline & "行を削除します。", _ vbOKCancel + vbExclamation, "行削除確認") 'OK以外なら抜ける If S <> vbOK Then Exit Sub 'おまじない ActiveCell.Activate Rows(Sline & ":" & Eline).Delete Shift:=xlUp End Sub
お礼
papayukaさん、こんにちは。 確かに最大行数を超えた場合の処理も必要ですよね。 どうもありがとうございました。
- happypoint
- ベストアンサー率36% (521/1422)
#1の方に同意です。 削除処理の前に ActiveSheet.Unprotect 処理の後に ActiveSheet.Protect を追加してみてください。
お礼
happypointさん、こんにちは。 「シートを保護していた」とは質問に書いていな かったのに即解明されたとは・・・・。 自分の勉強不足を痛感させられました。 ありがとうございました。
お礼
takntさん、こんにちは。 シート保護を解除したらできました! どうもありがとうございました。