如何将多个链接工作表的.xlsx拆分为单独的工作表文件,以及如何重新组装?

时间:2013-03-15 15:35:45

标签: excel vba excel-2010

已为非IT相关类分配了一个组项目,其中将存储的工作是单个.xlsx文件。成员们决定协作编辑所述文件的最佳方式是将其拆分为组成表,将每个* .xlsx表上传到SVN存储库,并使用锁和.txt文件来组织工作表/成员职责。

该小组已经用VB脚本(由这个精彩的网站提供)完成了对所述文件的拆分,具体如下:

Sub SaveSheets()
Dim strPath As String
Dim ws As Worksheet

Application.ScreenUpdating = False

strPath = ActiveWorkbook.Path & "\"
For Each ws In ThisWorkbook.Sheets
    ws.Copy
    'Use this line if you want to break any links:
    BreakLinks Workbooks(Workbooks.Count)
    Workbooks(Workbooks.Count).Close True, strPath & ws.Name & ".xlsx"
Next

Application.ScreenUpdating = True
End Sub

Sub BreakLinks(wb As Workbook)
    Dim lnk As Variant
    For Each lnk In wb.LinkSources(xlExcelLinks)
        wb.Breaklink lnk, xlLinkTypeExcelLinks
    Next
End Sub

因此,该组现在有一个存储库,其中每个成员当前正在编辑其各自的文件。那么问题是,我们如何自动将这些文件重新统一为一个.xlsx文件保存原始链接。

编辑4/2:开始赏金//我知道链接被上面的脚本“破坏”但是我不确定这意味着什么,但我怀疑它会重新组装保存原始链接更加困难。应该注意的是,具有链接的原始文件仍然可用,可能可用于帮助解决此问题。

EDIT 4/2:Excel版本为2010年 - 当前文件中不存在原始链接。

编辑4/3:原始链接不在当前文件中,但是需要重新统一原始链接(来自原始未编辑文件,预分割)重新创建/保留。

5 个答案:

答案 0 :(得分:1)

如果您拥有SharePoint,则可以更新相同的Excel(2003或2010)书籍。

http://office.microsoft.com/en-us/excel-help/about-shared-workbooks-HP005262294.aspx

答案 1 :(得分:1)

我们可能需要更多详细信息才能为您提供帮助,但您可以按照以下方式完成您的需求(也许这可以启动解决方案):

  • 遍历工作簿中的工作表
  • 每张纸
    • 打开相应的xlsx文件
    • 识别非公式细胞
    • 对于每个细胞
      • 复制到主工作簿中的相同位置
    • 关闭xlsx文件

下面是一个示例(基于您的SaveSheets代码)。如果您尝试这样做,请务必先备份所有内容。我们显然不知道如何布置电子表格以及如何使用它们。如果它搞砸了,那真是太糟糕了。此外,还有一些假设:

  • xlsx文件中的布局和使用范围与原始工作簿中显示的布局和使用范围完全相同。
  • 您所指的链接是公式(可以是其他工作簿或其他工作簿)。

如果这些假设是错误的,您需要根据需要进行修改(确定要复制的特定范围和/或向例程添加更强大的逻辑)。

请注意,执行此操作的实际代码非常短。我添加了注释和基本错误处理,显着增加了代码量。

此代码将添加到原始工作簿中。

Sub RetrieveSheets()
Dim strPath As String
Dim ws As Worksheet
Dim ws2 As Worksheet
Dim wbk As Workbook
Dim rng As Range

Application.ScreenUpdating = False

strPath = ActiveWorkbook.Path & "\"
For Each ws In ThisWorkbook.Sheets

    'Open the xlsx file (read only)
    Set wbk = Nothing
    On Error Resume Next
        Set wbk = Workbooks.Open(strPath & ws.Name & ".xlsx", ReadOnly:=True)
    On Error GoTo 0

    'Continue if xlsx file was successfully opened
    If Not wbk Is Nothing Then
        Set ws2 = Nothing
        On Error Resume Next
            Set ws2 = wbk.Worksheets(ws.Name)
        On Error GoTo 0

        'Continue if appropriate sheet was found
        If Not ws2 Is Nothing Then
            'Identify cells to copy over (cells that are constants)
            For Each rng In ws2.Cells.SpecialCells(xlCellTypeConstants)
                'set the cell value equal to the identical cell location in the xlsx file
                If (Left(ws.Range(rng.Address).Formula, 1)) <> "=" Then
                    ws.Range(rng.Address) = rng
                End If
            Next
            Set ws2 = Nothing
        End If

        'Close the xlsx file
        wbk.Close False
    End If
Next
Set wbk = Nothing
Application.ScreenUpdating = True

End Sub

答案 2 :(得分:1)

然后链接并不真正适用于解决方案,因为您说原始链接没有任何链接,因此不需要重新组装链接。

提供的脚本甚至嵌入了一条注释,如果你想打破任何链接,请使用此行:“。因此,如果您对下面的行进行注释(在行前加上'),它将保留子工作簿中的链接。

使用以下VBA可以完成对copying sheets to another workbook重新组装的上一个问题的回答:

Sub CombineSheets()
Dim strPath As String
Dim ws As Worksheet
Dim targetWorkbook As Workbook

Set targetWorkbook = ActiveWorkbook


Application.ScreenUpdating = False

'Adjust path location of split files
strPath = "C:\code\xls-split"

Dim str As String

    'This can be adjusted to suit a filename pattern.
    str = Dir(strPath & "\*.xl*")
    Do Until str = ""
        'Open Workbook x and Set a Workbook variable to it
        Set wbResults = Workbooks.Open(strPath & "\" & str, UpdateLinks:=0)
            For Each Sheet In ActiveWorkbook.Sheets
              Sheet.Copy After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count)
            Next Sheet
        wbResults.Close SaveChanges:=False
        str = Dir()
    Loop
Application.ScreenUpdating = True


End Sub

这会将其他工作簿附加到当前打开的工作簿中。

源代码Replacing FileSearch function,用于在目录中查找xls文件的代码。

答案 3 :(得分:0)

这是我如何完成这个的大致概述:

  1. 使用Office2013和 office 2010
  2. 使用原始.xlsx分配文件创建tmp /目录。
  3. 在tmp /
  4. 中创建源/目录
  5. 使用拆分表模块(在此页面上列出),但注释掉断开链接的行。
  6. 将所有生成的.xlsx文件放入source /(您可以删除原始.xlsx文件)
  7. 远离来源/文件夹中的第一张纸,并将其放置在../
  8. 打开第一张表,然后导入/使用此页面上列出的“combineheets”模块。
  9. 保存工作表,重新打开它,系统将提示您更新链接。这样做,并选择“更改源”并在步骤6中选择第一张表格。
  10. 链接会自动更新;完成。
  11. 注意:您必须将文件保存为启用宏,...

答案 4 :(得分:0)

看看这篇关于合并来自多个工作簿(.xls / .xlsx)文件的数据的MSDN文章

http://msdn.microsoft.com/en-us/library/office/gg549168%28v=office.14%29.aspx

我对VBA了解不多,但我认为这正是你要找的。

另请注意,它确实不需要文本文件来管理文件