首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行时错误1004出现在文件副本中,但不显示原件。

运行时错误1004出现在文件副本中,但不显示原件。
EN

Stack Overflow用户
提问于 2014-01-02 13:38:25
回答 2查看 727关注 0票数 1

我有一个高级过滤器,它使用定义的范围(在所有工作表的名称管理器中都可以看到)将数据从单独的工作簿(前面打开)中提取出来。在获得数据之后,我希望能够保存工作簿的副本以供参考。

代码语言:javascript
复制
Range("stresslist").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("stressfind"), CopyToRange:=Range("stressout"), Unique:=True

这在圣诞节之前运行良好,但现在所有副本都给出了“运行时错误1004方法‘范围’对象'_global‘failed”,我已经将范围缩小到

代码语言:javascript
复制
Range("stresslist")

这是由3列组成的另一个工作簿上的范围。

有没有人知道为什么它只是在副本中失败,或者我可以让它在副本和原件中运行的方法?

谢谢

哑光

整段代码

代码语言:javascript
复制
Sub findstress()

datafile = "Datafile.xlsx"
calcfile = ThisWorkbook.Name
dataopen = False
frontend = ActiveSheet.Name
Application.DisplayAlerts = False
'Application.ScreenUpdating = False


'Open Data workbook

    On Error Resume Next
    Workbooks(datafile).Activate
    If Err.Number <> 0 Then
        Err.Clear
        Application.Workbooks.Open ThisWorkbook.Path & "\" & datafile

        If Err.Number <> 0 Then
            Err.Clear
            Application.Workbooks.Open ThisWorkbook.Path & "\..\" & datafile
        End If

    Else
        dataopen = True
    End If
    On Error GoTo 0


Workbooks(calcfile).Activate

Range("stresslist").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("stressfind"), CopyToRange:=Range("stressout"), Unique:=True



'close data file if not open before
    If Not dataopen Then
    Workbooks(datafile).Close SaveChanges:=False
    End If



End Sub
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-03 08:48:50

找到一个方法,它适用于其他有同样问题的人,但是运行需要一段时间(可能是由于数据量),所以如果有人有更好的解决方案的话,仍然在寻找一个更好的解决方案。

代码语言:javascript
复制
datafile = "Datafile.xlsx"
calcfile = ThisWorkbook.Name
dataopen = False
frontend = ActiveSheet.Name

'Copy relevant data
    Workbooks(datafile).Activate
    stresslist = Sheets("Data").Range("stresslist")

'Create new sheet "Temp" and insert Data
    Workbooks(calcfile).Activate
    Worksheets.Add.Name = "Temp"
    Sheets("Temp").Range("A:C") = stresslist

Worksheets(frontend).Activate

Workbooks(calcfile).Sheets("Temp").Range("A:C").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("stressfind"), CopyToRange:=Range("stressout"), Unique:=True

'Delete Sheet "Temp"
Sheets("Temp").Delete

工作方式是用数据激活工作簿,然后将其复制到变量中,然后激活原始工作簿并将数据转储到新的“临时”工作表中。然后删除“临时”表之后。

这很好,但比以前慢得多,而且由于在另一个宏中也使用了更多的数据,运行已经需要一段时间,我仍然在寻找一种更好的方法。

谢谢你更好的建议马特

票数 0
EN

Stack Overflow用户

发布于 2014-01-02 15:12:35

我的第一个猜测是,您需要确保工作簿中是否仍然存在名称范围。

其次,作为最佳实践,您应该始终在存在名称范围的地方使用父工作表名称。例如,如果我的名字存在于一个名为Data的表中,那么您应该这样做:

代码语言:javascript
复制
Range("stresslist").AdvancedFilter....

你应该这样用:

代码语言:javascript
复制
Dim sht as Worksheet
Dim rng as Range

Set sht = Worksheets("Data")
Set rng = sht.Range("StressList")

rng.AdvanceFilter .....

当您使用“范围”、“单元格”等全局函数时,它所要做的是尝试找到一个在活动工作表中具有名称的范围,或者是全局存储的名称范围。在制作对象时避免使用层次结构可能会导致错误,原因很多,因情况而异。如果您想知道更多关于您的错误,请提供您的全部代码,然后我们可以尝试找到确切的问题。

谢谢,维卡斯B

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20884248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档