在受保护的Excel工作表上启用宏按钮

3

我有一个宏,可以将一个工作表的行复制到另一个工作表。但是,我想保护这个工作表不被编辑。然而,当我这样做时,宏就无法运行了。我已经尝试了不同的锁定属性,但仍然无法运行。

我尝试过以下方法:

Option Explicit

Dim pwd As String
Dim ws As Worksheet
pwd = "password"

ws.Unprotect password:=pwd
Next ws

Sub FilterAndCopy()
    Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet

    Set sht1 = Worksheets("SHIFT LOG")
    Set sht2 = Worksheets("CHANGE OF NO'S")

    sht2.UsedRange.ClearContents

    With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)
        .Cells.EntireColumn.Hidden = False
        If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False

        .AutoFilter Field:=1, Criteria1:="Change of Numbers"

        .Range("A:F, AD:AD, BL:BO").Copy Destination:=sht2.Cells(4, "B")
        .Parent.AutoFilterMode = False

        .Range("F:AD").EntireColumn.Hidden = True
        .Range("AE:BK").EntireColumn.Hidden = True
   End With

    'Go to last cell in column B
    With ActiveSheet
    Range("B5").Select
    Selection.End(xlDown).Select
    End With

End Sub

ws.Protect password:=pwd
Next ws

是的,你可以使用保护和取消保护工作表,或者你可以锁定你想要保护的单元格... - Ferdinando
我尝试将代码放在保护功能之间,但它不起作用。 - Chopin
我认为你必须先取消保护Sheet2,然后在取消保护工作表之前设置日志和机会表。 - Ferdinando
@Ferdinando,现在看起来怎么样? - Chopin
我用示例回答了如何使用保护和取消保护工作表的问题...请让我知道最新情况。 - Ferdinando
你能解释一下你想要保护哪些工作表,代码在哪里(在模块中吗?),你是如何尝试保护这些工作表的,即在保护后用户可以做什么。你的代码中的ActiveSheet是什么意思? - VBasic2008
1个回答

3

在你的代码前后尝试使用这段代码片段:

之前: 'sheet1和sheet2已受保护

Dim pwd As String
Dim ws as WorkSheet
pwd = "password"

For Each ws In Worksheets
    ws.Unprotect Password:=pwd
Next ws

'your code

AFTER:

For Each ws In Worksheets
    ws.protect Password:=pwd
Next ws

希望这可以帮到你。
在你评论后编辑帖子。
Option Explicit 

Sub FilterAndCopy() 

Dim pwd As String   
Dim sht1, sht2 As Worksheet 
Dim rng As Range    

pwd = "password"    

Set sht1 = Worksheets("SHIFT LOG")  
Set sht2 = Worksheets("CHANGE OF NO'S") 

sht2.Unprotect Password:=pwd 'unprotect the sheet   
sht2.UsedRange.ClearContents ' clear contents   

With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)    

    .Cells.EntireColumn.Hidden = False  
    If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False   

    .AutoFilter Field:=1, Criteria1:="Change of Numbers"    

    .Range("A:F, AD:AD, BL:BO").Copy Destination:=sht2.Cells(4, "B")    
    .Parent.AutoFilterMode = False  


    .Range("F:AD").EntireColumn.Hidden = True   
    .Range("AE:BK").EntireColumn.Hidden = True  

End With    

'Go to last cell in column B    
With ActiveSheet    

    Range("B5").Select  
    Selection.End(xlDown).Select    

End With    

sht2.Protect Password:=pwd ' protect the sheet  


End Sub 

谢谢@Ferdinando。我只想锁定第二个工作表。所以只需更改“CHANGE OF NO'S”。 - Chopin
如果你只想锁定第二个工作表,可以删除For循环并且仅写入 ws.Unprotect Password:=pwd 和最后的 ws.protected Password:=pwd。 - Ferdinando
你能否在你的问题中更新并附上我的全部代码? - Chopin
我不确定哪部分应该放在哪里。 - Chopin
我向@Ferdinando提供了一个可视化。这正确吗? - Chopin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接