我使用下面的代码将在Microsoft Excel中打开的工作簿的名称写入数组,但它不会返回新打开的Excel文件的名称,该文件是使用模板文件(.xltm(从SQL Server生成的,因为我知道用户帐户是域用户。那么,是因为模板还是域用户帐户?我如何解决这个问题并获得这样的文件的名称?
For Each AWB In Application.Workbooks
If AWB.Name <> ThisWorkbook.Name Then
WB_Array(i) = AWB.Name
i = i + 1
End If
Next AWB
感谢
扩展Tim Williams在评论中给出的链接中的好答案,如果问题是另一个工作簿在不同的Excel实例中打开,那么仅在Application.Workbooks
中查找将无法找到它。您需要获取所有打开的Excel.Application
对象,然后检查它们的每个Application.Workbooks
集合。
这要归功于Florent B.的代码。将他们的代码添加到您的项目中。然后使用以下函数将每个工作簿收集到字典中。我已经包含了一个如何使用该函数将所有工作簿名称收集到数组中的示例。
Sub Example()
Dim AllWorkbooks As Object
Set AllWorkbooks = GetAllWorkbooks
'AllWorkbooks.Keys() is now an array containing the names of all open workbooks
'AllWorkbooks.Items() is now an array of all open workbook objects
End Sub
Function GetAllWorkbooks() As Object
Dim xlWorkbooks As Object
Set xlWorkbooks = CreateObject("Scripting.Dictionary")
Dim xl As Application
For Each xl In GetExcelInstances()
Dim WB As Workbook
For Each WB In xl.Workbooks
If Not xlWorkbooks.Exists(WB.Name) Then xlWorkbooks.Add WB.Name, WB
Next
Next
Set GetAllWorkbooks = xlWorkbooks
End Function
将工作簿打开到数组
Option Explicit
Sub ListWorkbookNames()
Dim wbCount As Long: wbCount = Workbooks.Count
If wbCount = 1 Then
MsgBox "Only the workbook containing this code is open.", vbExclamation
Exit Sub
End If
Dim WorkbookNames() As String: ReDim WorkbookNames(1 To wbCount - 1)
Dim wb As Workbook
Dim n As Long
For Each wb In Workbooks
If Not wb Is ThisWorkbook Then
n = n + 1
WorkbookNames(n) = wb.Name
End If
Next wb
MsgBox "Found the following open workbooks:" & vbLf _
& Join(WorkbookNames, vbLf), vbInformation
End Sub