启用编辑vba

时间:2017-12-26 18:20:51

标签: excel-vba edit vba excel

我正在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

1 个答案:

答案 0 :(得分:0)

Application.ProtectedViewWindows似乎是所有受保护视图窗口的集合。只要在其中一个受保护视图窗口上执行.Edit方法,它就不再处于受保护视图模式,因此会从集合中删除。

这意味着当你Edit集合的第一个成员(w1时)时,第二个成员现在成为第一个成员,第三个成员是什么现在成为第二个,等等。然后在循环的下一次迭代中(当w2时),您的代码因此会查看原始的第三个成员,完全忽略了查看原始的第二个成员

解决问题的最简单方法是以相反的顺序遍历数组,即使用:

For w = wCount To 1 Step -1