我有一个高级过滤器,它使用定义的范围(在所有工作表的名称管理器中都可以看到)将数据从单独的工作簿(前面打开)中提取出来。在获得数据之后,我希望能够保存工作簿的副本以供参考。
Range("stresslist").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("stressfind"), CopyToRange:=Range("stressout"), Unique:=True这在圣诞节之前运行良好,但现在所有副本都给出了“运行时错误1004方法‘范围’对象'_global‘failed”,我已经将范围缩小到
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发布于 2014-01-03 08:48:50
找到一个方法,它适用于其他有同样问题的人,但是运行需要一段时间(可能是由于数据量),所以如果有人有更好的解决方案的话,仍然在寻找一个更好的解决方案。
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工作方式是用数据激活工作簿,然后将其复制到变量中,然后激活原始工作簿并将数据转储到新的“临时”工作表中。然后删除“临时”表之后。
这很好,但比以前慢得多,而且由于在另一个宏中也使用了更多的数据,运行已经需要一段时间,我仍然在寻找一种更好的方法。
谢谢你更好的建议马特
发布于 2014-01-02 15:12:35
我的第一个猜测是,您需要确保工作簿中是否仍然存在名称范围。
其次,作为最佳实践,您应该始终在存在名称范围的地方使用父工作表名称。例如,如果我的名字存在于一个名为Data的表中,那么您应该这样做:
Range("stresslist").AdvancedFilter....你应该这样用:
Dim sht as Worksheet
Dim rng as Range
Set sht = Worksheets("Data")
Set rng = sht.Range("StressList")
rng.AdvanceFilter .....当您使用“范围”、“单元格”等全局函数时,它所要做的是尝试找到一个在活动工作表中具有名称的范围,或者是全局存储的名称范围。在制作对象时避免使用层次结构可能会导致错误,原因很多,因情况而异。如果您想知道更多关于您的错误,请提供您的全部代码,然后我们可以尝试找到确切的问题。
谢谢,维卡斯B
https://stackoverflow.com/questions/20884248
复制相似问题