dポイントプレゼントキャンペーン実施中!

エクセルで管理表を作ったのですが、運用するのが私ではなく別の人間です。
ちょっと不安なので行を削除する時に「本当に削除しますか?はい・いいえ」とアラートを出し、デフォルトで「いいえ」にフォーカスをあてるにはどのようにすればよいでしょうか。

よろしくお願いします。

A 回答 (2件)

VBAのイベントで行の削除を検知するものは無かったと思うので、チェンジイベントを使い擬似的に作成してみました。


また、デフォルトで「いいえ」にフォーカスをあてるには多分、ユーザーフォームの作成が必要だと思いますが、面倒なのでメッセージボックスで代用し、デフォルトで削除を取り消されるようにしています。
該当するシートのモジュールに以下の手順で貼り付けてみてください。

1.該当のシートのタブを右クリックし、「コードの表示」を選択。
2.出てきたVisualBasicEditor(白い部分)に下記のコードをコピペ。

'*****ここから下をコピペ*****

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count <> Target.Rows.Count * 256 Then Exit Sub

MyYn = MsgBox("行が削除されたか、行の全体に変更が行なわれました。" _
& vbCr & "取り消しますか?", vbYesNo + vbQuestion, "")

If MyYn = vbYes Then
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
End If

End Sub


'*****ここより上までをコピペ*****

3.AltキーとF11キーを同時に押してワークシートへもどります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
VBA初心者の為、検討もつかず。。。勉強します。
思ったような動きでした!!ありがとうございました。

お礼日時:2007/05/25 09:22

> デフォルトで「いいえ」にフォーカスをあてるにはどのようにすれば


> よいでしょうか。

MsgBox で Buttons のオプションに vbDefaultButton2 とか指定すれば
そのボタン(ここでは2番目)がディフォルトになります。

ご質問のことをやろうと思うと、結構面倒ですね。。クラスモジュール
を使うことになります。ご参考までに。

' ■■■ 以降のコードは VBE で [ThisWorkbookモジュール] です
Private Cmb(1) As New Class1

Private Sub Workbook_Open()
  Cmb(0).Bind Application.CommandBars("Worksheet Menu Bar") _
              .Controls("編集(&E)") _
              .Controls("削除(&D)...")
  Cmb(1).Bind Application.CommandBars("Row") _
              .Controls("削除(&D)...")
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim i As Integer
  For i = 0 To 1
    Set Cmb(i) = Nothing
  Next i
End Sub


' ■■■ 以降のコードは VBE で [挿入]-[クラスモジュール] です
' // Class1 モジュール ここから
Private WithEvents mCmb As CommandBarButton

Private Sub Class_Terminate()
  Set mCmb = Nothing
End Sub

Public Sub Bind(ByVal Button As CommandBarButton)
  Set mCmb = Button
End Sub

Private Sub mCmb_Click( _
    ByVal Ctrl As Office.CommandBarButton, _
    CancelDefault As Boolean _
)

  Dim iRes As Integer
    
  ' // 終了条件:: セル以外が選択されている場合は無視
  If UCase$(TypeName(Selection)) <> "RANGE" Then Exit Sub
  ' // 終了条件:: 行全体が選択されていなければ無視
  If Selection.Count < Columns.Count Then Exit Sub
   
  iRes = MsgBox(Prompt:="行全体を削除しようとしています。Σ(゜Д゜" _
            & vbLf & "実行しますか?", _
         Buttons:=vbOKCancel + vbCritical + vbDefaultButton2, _
         Title:="確認してみた")
  If CLng(iRes) = vbCancel Then
    CancelDefault = True
  End If

End Sub
    • good
    • 0
この回答へのお礼

まちがって削除されるとどうやら困るデータなんですよね。
結構、簡単かと思いましたが思いのほかすごく大変そうですね。。
ありがとうございました。

お礼日時:2007/05/25 09:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!