セルを保護しながら、ドロップダウンリストが機能するようにする

セルを保護しながら、ドロップダウンリストが機能するようにする

ドロップダウン リストがあるセルを保護したいのですが、ドロップダウン リストは引き続き機能させたいです。

保護しようとすると、ユーザーはドロップダウン リストを使用して他の項目やマクロを選択できなくなります。

このエラーメッセージが表示されます

「変更しようとしているセルまたはグラフは保護されているため、読み取り専用です。保護されたセルまたはグラフを変更するには、まず [保護されていないシート] コマンド ([校閲] タブ、[変更] グループ) を使用して保護を解除します。パスワードの入力を求められる場合があります。」

答え1

ドロップダウンはセルに添付されます。そこにデータが格納されます。検証により、データが有効であることが保証されます。

まだ行っていない場合は、セルがロックされていないことを確認してください。セルを右クリックして「セルの書式設定」をクリックし、「保護」タブに移動します。「ロック」チェックボックスはオフになっている必要があります。

答え2

この質問は誤解されているかもしれないと思います。もしそうであれば、そして私が正しく解釈しているのであれば、ここに解決策があります。

Excel では、実際にスプレッドシート ユーザーが検証リストを使用するセルを上書きできます。リストに「Apple」、「Peach」、「Orange」という値が含まれている場合、標準操作では、セルが保護されていない場合、検証リストが添付されていないのと同じように、ユーザーはセルに「Broccoli」と入力できます。ただし、セルとワークシートを保護すると、検証リストから項目を選択できなくなるため、問題が発生する可能性があります。

それが問題であれば、解決策は次のとおりです。

1.  Format the cell using the validation list so it's 
    unprotected. 
2.  With the cursor positioned at that cell, open the 
    Validation menu origintally used to identify the validation 
    list. 
3.  On the Settings tab of the Data Validation window pane,
    be sure that "ignore blank" is unchecked, and 
    continue to leave that window pane open. 
4.  On the "Error alert" tab of the Data Validation window
    pane:  
      a) Be sure "Show error alert after invalid data is
         entered" is checked. 
      b) Select "Stop" under the "Style" heading.
      c) Give your error alert a name under "Title"; this 
         can be anything, but a short title is best. 
      d) Under "Error message", type a short message that you
         want to appear if a user tries to manually type a value
         in the cell - something like "Please use the drop-down
         menu provided to select a value for this cell."
      e) Click "OK". 

これにより、ワークシートが保護されていない場合でも、データの検証を使用するように意図されたセルにユーザーが任意の入力を行うことができなくなります。ただし、データの検証リスト自体が意図せず更新されるのを防ぐため、ワークシートを保護することをお勧めします。

答え3

私のコンピューター (Excel 2010 を実行している PC) では、ドロップダウン リスト自体は実際にはすぐ右のセルに添付されているようです。そのため、A7 にドロップダウン リストが必要な場合は、A7 と B7 の両方のロックを解除する必要があります。

これはバグかもしれませんが、修正は比較的簡単です。

答え4

保護されたシートの場合:

以下のリンクをワークブックに貼り付けます

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim wsh As Variant
    For Each wsh In Worksheets(Array("Sheet1"))
        wsh.EnableOutlining = True
        wsh.Protect UserInterfaceOnly:=True, Password:="", _
            DrawingObjects:=False, _
    Contents:=True, _
    Scenarios:=True, _
    AllowFormattingCells:=False, _
    AllowFormattingColumns:=False, _
    AllowFormattingRows:=False, _
    AllowInsertingColumns:=False, _
    AllowInsertingRows:=False, _
    AllowInsertingHyperlinks:=False, _
    AllowDeletingColumns:=False, _
    AllowDeletingRows:=False, _
    AllowSorting:=False, _
    AllowFiltering:=False, _
    AllowUsingPivotTables:=False
    Next wsh

Dim Oldvalue As String
Dim Newvalue As String

On Error GoTo Exitsub
If Target.Address = "$C$2" Then 'As required
    If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then
    GoTo Exitsub
    Else: If Target.Value = "" Then GoTo Exitsub Else
        Application.EnableEvents = False
        Newvalue = Target.Value
        Application.Undo
        Oldvalue = Target.Value
        If Oldvalue = "" Then
            Target.Value = Newvalue
        Else
            Target.Value = Oldvalue & ", " & Newvalue
        End If
    End If
End If


Exitsub:
Application.EnableEvents = True

End Sub

関連情報