• ベストアンサー

エクセル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メソッドが失敗しました。 でとまってしまいます。 どなたか対応策を教えてください。 よろしくおねがいいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

シートの保護とかしてある場合は、解除してから 削除し、再度 保護してください。

enako
質問者

お礼

takntさん、こんにちは。 シート保護を解除したらできました! どうもありがとうございました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

なんか、他の方に使ってもらうことを考慮したか、複雑にしてありますが、骨子の (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 も動きました。 ロジックの問題ではないですね。

enako
質問者

お礼

imogasiさん、こんにちは。 そうなんです、他の人間に頼まれてこのようなこと をしております。(初心者の私に頼むほど超初心者からの 依頼です) いろいろ試していただいてありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

こんにちは。 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

enako
質問者

お礼

papayukaさん、こんにちは。 確かに最大行数を超えた場合の処理も必要ですよね。 どうもありがとうございました。

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.2

#1の方に同意です。 削除処理の前に  ActiveSheet.Unprotect 処理の後に  ActiveSheet.Protect を追加してみてください。

enako
質問者

お礼

happypointさん、こんにちは。 「シートを保護していた」とは質問に書いていな かったのに即解明されたとは・・・・。 自分の勉強不足を痛感させられました。 ありがとうございました。

関連するQ&A