存储所有当前打开的Excel工作簿,稍后再打开

时间:2015-06-12 09:53:35

标签: excel vba excel-vba

我目前正面临一个问题,我想:

1.将所有当前打开的excel工作簿存储在一个数组中

2.保存并关闭工作簿

3.打开所有打开的工作簿

4.重点关注特定的工作簿

我目前的代码:

For Each wb In Application.Workbooks

wb.Save

Next wb

按预期工作,但我不同的excel工作簿保持“闪烁”状态。这有点刺激,因此需要保存和关闭所有。

我明白要重点关注特定的工作簿,你可以使用激活功能。如果我在'对于每个循环'内部执行一个set数组,它将无法工作,因为它将成为一个双循环。

由于我是VBA的新手,我非常感谢大家的任何意见。

谢谢!

2 个答案:

答案 0 :(得分:2)

我在这段代码中给了你两个不同的选项。使用集合或数组。 您可以使用 Collection 循环中的For Each item 单步执行集合,而数组需要For..Next循环。

Sub All_OpenWorkBooks_Collection()

    Dim wrkBk As Workbook

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Add to a collection                                 '
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim vItem As Variant
    Dim colWorkBooks As Collection
    Set colWorkBooks = New Collection

    For Each wrkBk In Workbooks
        If wrkBk.Name <> ThisWorkbook.Name Then
            colWorkBooks.Add wrkBk.FullName
            wrkBk.Close SaveChanges:=True
        End If
    Next wrkBk
    Set wrkBk = Nothing

    For Each vItem In colWorkBooks
        Workbooks.Open (vItem)
    Next vItem

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Set a reference to a specific workbook - can then use wrkBk to refer to it. '
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Set wrkBk = Workbooks("Copy (4) of New Microsoft Excel Worksheet.xlsx")
    wrkBk.Activate

End Sub

    '------------------------------------------------------------------------

Sub All_OpenWorkbooks_Array()

    Dim wrkBk As Workbook

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Add to an array.                                      '
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim x As Long
    Dim arrWrkBk() As Variant
    ReDim arrWrkBk(1 To Workbooks.Count)

    For x = Workbooks.Count To 1 Step -1
        If Workbooks(x).Name <> ThisWorkbook.Name Then
            arrWrkBk(x) = Workbooks(x).FullName
            Workbooks(x).Close SaveChanges:=True
        End If
    Next x

    For x = 1 To UBound(arrWrkBk)
        If arrWrkBk(x) <> "" Then
            Workbooks.Open (arrWrkBk(x))
        End If
    Next x
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Set a reference to a specific workbook - can then use wrkBk to refer to it. '
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Set wrkBk = Workbooks("Copy (4) of New Microsoft Excel Worksheet.xlsx")
    wrkBk.Activate

End Sub

编辑:注意我在数组循环中向后退一步 - 因为它正在计算打开的工作簿并关闭它们随着循环的进行打开的工作簿的数量会下降(所以当它到达第4个循环时,工作簿编号4的可能性很大已经关闭了。)

编辑2:关于工作空间的评论可能正是您所追求的 - 我先检查一下。

答案 1 :(得分:0)

会加入     .ScreenUpdating = False 在你的循环帮助之前?

和     .ScreenUpdating = true 之后重新打开它。

相关问题