【问题标题】:How do I easily change hardcoded links to a file in Excel?如何轻松更改 Excel 中文件的硬编码链接?
【发布时间】:2012-04-04 05:04:38
【问题描述】:

我有一个项目,我在一个标有“BigList.xlsx”的 Excel 文件中维护我所有学生的列表及其信息。然后,我有大约 40-50 个其他单独的辅助 excel 文件,它们使用 VLOOKUP 链接到 BigList。

例如,在辅助文件的单元格 A1 中,您可能会看到如下所示的公式:

=Vlookup(B3, 
    'c:\documents and settings\user\desktop\[BigList.xlsx]Sheet1'!$a$1:$b$10000,
    2,false).

上面的 vlookup 链接引用了 BigList.xlsx。但是,我刚刚意识到我需要将该文件名更改为其他名称,例如 MasterDatabase.xlsm(注意不同的扩展名)。有没有一种简单的方法可以做到这一点,而无需手动浏览所有 40-50 个文件并进行查找和替换?

我认为基本想法是将硬编码链接更改为动态链接,我可以随时更改 BigList.xlsx 的文件名,而不必返回所有 40-50 个文件来更新它们的链接。

【问题讨论】:

  • 您的电子表格是否易于识别(例如,都在同一个文件夹中)?
  • 大部分情况下是的。我们可以假设它们都位于一个文件夹中。
  • 请使用{}按钮将代码格式化为code,以使您的问题更清晰。
  • 这40-50个文件都在一个目录下吗?您可以自动化手动 Edit Links 以从 BigList.xlsx 重新映射到 MasterDatabase.xlsm

标签: excel hyperlink excel-formula vlookup vba


【解决方案1】:

这应该可以满足您的要求 - 也许不是超级快,但如果您只需要在 50 个工作簿上执行一次,它应该就足够了。请注意,替换行应在工作簿的所有工作表中进行替换。

Option Explicit

Public Sub replaceLinks()

    Dim path As String
    Dim file As String
    Dim w As Workbook
    Dim s As Worksheet

    On Error GoTo error_handler

    path = "C:\Users\xxxxxx\Documents\Test\"
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    file = Dir$(path & "*.xlsx", vbNormal)
    Do Until LenB(file) = 0
        Set w = Workbooks.Open(path & file)
        ActiveSheet.Cells.Replace What:="'THE_LINK_YOU_WANT_TO_CHANGE'!", _
                Replacement:="'THE_NEW_LINK'!", LookAt:=xlPart
        w.Save
        w.Close
        file = Dir$
    Loop

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    Exit Sub

error_handler:
    MsgBox Err.Description
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Sub

【讨论】:

  • 好的,谢谢...我会在几个小时后有空的时候测试一下。感谢您的帮助!
  • 它确实有效,但直接链接更新要快得多 - 更重要的是会更新 所有 具有源链接的工作表、图表、名称范围等
【解决方案2】:

您可以在 Excel 2010 中执行此操作,而无需使用任何代码。 (如果没记错的话,它也适用于早期版本的 Excel。)

  1. 在 Excel 中同时打开所有 50 个辅助 Excel 文件。
  2. 打开 BigList.xlsx。 (您现在在 Excel 中打开了 51 个文件。)
  3. 点击File-Save As,将BigList另存为MasterDatabase.xlsm
  4. 关闭新的 MasterDatabase.xlsm 文件。
  5. 查看其中一个辅助文件并确认 Excel 已将其指向新文件。
  6. 关闭并保存所有文件。

【讨论】:

  • 哇,我刚试过这个,它完全有效!但我感觉很糟糕,因为 assylias 的代码也能正常工作,而且他花时间编写代码,所以我将他的代码标记为解决方案。如果可以的话,我会给你们两个绿色支票!
【解决方案3】:

此代码将直接自动更改链接

  1. 将您的路径更新为代码中的BigList.xlsxMasterDatabase.xlsm
  2. 更新 40-50 个文件的路径(我使用的是 c:\temp\")
  3. 然后代码将打开这两个文件(以便更快地重新链接),然后打开strFilePath 中的文件,将链接从 WB1 (strOldMasterFile) 更改为 Wb2 (strOldMasterFile),然后关闭保存的文件

请注意,它假定所有这些文件在代码启动时都已关闭,因为代码将打开这些文件

    Sub ChangeLinks()
        Dim strFilePath As String
        Dim strFileName As String
        Dim strOldMasterFile As String
        Dim strNewMasterFile As String

        Dim WB1 As Workbook
        Dim WB2 As Workbook
        Dim WB3 As Workbook

        Dim lngCalc As Long    

        strOldMasterFile = "c:\testFolder\bigList.xlsx"
        strNewMasterFile = "c:\testFolder\newFile.xlsm"

        On Error Resume Next
        Set WB1 = Workbooks.Open(strOldMasterFile)
        Set WB2 = Workbooks.Open(strNewMasterFile)
        If WB1 Is Nothing Or WB2 Is Nothing Then
            MsgBox "One (or both) of " & vbnerwline & strOldMasterFile & vbNewLine & strNewMasterFile & vbNewLine & "cannot be found"
            WB1.Close False
            WB2.Close False
            Exit Sub
        End If
        On Error GoTo 0

        With Application
            .DisplayAlerts = False
            .ScreenUpdating = False
            .EnableEvents = False
            lngCalc = .Calculation
            .Calculation = xlCalculationManual 
        End With

        strFilePath = "c:\temp\"
        strFileName = Dir(strFilePath & "*.xls*")

        'Error handling as link may not exist in all files
        On Error Resume Next
        Do While Len(strFileName) > 0
            Set WB2 = Workbooks.Open(strFilePath & strFileName, False)
            WB2.ChangeLink strOldMasterFile, strNewMasterFile, xlExcelLinks
            WB2.Save
            WB2.Close False
            strFileName = Dir
        Loop
        On Error GoTo 0

        WB1.Close False
        WB2.Close False

        With Application
            .DisplayAlerts = True
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = lngCalc
        End With

        End Sub

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2021-04-13
    相关资源
    最近更新 更多