1

我正在尝试创建一个可以应用于我的工作表的宏。

场景:我有一个类似于摘要页面的工作簿。它具有指向其他工作簿中硬编码数字的链接。在许多情况下,文件夹已被移动,或者工作表可能被重命名/删除等。链接最终失败,并导致许多#REF 错误。发生这种情况是因为多人可以操作共享网络驱动器上的电子表格。

我想通过创建故障保险来解决这个问题。本质上,一个“更新”按钮会将所有已更新的引用的副本保存到一个名为“更新的数据”的新工作表中,并在执行最后一次更新时添加时间戳。仅当参考发生更改时,此数据才会更改。例如,如果在星期一,单元格 A1 引用工作簿的单元格 A1 并返回值 $1234.56,则它将引用存储在单独的工作表中。现在,星期二我单击更新,参考 A1 工作簿已被移动或删除。我仍然会返回 $1234.56 而不是#REF。最后,有一些更新失败的通知,会很棒,可能会突出显示单元格。

感谢您阅读并提供您的见解。

4

1 回答 1

0

如果您想走验证路径,那么我建议您:

  1. 使用如下代码来验证每个链接是否完整。此代码片段标识了链接文件与“摘要文件”不位于同一目录中的位置
  2. 您可以添加一个更新有效链接工作簿的后续部分,然后跳过错误
  3. 如果工作表已重命名但链接源有效,Excel 将提示您选择要链接到的工作表
  4. 这仍然会使您暴露在人们在馈线表中移动数据的情况下,尤其是在可以插入或删除行和列的情况下。
  5. 预防问题比故障保险好得多。最好的选择是在所有馈送工作簿上使用单个工作表来合并要链接到摘要文件的数据,然后将此工作表完整导入到摘要文件中。这意味着人们可以
    • 重命名/移动/添加工作表
    • 添加/删除列/行

在不影响合并数据表的情况下

识别缺失链接的代码

'查找源文件与摘要文件不在同一目录中的位置

    Dim vLinkArr()
    Dim lngLink As Long
    Dim strMsg As String
    Dim strGoodMsg As String

    On Error Resume Next
    vLinkArr = ThisWorkbook.LinkSources
    On Error GoTo 0
    If IsEmpty(vLinkArr) Then Exit Sub
    For lngLink = 1 To UBound(vLinkArr)
            If Left$(vLinkArr(lngLink), InStrRev(vLinkArr(lngLink), "\") - 1) <> ThisWorkbook.Path Then
                If InStr(Left$(vLinkArr(lngLink), InStrRev(vLinkArr(lngLink), "\") - 1), ThisWorkbook.Path) = 0 Then
                    strMsg = strMsg & vLinkArr(lngLink) & vbCrLf
                Else
                    strGoodMsg = strGoodMsg & vLinkArr(lngLink) & Chr(10)
                End If
            Else
                strGoodMsg = strGoodMsg & vLinkArr(lngLink) & Chr(10)
            End If

    Next
    If strMsg <> vbNullString Then MsgBox strMsg
于 2013-01-23T23:43:23.877 回答