2012-05-04 4 views
3

ユーザーが2つのセルに郵便番号と数量を入力できるスプレッドシートを作成しました。計算と結果を表示する他のセルがあります。Excel VBAはセルの削除を防ぎますが、編集を許可します

誰かが行と列を削除するのを防ぐためにいくつかのVBAを追加しましたが、範囲内のセルの削除を防止したいと思いますが、特定のセルに変更を加えたり、そこ。

セルE4では、ユーザーは郵便番号を入力できます。 E6では、ユーザーは数量を入力することができます。これらは編集できますが、削除することはできません。 E8:E9E11:E14はすべてリストからデータを保持するドロップダウンリスト(検証)です。これらはドロップダウンを使用して変更できますが、削除することはできません。

L10:L14L16L23:L27L29L30:L33は、すべてのデータは編集できますが、削除していないことができます。

この外観のVBAはどのようなものでしょうか?私はそれがWorksheet_Change() eventを使用すると思います。

+0

なぜワークシートを保護しないのですか?そのような方法でユーザーはセルを編集できますが、削除することはできません。 –

+0

それを試して、私はまだE4の内容を削除することができました。私はそこに値を持っていますが、削除して空のセルをクリックしないようにしたいのですが、変更することができます – AdRock

+0

セルの「削除」について説明していません... –

答えて

5

これはあなたの試みですか?ユーザーはセルE4E6を編集できますが、空にすることはできません。私はまた、細胞が手前で空ではないと仮定しています。私は何をしたいです

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo Whoa 

    Application.EnableEvents = False 

    If Not Intersect(Target, Range("E4")) Is Nothing Then 
     If Len(Trim(Range("E4").Value)) = 0 Then Application.Undo 
    ElseIf Not Intersect(Target, Range("E6")) Is Nothing Then 
     If Len(Trim(Range("E6").Value)) = 0 Then Application.Undo 
    End If 

LetsContinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 

フォロー

感謝。他の範囲はどうですか?それはIFのそれのちょうど大した場合ですか、それとも、私たちはCASEとループスルーを使用できますか? - AdRock 2分前

下記のセルのアドレスを追加/削除してください。

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo Whoa 

    Application.EnableEvents = False 

    If Not Intersect(Target, Range("E4,E6,E8:E9,E11:E14,L10:L14,L16,L23:L27,L29,L30:L33")) Is Nothing Then 
     If Len(Trim(Target.Value)) = 0 Then Application.Undo 
    End If 

LetsContinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 
+0

ありがとう、それは私がしたいことです。他の範囲はどうですか?それはIFのそれのちょうど大した場合ですか、それとも、私たちはCASEとループスルーを使用できますか? – AdRock

+0

1つの瞬間..上記のコードを更新:)上記の例は –

+0

上のポストを更新しました:) –

1

あなたは部分的に正しいですが、変更後にWorksheet_Change()がトリガされるため、削除後にトリガされます。 私は、ユーザーが入力した値を格納する隠しシートを用意し、新しい値が空(削除)かどうかをWorksheet_Change()でチェックできます。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$E$4" Then 
     ' check the previous value on the hidden sheet here, if changed, then save it, if empty, then restore it 
    End If 
End Sub