2017-05-16 9 views
0

Excel 2010 - "DATA1"というラベルのワークシートがあり、この例では特定のセルのみを使用するようにブック全体が保護されています。ロックされていない状態で重複を削除する列(「L:N」)があっても、重複は削除されません。ワークブック全体の保護を解除して再保護する方法は、コードが実行しなければならないすべてのアクションを考慮すると実行可能なオプションではありません。 FYI:管理者がファイル全体を保護されていない場合、コードは完全に実行されます。Excel VBAセルがロックされていなくてもブックが保護されている場合は重複を削除します

それは、このエラーメッセージを表示して、次のコードでハング

- 「ファイル名を指定して実行時エラー 『1004』:アプリケーション定義またはオブジェクト定義のエラー:シート全体のロックを解除した後

ActiveSheet.Range("L1:N200").RemoveDuplicates Columns:=Array(1, 2, 3), _ 
    Header:=xlYes 

、でも、ブック全体を考えました保護されて、それが今のコードの最初の行に停止します。

Sub mcr_FTE_Names() 

'Clear contents in the FTE Names columns for a clean slate 
Sheets("DATA1").Range("List_FTE_Names").ClearContents 

'Copy FTE Names columns from Labor Forecast Detail 
Sheets("Labor Forecast Detail").Range("List_FTE_Names_Forecast").Copy 

'Paste Special Values of data just copied 
Sheets("DATA1").Range("List_FTE_Names").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Application.CutCopyMode = False 

'Remove Duplicates 
Sheets("DATA1").Range("List_FTE_Names").RemoveDuplicates Columns:=Array(1, 2, 3), _ 
    Header:=xlYes 

'Sort Alphabetically 
ActiveWorkbook.Worksheets("DATA1").Sort.SortFields.Clear 
ActiveWorkbook.Worksheets("DATA1").Sort.SortFields.Add Key:=Range("L2:L800") _ 
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
ActiveWorkbook.Worksheets("DATA1").Sort.SortFields.Add Key:=Range("M2:M800") _ 
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
ActiveWorkbook.Worksheets("DATA1").Sort.SortFields.Add Key:=Range("N2:N800") _ 
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
With ActiveWorkbook.Worksheets("DATA1").Sort 
    .SetRange Range("List_FTE_Names") 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 

End With 

MsgBox "Your Resources have been consolidated and alphabetized," & vbNewLine & "you will now proceed back to the Home page." 
Sheets("Home").Select 
Range("A1").Select 

End Sub 
:ここ

Sheets("DATA1").Range("List_FTE_Names").ClearContents 

は私のコードです210

どのような思考や方向が最も高く評価されます。 ありがとうございます。それは場合に役立ちます

は、ここに私のProtectAll_Admin()のコードです:

Sub ProtectAll_ADMIN() 
Dim ws As Worksheet 
Dim pWord1 As String 
Dim pWord2 As String 

For Each ws In Worksheets 
    If ws.ProtectContents Then 
     MsgBox ActiveWorkbook.Name & " is already protected.", vbCritical 
     Exit Sub 
    End If 
Next ws 

' To Hide all rows and columns for editing 
Call mcr_HideRowsColumns_ADMIN 

pWord1 = InputBox("Please Enter the password") 
If pWord1 = "" Then Exit Sub 

pWord2 = InputBox("Please re-enter the password") 
If pWord2 = "" Then Exit Sub 

'Make certain passwords are identical 
If InStr(1, pWord2, pWord1, 0) = 0 Or InStr(1, pWord1, pWord2, 0) = 0 Then 
    MsgBox "You entered different passwords. No action taken!" 
    Exit Sub 
End If 

    For Each ws In Worksheets 
    ws.Protect Password:=pWord1 
    'ws.Protect UserInterfaceOnly:=True 
    ws.Protect AllowFiltering:=True 
Next 

MsgBox "All Sheets have been Protected" & vbNewLine & "and the File is ready for the PM." 

End Sub 
+0

workbook.protectがセルをロックするかどうかはわかりません。私は、新しいシートが追加されたり動かされたりするのを防ぐだけだと思った。特定のシートが保護されていないと確信していますか? –

+0

@JohnMuggins - ブックを保護するためのコードは、ワークシート内の各自のためです。 ws.Protect Password:= pWord1 ws.Protect AllowFiltering:= True しかし、私はマネージャーが時間通りに入力するためのロックされていないセルをたくさん持っていますFTEの上記のセルはロックされていないので編集することもできます。それは信じられないほど私を困惑させている。私は、マネージャや管理者にとっては恐ろしい回避策を作りたくありません。 –

+0

VBAコードでは、シート( "DATA1")を使用できます。パスワードの保護:= "pWord1"とシート( "DATA1")。 := "pWord1" – Unknown

答えて

1

おそらく、ワークシートが保護されている場合userinterfaceonly方法を使用してみてください。 ie

for each ws in workbook 
    ws.Protect UserInterfaceOnly:=True 
next ws 

このコードでは、ユーザーのみがロックされますが、vbaはロックされません。 VBAコードのシートを保護したり保護したりすることを心配する必要はありません。

+0

私はそれをws.Protect UserInterfaceOnly:= Trueと付け加え、Unprotectにシステムメッセージボックスに私に尋ねる無限ループに私を入れました。 –

+0

私は実際に一緒にそれを張って、それは実際にジョンを働く、ありがとう! ワークシート内の各ファイルについて ws.Protectパスワード:= pWord1、AllowFiltering:= True、UserInterfaceOnly:= True –

+0

数年前にCpearsonからそのトリックを学びました。非常に役立ちます。しかし、はい、私が書いたコードは、コードが実行される前にすべてのワークシートを保護されていない状態にする必要がありました。エラーを回避するために、単に "ws.protect userinterfaceonly:= True"の直上に "ws.unprotect"行を追加することができます。 –

関連する問題