2016-07-02 86 views
1

我遇到问题执行过滤数据的副本+粘贴。如果过滤字段的结果为0或大于1,则我的代码不会遇到错误。但是,如果在过滤器后有一条记录可见,则会显示运行时错误6。请参阅下面使用的代码:运行时错误6 - 溢出,变量设置为长

Dim wsDue As Worksheet 
Dim wsTarget As Worksheet 
Dim y As Long 
Dim x As Long 

x = Range("A65536").End(xlUp).Row 

Range("A1").AutoFilter Field:=2, Criteria1:=Array("Yes"), Operator:=xlFilterValues 
Set wsDue = Worksheets("Due") 
Set wsTarget = Worksheets("Target List Consolidated") 
y = wsDue.Range("B" & wsDue.Rows.Count).End(xlUp).Row 

If wsDue.Range(wsDue.Cells(2, 2), wsDue.Cells(y, 2)).SpecialCells(xlCellTypeVisible).Count > 1 Then 
    wsDue.Range("B2:B" & x).Copy 
    wsTarget.Range("A65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False 
Else: 
End If 
+0

不应认为是'wsDue.Range( “B2:B”&y).Copy'? – Jeeped

+0

现在不是** x **和** y **是同一件事吗?他们是否应该来自不同的工作表?为什么要定义一个父级工作表而不是另一个? – Jeeped

+0

它的工作!我删除了y,并使用了x。谢谢@Jeeped – atserk

回答

0

首先,确保您的Excel(又名MS-Office)具有所有适用的服务包。单个被过滤的行被解释为所有行的问题是一个已知的错误,但在后续的Service Pack中被纠正。

您也可以应用一些“最佳实践”代码来避免它发生。 Range.CurrentRegion property可用于本地化Range.AutoFilter Method。使用渐进式With ... End With statements进一步隔离要传输的数据。

Dim wsDue As Worksheet, wsTarget As Worksheet 

With Worksheets("Due") 
    If .AutoFilterMode Then .AutoFilterMode = False 
    'work on the contiguous block of cells radiating out from A1 
    With .Cells(1, 1).CurrentRegion 
     'apply the AutoFilter 
     .AutoFilter Field:=2, Criteria1:=Array("Yes"), Operator:=xlFilterValues 
     'shift one row down (off the header row) and resize one less row 
     'isolate column B 
     With .Offset(1, 1).Resize(.Rows.Count - 1, 1) 
      'non-destructive test to see if there are any rows visible 
      If CBool(Application.Subtotal(103, .Cells)) Then 
       Set wsTarget = Worksheets("Target List Consolidated") 
       .Copy 
       wsTarget.Range("A65536").End(xlUp).Offset(1).PasteSpecial _ 
        Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False 
      End If 
     End With 
    End With 
End With 
+0

我试图修改代码: Dim wsDue As Worksheet,wsTarget As Worksheet,x As Long x = Range(“A65536”)。End(xlUp).Row Range(“A1”)。AutoFilter字段:= 2,Criteria1:= Array(“Yes”),Operator:= xlFilterValues 设置wsDue =工作表(“到期”) 设置wsTarget =工作表(“目标列表合并”) 如果wsDue.Range(“B1 :B“&x).Offset(1,0).SpecialCells(xlCellTypeVisible).Count> 1 Then wsDue.Range(”B1:B“&x).Offset(1,0).SpecialCells(xlCellTypeVisible).Copy wsTarget.Range(“A65536”)。End(xlUp).Offset(1).PasteSpecial Paste:= xlPasteValues,Operation:= xlNone,SkipBlanks:= False Else: End If' – atserk

+0

你认为我仍然会遇到修改后的代码复制过滤结果的错误吗? – atserk

+0

两件事情仍不清楚。 a)我仍然不知道你从哪里获得hte ** x **;它似乎应该是** y **。 b)我不明白你为什么要从** Yes **过滤列B,然后将列B复制到另一个工作表的列A.上面的代码经过测试,并按照原始问题工作。请不要将修改后的代码发布到评论中;修改你的原始问题或询问另一个问题。 – Jeeped

0

我想出了另一种解决方法。我用下面的代码,而不是:

Dim x As Long 
Dim wsDue As Worksheet 
Dim wsTarget As Worksheet 

x = Range("A65536").End(xlUp).Row 
Range("A1").AutoFilter Field:=2, Criteria1:=Array("Yes"), Operator:=xlFilterValues 
Set wsDue = Worksheets("Due") 
Set wsTarget = Worksheets("Target List Consolidated") 

If wsDue.Range("B1:B" & x).Offset(1, 0).SpecialCells(xlCellTypeVisible).Count > 1 Then 
    wsDue.Range("B1:B" & x).Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy 
    wsTarget.Range("A65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False 
    Application.CutCopyMode = False 
    Application.DisplayAlerts = False 
Else: 
End If 

将溶液抽到过滤器的结果,将复制在所需的范围不包括报头在第1行