首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBA关闭工作簿,但以前打开的工作簿除外

VBA关闭工作簿,但以前打开的工作簿除外
EN

Stack Overflow用户
提问于 2021-03-24 22:56:48
回答 2查看 49关注 0票数 1

我一直在努力想办法解决这个问题。因此,我在excel工作簿中有代码,可以从word文档中的图表打开和修改嵌入式Sourcedata工作簿。

我想要做的是关闭word文档中图表中的所有嵌入工作簿,但使用Application.Workbooks集合和“For Each workbook”循环。当我尝试使用此循环时,它将关闭所有工作簿,甚至包括那些在运行打开嵌入式工作簿的代码之前打开的工作簿。所以我编写了这样的代码来关闭嵌入的工作簿,但它花费的时间太长了:

代码语言:javascript
复制
 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 (包含代码)之前不关闭所有以前打开的工作簿。已打开的工作簿的数量因运行代码的人员而异。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-24 23:56:13

你所做的一切都是有意义的。这是一个使用For...Next而不是For...Each的版本。我还使用嵌套With根据需要自动创建和销毁对象。删除Activate会让事情变得更快。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-03-24 23:11:12

请使用下一个函数返回嵌入的工作簿名称。然后,您应该在打开的工作簿之间进行迭代,然后关闭它们:

代码语言:javascript
复制
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

我会建议下一种使用它的方式:

代码语言:javascript
复制
 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66783698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档