自动从外部工作簿更新值

Joh*_*now 7 vbscript excel scripting vba wsh excel-vba

我有以下工作簿设置:

在此输入图像描述

工作簿A具有指向x工作簿B的链接并从中获取数据.工作簿B链接到其他一些工作簿并从中获取数据.

工作簿A是所有其他工作簿包含的"摘要".就像现在一样,我必须在打开工作簿A之前打开我的所有工作簿B,刷新它们并保存.如果我不这样做,工作簿B将不会更新工作簿C中的数据.

是否可以使用.bat或vbs脚本更新所有工作簿B?或者是否可以从工作簿A中更新它们?

我可能会补充一点,我在这台计算机上使用excel启动器,所以最好是解决方案与之兼容.

bre*_*tdj 5

附加的是一个可能的解决方案,作为一个,可以从vba可用的运行

感谢Sid Rout对他的建议编辑 RecursiveFile(objWB)

警告:有太多同时打开的书籍(在vbs递归地狱期间我达到512 )可能会导致内存问题 - 在这种情况下,应该依次更新每个主要分支,然后在继续下一个分支之前关闭这些工作簿.

它能做什么

  1. 打开一个工作簿 strFilePath
  2. 检查1中是否有任何链接的工作簿,如果是,则打开它们(B,B1,B2等)
  3. 然后代码在(2)的每个工作簿中查找任何链接,然后依次打开所有这些链接(B和C2等的C1和C2)
  4. 每个打开的书名都存储在一个数组中, Arr
  5. 打开所有书籍后,初始工作簿将更新,递归代码结束,所有打开的书籍除了strFilePath关闭而不保存
  6. strFilePath 然后保存并关闭
  7. 代码整理了

编辑:更新代码以修复vbs递归问题

Public objExcel, objWB2, lngCnt, Arr()
Dim strFilePath, vLinks
`credit to Sid Rout for updating `RecursiveFileRecursiveFile(objWB)`

Erase Arr
lngCnt = 0

Set objExcel = CreateObject("Excel.Application")
strFilePath = "C:\temp\main.xlsx"

With objExcel
    .DisplayAlerts = False
    .ScreenUpdating = False
    .EnableEvents = False
End With

Set objWB = objExcel.Workbooks.Open(strFilePath, False)
Call RecursiveFile(objWB)

For Each vArr In Arr
    objExcel.Workbooks(vArr).Close False
Next

objWB.Save
objWB.Close
Set objWB2 = Nothing

With objExcel
    .DisplayAlerts = True
    .ScreenUpdating = True
    .EnableEvents = True
    .Quit
End With

Set objExcel = Nothing
MsgBox "Complete"

Sub RecursiveFile(objWB)
    If Not IsEmpty(objWB.LinkSources()) Then
        For Each vL In objWB.LinkSources()
            ReDim Preserve Arr(lngCnt)

            'MsgBox "Processing File " & vL

            Set objWB2 = objExcel.Workbooks.Open(vL, False)
            Arr(lngCnt) = objWB2.Name
            lngCnt = lngCnt + 1
            RecursiveFile objWB2
        Next
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

工作ScreenShots

在此输入图像描述

  • 之所以进入无限循环是因为如果你删除OERN,你会发现`vLinks = objWB.LinkSources()`行失败了,因为vLinks暂时被锁定了之前的`For Each vL In vLinks`循环和因此`vl`将始终从第一个循环返回相同的文件.让我看看我是否能找到另一种选择. (2认同)
  • 我得到了这个工作。非常感谢您的帮助。一些注意事项:我没有让它与 .xlsx 格式一起使用。将工作表重新保存为 .xls 并且它可以工作。我更改了以下行:`For Each vArr In Arr objExcel.Workbooks(vArr).Close False` 改为 `Close True`。否则 B 表不会与更新的值一起保存,当我打开表 A 时,它问我是否要更新链接,它会恢复为旧值(当我第一次打开表时,会显示正确的值,但是更新后恢复)。再次感谢,这比我预期的要多得多 (2认同)