2016-07-02 4 views
1

フィルタリングされたデータに対してcopy + pasteを実行する際に問題が発生しています。フィルタリングされたフィールドが0の結果または1より大きい場合、私のコードにエラーが発生しません。ただし、フィルタの後に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すべきではない行1のヘッダを除いた所望の範囲をコピーします"B2:B"&y).Copy'? – Jeeped

+0

** x **と** y **は同じものではありませんか?彼らは別のワークシートから来たはずですか? 1つの親ワークシートを定義するのはなぜですか? – Jeeped

+0

それは働いた!私はyを削除し、xを使用しました。ありがとう@Jeeped – atserk

答えて

0

まず第一には、お使いのエクセル(別名MS-Officeが)適用されるすべてのサービスパックを持っていることを確認してください。すべての行として解釈される単一のフィルタリングされた行に関する問題は、既知のバグでしたが、後続のサービスパックで修正されました。

「ベストプラクティス」コードを適用して、それが起こらないようにすることもできます。 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

コードを改訂しようとしました: 「ワークシートとしてワークシートとしてwsDargetをワークシートとして使用しています」× x = Range( "A65536")End(xlUp).Row Range( "A1")。AutoFilterフィールド:= 2、Criteria1:= Array( "Yes")、演算子:= xlFilterValues wsDue =ワークシート( "Due")を設定する 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")。終了(xlUp).Offset(1).PasteSpecialペースト:= xlPasteValues、操作:= xlNone、SkipBlanks:= False Else: End If ' – atserk

+0

フィルタリングされた結果をコピーするために改訂されたコードに何らかのエラーが発生すると思いますか? – atserk

+0

2つのことは不明なままです。 a)私はまだあなたがhte ** x **をどこから得ているのか分かりません。 ** y **のように思える。 b)私はなぜあなたが**はい**から列Bをフィルタリングしていると理解していないし、別のワークシートの列Aに列Bをコピーする上記のコードはテストされ、元の質問ごとに動作します。コメントに改訂コードを投稿しないでください。元の質問を修正するか、別の質問をしてください。 – 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 

溶液はフィルタの結果を得ることができたと(

関連する問題