15

次のコードを使用して、特定のセルのコンテンツをロックしています

Sub LockCell(ws As Worksheet, strCellRng As String)
  With ws
   .Unprotect
   .Cells.Locked = False
   .Range(strCellRng).Locked = True
   .Protect Contents:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True, DrawingObjects:=True
  End With
End Sub

これらの特定の列のコンテンツをロックします。問題は、これらの Excel メニュー項目が無効になっているため、ユーザーがセルを並べ替えたり、フィルター処理したり、境界線を適用したりできないことです。

と思い、AllowSorting:=True同じようにサイズ変更を許可しました。AllowFiltering:=TrueDrawingObjects:=TrueAllowFormattingColumns:=TrueAllowFormattingRows:=True

4

10 に答える 10

6

これは私にとって大きな問題であり、比較的簡単な答えが記載された次のリンクを見つけました。ありがとうボイジャー!!!

他の人がソートできるようにしたい範囲に名前を付けたことに注意してください

  • ワークシートの保護を解除
  • [保護] --- [ユーザーに範囲の編集を許可する] に移動します (Excel 2007 の場合は [確認] タブ)。
  • 「新規」範囲を追加
  • ユーザーに並べ替えを許可する範囲を選択します
  • 「シートの保護」をクリック
  • 今回は、*ユーザーが「ロックされたセル」を選択できないようにします**
  • わかった

http://answers.yahoo.com/question/index?qid=20090419000032AAs5VRR

于 2013-03-13T16:15:18.780 に答える
5

ほぼ同じ機能を実現するためのトリッキーな方法を思いつきました。通常の方法でシートを保護する代わりに、イベント ハンドラーを使用して、ユーザーが実行しようとする操作を元に戻します。

ワークシートのモジュールに次を追加します。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Locked = True Then
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True
    End If
End Sub

ユーザーがロックされたセルを変更するために何かを行うと、その操作はすぐに元に戻されます。イベントの一時的な無効化は、元に戻すこと自体がこのイベントをトリガーしないようにすることであり、無限ループが発生します。

並べ替えとフィルター処理は Change イベントをトリガーしないため、これらの機能は有効なままです。

このソリューションは、セルの内容の変更またはクリアを防止しますが、フォーマットの変更を防止しないことに注意してください。決心したユーザーは、セルのロックを解除するように設定するだけで、それを回避できます。

于 2014-03-26T21:55:52.277 に答える
1

Here is an article that explains the problem and solution with alot more detail:

Sorting Locked Cells in Protected Worksheets

The thing to understand is that the purpose of locking cells is to prevent them from being changed, and sorting permanently changes cell values. You can write a macro, but a much better solution is to use the "Allow Users to Edit Ranges" feature. This makes the cells editable so sorting can work, but because the cells are still technically locked you can prevent users from selecting them.

于 2013-10-23T14:44:54.887 に答える
0

自動フィルタリングがサブルーチン操作の一部である場合は、次を使用できます

BioSum.Unprotect "letmein"

'<Your function here>

BioSum.Cells(1, 1).Activate
BioSum.Protect "letmein" 

一時的にシートの保護を解除し、細胞をフィルタリングし、後で再保護します。

于 2016-04-08T13:10:45.153 に答える
0

これは非常に古いスレッドですが、今でも非常に有用なスレッドです。私は最近同じ問題でここに来ました。適切な場合はシートを保護し、フィルター行 (行 1 など) が選択されている場合は保護を解除することをお勧めします。私のソリューションはパスワード保護を使用していません - 私はそれを必要としません (セキュリティ機能ではなく、セーフガードです)。フィルター ボタンの選択を認識するイベント ハンドラーが見つからないため、まずフィルター セルを選択してからフィルター ボタンをクリックするようユーザーに指示しました。これが私が提唱するものです(私は変更が必要な場合にのみ保護を変更します。それによって時間を節約できる場合とそうでない場合があります-わかりませんが、それは正しいと「感じます」):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Const FilterRow = 1
  Dim c As Range
  Dim NotFilterRow As Boolean
  Dim oldstate As Boolean
  Dim ws As Worksheet
  Set ws = ActiveSheet
  oldstate = ws.ProtectContents
  NotFilterRow = False
  For Each c In Target.Cells
     NotFilterRow = c.Row <> FilterRow
     If NotFilterRow Then Exit For
  Next c
  If NotFilterRow <> oldstate Then
     If NotFilterRow Then
        ws.Protect
     Else
        ws.Unprotect
     End If
  End If
  Set ws = Nothing
End Sub
于 2019-03-28T10:44:59.060 に答える