单击按钮获取错误时将行从工作表复制到另一个工作表

时间:2015-09-28 07:25:29

标签: excel vba excel-vba

单击某个按钮后,某些行正在从一个工作表复制到另一个工作表但我收到错误:

  

此工作簿包含指向可能不安全的一个或多个外部来源的链接   如果您信任这些链接,请更新它们以获取最新数据。否则,您可以继续使用您拥有的数据   [更新] [不要更新] [帮助]

我试过点击更新& 不要更新,但不是以任何一种方式复制数据。

我将一个单元格的值放到wbLocationPath:

Set wbLocationPath = WSheet.Range("A2") 

While wbLocationPath.Value <> ""
    If IsWorkBookOpen(wbLocationPath.Value) Then
        For Each wks In Workbooks
            If (wks.Path & "\" & wks.Name) = wbLocationPath Then
                Set wb = wks
                Exit For
            End If
        Next wks
    Else
        Set wb = Application.Workbooks.Open(wbLocationPath.Value, ReadOnly:=False)
    End If

所以在调试过程中我遇到了设置wb值的错误。

wbLocationPath.value将A2中的路径设为c\users\me\desktop\project\XYZ.xlsx

IsWorkBookOpen(wbLocationPath.Value)返回false,因此控件会出现在出错的其他部分。

我在贴上价值方面没有任何问题。我的代码适用于其他数千个文件路径,但它不适用于某些文件路径。 我有一些文件夹,我从每个文件夹中复制了每个文件的数据。将问题记录在特定文件夹中(&#34; FOOD ADD&#34;)某些特定文件。 因为我有一些文件名,如&#34; 10024125(01-0RD)&#34;所以这些类型的文件的数据复制,但文件名为&#34; 10016818(03-1RD)FOOD ADD&#34;不是复制&amp;通过我提到的错误。

3 个答案:

答案 0 :(得分:0)

如果您打开工作簿并且它来自受信任位置(请参阅Excel选项►信任中心►信任中心设置►受信任位置),那么使用“粘贴特殊值”值时应该没有问题,因为您只关心使用值,而不是原始公式。但是,直接价值转移可能足以绕过警告。还有一些隐式单元格父工作表引用应该明确。

with tmpSheet
    lastrow = .Cells(Rows.Count, "A").End(xlUp).Row
    Set rng = .Range(.Cells(1, 1), .Cells(lastrow, 1))  '<~~ note all parts belong to tmpSheet
end with

with pasteSheet
    For Each c In rng.Cells
        If c = "ABC" Then
            'the following is an alternative method of direct value transfer
            .Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(1, columns.count) = _
                 c.Resize(1, columns.count).Value
        End If
    Next c
end with

请注意,当您定义 rng 时。父工作表对于.Range是明确的,而不是构成范围的.Cells。此外,直接值传输是一种在没有剪贴板的情况下获取值的更有效方法。

答案 1 :(得分:0)

我强烈怀疑IsWorkBookOpen不期望您发送它的完整路径和工作簿名称。如果它只是期待Workbook.Name property,那么当您发送Workbook.FullName property时,您永远不会得到匹配。

Function IsWorkBookOpen2(sWS As String)
    Dim b As Long
    For b = 1 To Workbooks.Count
        'Debug.Print Workbooks(b).FullName
        If lcase(Workbooks(b).FullName) = lcase(sWS) Then _
            Exit For
    Next b
    IsWorkBookOpen2 = CBool(b <= Workbooks.Count)
End Function

此替换例程对打开的工作簿的完整路径和文件名(又名Workbook.FullName property)执行不区分大小写的比较,并将其存储到WSheet.Range("A2")中存储的值。

请注意,它名为IsWorkBookOpen2,而不是IsWorkBookOpen

答案 2 :(得分:0)

实际上VBA代码没有问题。问题出在excel文件中。 excel是&#34;链接WorkSheet&#34;即它被链接到任何服务器,以便在您想要打开时更新excel中的值。因此,您可以从&#34;数据&#34;更改链接属性。菜单选择&#34; EditLink&#34;。

我们可以根据您的要求更改提示属性。

请参阅MS支持的以下解决方案以禁止显示消息:

https://support.microsoft.com/en-us/kb/826921