启用编辑vba

问题描述 投票:0回答:1

我正在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
excel-vba edit vba excel
1个回答
0
投票

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

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

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

For w = wCount To 1 Step -1
© www.soinside.com 2019 - 2024. All rights reserved.