2012-05-17 147 views
0

我得到運行時錯誤1004,如果我不在腳本運行的同一頁上,並且我想要知道爲什麼...運行時錯誤'1004':,對象'_Global'的方法'相交'失敗

這裏是代碼。

Option Explicit 

Sub PO_Tracking() 

Dim wsPOD As Worksheet 
Dim wsPOT As Worksheet 
Dim wsPOA As Worksheet 
Dim cel As Range 
Dim lastrow As Long, i As Long, Er As Long 

Set wsPOD = Sheets("PO Data") 
Set wsPOT = Sheets("PO Tracking") 
Set wsPOA = Sheets("PO Archive") 

With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
    .EnableEvents = False 
    .Calculation = xlCalculationManual 
End With 

With wsPOD 
    'first bring columns F:G up to match their line 
    For Each cel In Intersect(.UsedRange, .UsedRange.Offset(5), .Columns(6)) 

     If cel = vbNullString And cel.Offset(, -2) <> vbNullString Then 
      .Range(cel.Offset(1), cel.Offset(1, 1)).Copy cel 
      cel.Offset(1).EntireRow.Delete 
     End If 

    Next 

    'now fil columns A:D to match PO Date and PO# 
    For Each cel In Intersect(.UsedRange, .UsedRange.Offset(5), .Columns(1)) 

     If cel = vbNullString And cel.Offset(, 5) <> vbNullString Then 
      .Range(cel.Offset(-1), cel.Offset(-1, 3)).Copy cel 
     End If 
    Next 

'Blow away rows that are useless 
    lastrow = wsPOD.Range("A6").End(xlDown).Row 
    wsPOD.Range("M5:P5").Copy wsPOD.Range("M6:P" & lastrow) 
    Calculate 

    With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("N")) 
     .AutoFilter 1, "<>Different" 
     .SpecialCells(xlCellTypeVisible).EntireRow.Delete 
    End With 

    With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("P")) 
     .AutoFilter 1, "<>Full" 
     .SpecialCells(xlCellTypeVisible).EntireRow.Delete 
    End With 
    wsPOD.UsedRange.Copy Sheets.Add.Range("A1") 


'Final Adjustments before transfering over to new sheet. 
    With ActiveSheet 
     .AutoFilterMode = False 
     Intersect(.UsedRange, .Columns("A")).Cut .Range("Q1") 
     Intersect(.UsedRange, .Columns("D")).Cut .Range("R1") 
     Intersect(.UsedRange, .Columns("C")).Cut .Range("S1") 
     Intersect(.UsedRange, .Columns("B")).Cut .Range("T1") 
     Intersect(.UsedRange, .Columns("G")).Cut .Range("U1") 
     Intersect(.UsedRange, .Columns("F")).Cut .Range("V1") 
     Intersect(.UsedRange, .Range("Q:V")).Copy wsPOT.Cells(Rows.Count, "B").End(xlUp).Offset(1) 
     .Delete 
    End With 

    lastrow = wsPOD.Cells(Rows.Count, "B").End(xlUp).Row 
    wsPOT.Range("R1:X1").Copy 
    wsPOT.Range("B3:H" & lastrow).PasteSpecial xlPasteFormats 
    wsPOT.Range("N2:O2").Copy wsPOT.Range("N3:O" & lastrow) 
    wsPOT.Range("P1:Q1").Copy wsPOT.Range("I3:J" & lastrow) 
    wsPOT.Range("K3:K" & lastrow).Borders.Weight = xlThin 
End With 



Application.CutCopyMode = False 

End Sub 

的錯誤是在這裏:

**With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("N"))** 
    .AutoFilter 1, "<>Different" 
    .SpecialCells(xlCellTypeVisible).EntireRow.Delete 
End With 
+0

Activesheet應該是哪個表? 「PO數據」? –

+0

腳本運行的工作表是PO跟蹤,該腳本旨在從PO數據中獲取數據,對其進行組織,然後在PO跟蹤中輸出該數據。 –

+3

用'wsPOD'替換'Activesheet'。所以它變成了'帶有相交(wsPOD.UsedRange,wsPOD.Columns(「N」))'現在它將從任何表格運行 –

回答

4

你不能有範圍的交集在兩張紙上,所以如果ActiveSheet不wsPOD,然後

With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("N"))

已根據定義失敗。

編輯...並參閱@ SiddharthRout對該修復的評論。

+0

+ 1是。像往常一樣:) –

+1

我甚至會補充說,這是偉大的VBA練習,將所有工作表引用設置爲變量並遠離ActiveSheet,除非絕對必要。這樣你就可以知道和控制你正在與哪個工作表進行交互。 –

1

對於爲什麼錯誤,請參閱Doug Glancy的答案。

此外,如何避免它,使用類似

Dim rng1 As Range, rng2 As Range 
Set rng1 = wsPOD.UsedRange 
Set rng2 = ActiveSheet.Columns("N") 
If (rng1.Parent.Name = rng2.Parent.Name) Then 
    Dim ints As Range 
    Set ints = Intersect(rng1, rng2) 
    If (Not (ints Is Nothing)) Then 
     With ints 
      ' Do your job 
     End With 
    End If 
End If 

它通常是使用它之前來驗證Intersect離子很好的做法。

相關問題