5

一个非 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:开始赏金//我知道链接已被上述脚本“破坏”,但我不确定这意味着什么,尽管我怀疑它会使重新组装保留原始链接更加困难。应该注意的是,具有链接的原始文件仍然可用,并且可以用来帮助解决这个问题。

编辑 4/2:Excel 版本是 2010 - 当前文件中不存在原始链接。

编辑 4/3:原始链接不在当前文件中,但希望通过重新统一重新创建/保留原始链接(来自原始未编辑文件,预拆分)。

4

5 回答 5

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

结束子

于 2013-04-03T19:53:57.493 回答
1

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

提供的脚本甚至嵌入了一条评论,说“如果您想断开任何链接,请使用此行:”。因此,如果您将下面的行注释掉(在该行前加上'),它将保留子工作簿中的链接。

使用上一个关于将工作表复制到另一个工作簿重组的问题的答案可以通过以下 VBA 完成:

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

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

Sourced替换 FileSearch 函数,用于在目录中查找 xls 文件的代码。

于 2013-04-04T00:41:54.977 回答
1

如果您有 SharePoint,则都可以更新同一个 Excel(2003 或 2010)书籍。

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

于 2013-03-15T16:22:42.880 回答
0

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

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

我对 VBA 了解不多,但我认为这就是您正在寻找的。

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

于 2013-04-09T01:18:34.250 回答
0

这是我如何完成此任务的粗略概述:

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

注意:您必须将文件保存为启用宏,...

于 2013-04-09T01:05:03.417 回答