我一直在努力想办法解决这个问题。因此,我在excel工作簿中有代码,可以从word文档中的图表打开和修改嵌入式Sourcedata工作簿。
我想要做的是关闭word文档中图表中的所有嵌入工作簿,但使用Application.Workbooks集合和“For Each workbook”循环。当我尝试使用此循环时,它将关闭所有工作簿,甚至包括那些在运行打开嵌入式工作簿的代码之前打开的工作簿。所以我编写了这样的代码来关闭嵌入的工作簿,但它花费的时间太长了:
Dim K As InlineShape
Dim chrt1 As Word.Chart
Dim xWB As Workbook
For Each K In aktDocument.InlineShapes
If K.HasChart Then
Set chrt1 = K.Chart
chrt1.ChartData.Activate
Set xWB = chrt1.ChartData.Workbook
xWB.Activate
xWB.Close
End If
Next有没有办法使用For each工作簿循环来关闭所有嵌入的工作簿,并且在运行代码和ThisWorkbook (包含代码)之前不关闭所有以前打开的工作簿。已打开的工作簿的数量因运行代码的人员而异。
发布于 2021-03-24 23:56:13
你所做的一切都是有意义的。这是一个使用For...Next而不是For...Each的版本。我还使用嵌套With根据需要自动创建和销毁对象。删除Activate会让事情变得更快。
Public Sub CloseInlineExcelBooks()
Dim thisShape As Long
With ActiveDocument
For thisShape = 1 To .InlineShapes.Count
With .InlineShapes(thisShape)
If .HasChart Then
With .Chart.ChartData.Workbook
.Close
End With
End If
End With
Next thisShape
End With
End Sub发布于 2021-03-24 23:11:12
请使用下一个函数返回嵌入的工作簿名称。然后,您应该在打开的工作簿之间进行迭代,然后关闭它们:
Function embededWB() As Variant
Dim k As InlineShape, arr, k As Long
ReDim arr(100)
For Each k In aktDocument.InlineShapes
If k.HasChart Then
arr(k) = k.Chart.ChartData.Workbook.Name: k = k + 1
End If
Next
ReDim Preserve arr(k - 1)
embededWB = arr
End Function我会建议下一种使用它的方式:
Sub testClosingWorkbooks()
'part to create the open Excel object, let us say objExcel
Dim objExcel As Object
Set objExcel = GetObject(, "Excel.Application") 'open Excel session
'if the Excel object is already referenced/created, you should use it...
Dim arr, El, wb As Excel.Workbook
For Each El In arr
For Each wb In objExcel.Workbooks
If wb.Name = El Then wb.Close
Next wb
Next
End Subhttps://stackoverflow.com/questions/66783698
复制相似问题