2016-11-29 81 views
0

這是我的代碼。它貫穿始於Cell L1的值列表,在另一個工作表中找到它們,然後找到偏移單元格。如果該單元格包含"TEMPLATE"它將從原始列表中刪除該值。運行時錯誤'1004',設置變量時應用程序定義的或對象定義的錯誤= cell.offset

Sub Removetemplate() 

Dim x As Variant 
Dim myString As String 
Dim temprng As Range 
Dim cell As Object 

    ' Set numrows = number of rows of data. 
    Worksheets("WorkingSO").Activate 
    NumRows = Range("L2", Range("L2").End(xlDown)).Rows.Count 
    ' Select cell L2. 
    Set SORNG = Range("L2") 
    SORNG.Select 
    ' Establish "For" loop to loop "numrows" number of times. 
    Worksheets("Sales Orders").Activate 
    For x = 1 To NumRows 

     For Each cell In Sheet1.Cells 
       If cell.Value = SORNG.Value Then 
        Set temprng = cell.Offset(28, -17) 
        myString = temprng.Value 
         If InStr(myString, "TEMPLATE") > 0 Then 
          SORNG.ClearContents 
         End If 
       End If 
     Next 



    ' Selects cell down 1 row from active cell. 
    Set SORNG = SORNG.Offset(1, 0) 
    Next 



End Sub 

1004 error發生在行Set temprng = cell.Offset(28, -17)。林不是100%肯定,但我相信它是第一次通過,但第二次循環失敗。

+0

中查找「WorkingSO」列「L」值,沒有小於17的行的實例,其中單元格.value = SORNG.value –

+0

@ConnorHoward在'Set tmprng'行放置一個斷點,點擊斷點並鍵入'?cell.Address'。你遇到了一個錯誤,那裏*是行號問題。 –

+1

沒有。並且偏移量中的第二個值將調整列而不是行。但最近的專欄是Z(26) –

回答

0

它因爲For Each cell In Sheet1.Cells循環通過Sheet1所有細胞,因此它也通過細胞循環屬於第1列至17這導致cell.Offset(28, -17)失敗,因爲它會嘗試達成「負列」小區

此外,你必須避免Activate/Select編碼習慣和使用完全合格範圍參考

試試這個代碼:

Option Explicit 

Sub Removetemplate() 
    Dim SOCell As Range, WSOCell As Range 
    Dim WSORng As Range 

    ' Set numrows = number of rows of data. 
    With Worksheets("WorkingSO") 
     Set WSORng = .Range("L2", .Range("L2").End(xlDown)) 'set "WorkingSO" worksheet range to loop through 
    End With 

    With Worksheets("Sales Orders") '<--| reference "Sales Orders" worksheet 
     For Each WSOCell In WSORng '<--| loop through WSORng cells 
      For Each SOCell In .Columns("R").SpecialCells(xlCellTypeConstants) '<--| loop through currently referenced worksheet (i.e. "Sales Orders") column "R" cells with any constant value 
       If SOCell.Value = WSOCell.Value Then '<--| if current "Sales Orders" cell value matches current "WorkingSO" one 
        If InStr(SOCell.Offset(28, -17), "TEMPLATE") > 0 Then WSOCell.ClearContents '<--| if "Sales Orders" cell offsetted 28 rows down and 17 columns left form current one has "TEMPLATE", then clear current "WorkingSO" cell 
       End If 
      Next 
     Next 
    End With 
End Sub 

其中您必須將.Columns("R")更改爲實際的「銷售訂單」工作表列索引,您要在

+0

謝謝。這個伎倆。我對此非常陌生,現在只是試圖調整避免主動/選擇的最乾淨的做法。我仍然不明白,如果每個「cell.Value = SORNG.Value」實例出現在列Y後面,它將如何得到「cell.Offset(28,-17)」,值爲17或更小 –

+0

歡迎您。因爲我沒有你的數據,所以不會說爲什麼它會出現在這樣的列索引中。但是你可以遍歷你之前的代碼(F8鍵)並查詢直接窗口(?cell.Value,cell.Address,cell.Parent.Name)來查看實際發生的事情。 – user3598756

相關問題