我正在尝试在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,但都没有工作)
谢谢
答案 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