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



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

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

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

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

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

如何选择所有工作表而不是ActiveSheet.Select(我尝试了工作表.select,active工作簿.select,activeworksheet.select,但它们都不起作用(

谢谢

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

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

非常感谢您的回答,我现在正在尝试使用您给我的代码段,它正在工作,但有一个小问题。 我的宏创建了一个带有单词周加上周数的新工作表,因此,当我使用您的代码运行宏时,我的第一个工作表是"第 24 周"创建"第 25 周",如果我在工作表"第 25 周"中并尝试再次运行宏,我会收到此错误"名称已被占用"并生成工作表"第 25 周 (2("。如果我删除该工作表并再次运行宏,则工作正常,生成"第 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

非常感谢您的帮助,我尝试了您给我的最后一个代码,并且我必须进行一些修改(如您所说(,但最终结果是我正在使用的按钮一次生成了 52 张纸。

所以,我所做的是:

而不是

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

我用了

ActiveSheet.Unprotect Password:="password"

其余代码我保持不变

非常感谢您的帮助

试试这个。我还没有测试过这段代码,所以可能需要一些修改。通常考虑避免使用 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

最新更新