2016-11-29 3 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). Im не на 100% уверен, но я считаю, что он работает в первый раз, но не работает во втором цикле.

+0

нет экземпляров ячейки в строке меньше 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") на фактический индекс столбца рабочего листа «Sales Orders», который вы хотите найти в столбце «L» «WorkingSO» в

+0

Спасибо. это сделало трюк. Я очень новичок в этом, и только сейчас я пытаюсь адаптировать самые чистые методы избегания активного/выбора. Я до сих пор не понимаю, как это получилось бы «cell.Offset (28, -17)» со значением 17 или меньше, если каждый экземпляр «cell.Value = SORNG.Value» возникает после столбца Y –

+0

. Добро пожаловать. Не сказал бы, почему он дошел до таких индексов столбцов, так как у меня нет ваших данных. Но вы можете выполнить свой предыдущий код (клавиша F8) и запросить немедленное окно (? Cell.Value, cell.Address, cell.Parent.Name), чтобы посмотреть, что на самом деле происходит. – user3598756

Смежные вопросы

 Смежные вопросы