7

我有以下工作簿设置:

在此处输入图像描述

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

工作簿 A 是所有其他工作簿所包含内容的一种“总结”。现在,我必须打开所有工作簿 B,刷新它们并保存,然后再打开工作簿 A。如果我不这样做,工作簿 B 将不会使用工作簿 C 中的数据进行更新。

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

我可能会补充一点,我在这台计算机上使用 excel starter,所以最好该解决方案与之兼容。

4

3 回答 3

5

附件是一个潜在的解决方案,作为一个可以运行的vba ,如果可用的话

感谢 Sid Rout 提出的修改建议RecursiveFile(objWB)

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

它能做什么

  1. 打开由持有的工作簿strFilePath
  2. 检查 1 中是否有任何链接的工作簿,如果有则打开它们(B、B1、B2 等)
  3. 然后代码在 (2) 的每个工作簿中查找任何链接,然后依次打开所有这些链接(C1 和 C2 用于 B 等)
  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

工作截图

在此处输入图像描述

于 2013-04-15T12:51:53.327 回答
2

是的,您可以遍历所有源 B 工作簿,在后台打开它们并将 UpdateLinks 标志设置为 True ...

strFiles=Dir(*path & \.xls*)

do
    workbooks.open strfiles, UpdateLinks:=true
    workbooks(strfiles).close savechanges:=true
    strFiles=Dir
loop while strfiles<>""

那应该给你一个开始

于 2013-04-15T09:41:10.370 回答
2

所以,由于 VBA 不是一个选项,让我们尝试一个 VB 脚本解决方案:

dim objFSO, objExcel, objWorkbook, objFile
'
set objExcel= CreateObject("Excel.application")
'
objExcel.visible=false
objExcel.displayalerts=false
'
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = path
'
Set objFolder = objFSO.GetFolder(objStartFolder)
' get collection of files from folder
Set colFiles = objFolder.Files
' begin loop through all files returned by Files collection of Folder object
For Each objFile in colFiles
    ' sanity check, is the file an XLS file?
    if instr(objfile.name,"xls")<>0 then ' could also use right(objfile.name,4)=...
        Wscript.Echo "Opening '" objFile.Name & "' ..."
        set objWorkbook=objexcel.workbooks.open objfile.name, updatelinks:=true
        objexcel.workbooks(objfile.name).close savechanges:=true
    end if
Next
' close Excel
objexcel.quit
' kill the instance and release the memory
set objExcel=nothing

试试看,看看你的进展如何

这是 VB Script SDK:MSDN Library - VB Script

于 2013-04-15T10:03:52.813 回答