VBA 关闭之前打开的工作簿

VBA Close workbooks except for previously opened

我一直在想办法解决这个问题。所以我在 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 workbook 循环来关闭所有嵌入的工作簿,而不是在 运行 代码和 ThisWorkbook(包含代码)之前关闭所有其他先前打开的工作簿。已经打开的工作簿数量因人而异运行代码。

请使用下一个函数 return 嵌入的工作簿名称。然后你应该在打开的工作簿之间迭代并关闭它们:

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 Sub

你在做什么是有道理的。这是一个使用 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