运行时错误1004出现在文件的副本中,但不是原始的

我有一个先进的filter,使用定义的范围(在所有工作表的名称pipe理器中可见)从单独的工作簿(稍后打开)中提取数据。 我有数据后,我希望能够保存工作簿的副本以供参考。

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

这在圣诞节前工作正常,但现在所有的副本给“对象”_global“失败”的运行时错误1004方法'范围',我已经缩小到

 Range("stresslist") 

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

有没有人知道为什么它只是在副本失败,或者我可以使它在副本和原始的工作方式?

谢谢

马特

整个代码

 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 

我的第一个猜测是,你需要确保名称范围仍然存在于工作簿或不。

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

 Range("stresslist").AdvancedFilter.... 

你应该像这样使用:

 Dim sht as Worksheet Dim rng as Range Set sht = Worksheets("Data") Set rng = sht.Range("StressList") rng.AdvanceFilter ..... 

当你使用全局函数(如Range,Cells等)时,它试图做的是试图find一个名字在活动页面中的范围,或者是全局存储的名字范围。 在制作对象时避免使用层次结构可能导致错误,其原因因情况而异。 如果您想知道更多关于您的错误的信息,请提供您的整个代码,然后我们可以尝试find确切的问题。

谢谢,Vikas B

find一个适用于所有其他问题的方法,但需要一点时间运行(可能是由于数据量),所以如果任何人有一个更好的解决scheme仍然寻找。

 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 

通过激活带有数据的工作簿然后将其复制到variables中,然后激活原始工作簿并将数据转储到新的“温度”工作表中。 然后删除“温度”表。

这工作正常,但比以前慢了很多,而且同样的事情也在另一个已经需要一段时间运行的macros中使用更多的数据,我仍然在寻找更好的方法。

感谢任何更好的build议马特