在受保护的工作簿中运行宏

时间:2020-06-15 19:15:35

标签: excel vba

我正在尝试在Excel中运行宏。我遇到一个问题,问题是我想保护宏将要生成的所有工作表。我有这段代码来生成工作表名称:

**ActiveSheet.Name = "Week " & WorksheetFunction.WeekNum(Range("b5"))**

我正在研究,使用密码在文件中运行宏的一种方法是:

**ActiveSheet.Select
    ActiveSheet.Unprotect Password:="OSDA06"
 ActiveSheet.Select
    ActiveSheet.Protect Password:="OSDA06"**

但是使用此代码,我只能在活动工作表中获得保护,而不能在整个工作簿中获得保护。

如何选择所有工作表而不是ActiveSheet.Select(我尝试了sheets.select,activeworkbook.select,activeworksheet.select,但都没有工作)

谢谢

4 个答案:

答案 0 :(得分:1)

使用For循环遍历所有工作表。

Dim ws as variant

For Each ws in ThisWorkbook.Worksheets
    ws.Unprotect Password:="OSDA06"
next ws

答案 1 :(得分:1)

非常感谢您的回答,我现在正在尝试使用您提供给我的代码,它正在工作,但有一个小问题。 我的宏创建了一个新的工作表,其中包含单词week加上周数,因此,当我使用您的代码运行宏时,我的第一张表是“ week 24”,如果我在工作表“ Week 25”中创建了“ week 25”并尝试再次运行宏,出现此错误“名称已被使用”,并生成工作表“第25周(2)”。如果我删除该工作表并再次运行宏,则可以正常运行,并生成“ week 26”。如果我在“第26周”工作表中并尝试生成另一张工作表,则发生同样的事情,生成第26周(2),我必须将其删除并重试,然后生成“第27周”

这是我的全部代码

Sub WeeklyWorksheet()


   Dim wsheet As Worksheet
    For Each wsheet In ActiveWorkbook.Worksheets
    wsheet.Unprotect Password:="password"
    Next wsheet

    ActiveSheet.Copy After:=Sheets(Worksheets.Count)
    Range("B2:P2").Select
    ActiveCell.FormulaR1C1 = "Week "
    ActiveSheet.Range("B5").Value = ActiveSheet.Range("B5").Value + 7
    Range("C7:C42,D7:D42").Select
    Range("D7").Activate
    Selection.ClearContents
    Range("F7:G42,I7:J42,L7:M42,O7:P42").Select
    Range("O7").Activate
    Selection.ClearContents
    ActiveSheet.Name = "Week " & WorksheetFunction.WeekNum(Range("b5"))

    For Each wsheet In ActiveWorkbook.Worksheets
    wsheet.Protect Password:="password"
    Next wsheet

End Sub

答案 2 :(得分:1)

非常感谢您的帮助,我尝试了您给我的最后一个代码,我不得不做一些修改(如您所说),但是最终结果是我使用的按钮生成了52张纸一次。

所以,我所做的是:

代替

For Each wsheet In ThisWorkbook.Worksheets
    wsheet.Unprotect Password:="password"
    Next wsheet

我用过

ActiveSheet.Unprotect Password:="password"

其余的代码我都保持不变

非常感谢您的帮助

答案 3 :(得分:0)

尝试一下。我尚未测试此代码,因此可能需要进行一些修改。通常考虑避免使用select。这样可以节省一些计算时间,并允许您直接对数据进行操作。

For Each wsheet In ThisWorkbook.Worksheets
    wsheet.Unprotect Password:="password"
    Next wsheet

For i = WorksheetFunction.WeekNum(Now()) to 52
    ActiveSheet.Copy After:=Sheets(Worksheets.Count)
    Range("B2:P2").Select
    ActiveCell.FormulaR1C1 = "Week "
    ActiveSheet.Range("B5").Value = ActiveSheet.Range("B5").Value + 7
    Range("C7::D42").ClearContents
    Range("F7:G42,I7:J42,L7:M42,O7:P42").ClearContents
    ActiveSheet.Name = "Week " & i
next i

    For Each wsheet In ThisWorkbook.Worksheets
    wsheet.Protect Password:="password"
    Next wsheet