我目前正面临一个问题,我想:
1.将所有当前打开的excel工作簿存储在一个数组中
2.保存并关闭工作簿
3.打开所有打开的工作簿
4.重点关注特定的工作簿
我目前的代码:
For Each wb In Application.Workbooks
wb.Save
Next wb
按预期工作,但我不同的excel工作簿保持“闪烁”状态。这有点刺激,因此需要保存和关闭所有。
我明白要重点关注特定的工作簿,你可以使用激活功能。如果我在'对于每个循环'内部执行一个set数组,它将无法工作,因为它将成为一个双循环。
由于我是VBA的新手,我非常感谢大家的任何意见。
谢谢!
答案 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 之后重新打开它。