我正在Excel 2016中工作。我目前创建了一个宏,它将循环遍历所有打开的工作簿,并在它们以“report”开头时抓取其中的数据。我现在要解决的问题是如何启用编辑。如果用户在下载所有要组合的报告后启用编辑,则宏没有问题。如果他们错过了那个按钮,他们就会遇到问题而没有抓取数据。
虽然他们没有使用那么多工作簿,但我试图让他们更容易。我发布的代码将执行前3个工作簿,然后继续循环其余5个工作簿,但不会“启用编辑”。
Sub EnableEdit()
Dim bk As Workbook
Dim w As Long, wCount As Long
wCount = Application.ProtectedViewWindows.Count
Set wsh = ThisWorkbook.Worksheets("Data")
On Error Resume Next
If wCount > 0 Then
For w = 1 To wCount
Application.ProtectedViewWindows(w).Activate
Application.ProtectedViewWindows(w).Edit
If Left(ActiveWorkbook.Name, 6) = "report" Then
ActiveWorkbook.Worksheets(1).Range("A1:Z1").Copy _
Destination:=wsh.Range("A1")
nrow = wsh.Cells(Rows.Count, 1).End(xlUp).Row + 1
ActiveWorkbook.Worksheets(1).Range("A2:Z500").Copy _
Destination:=wsh.Range("A" & nrow)
ActiveWorkbook.Close
End If
Next w
End If
On Error GoTo 0
End Sub
答案 0 :(得分:0)
Application.ProtectedViewWindows
似乎是所有受保护视图窗口的集合。只要在其中一个受保护视图窗口上执行.Edit
方法,它就不再处于受保护视图模式,因此会从集合中删除。
这意味着当你Edit
集合的第一个成员(w
为1
时)时,第二个成员现在成为第一个成员,第三个成员是什么现在成为第二个,等等。然后在循环的下一次迭代中(当w
为2
时),您的代码因此会查看原始的第三个成员,完全忽略了查看原始的第二个成员
解决问题的最简单方法是以相反的顺序遍历数组,即使用:
For w = wCount To 1 Step -1