2016-11-29 9 views
0

これは私のコードです。 Cell L1で始まる値のリストを実行し、別のワークシートでその値を見つけ、オフセットセルを検出します。そのセルに"TEMPLATE"が含まれている場合は、元のリストから値を削除します。変数 'c​​ell.offset'を設定すると、実行時エラー '1004'、アプリケーション定義またはオブジェクト定義エラー

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%確信していませんが、私はそれが最初にはたらくが、2回目のループでは失敗すると信じています。

+0

にあります。17未満の行にあるセルのインスタンスはありません。 .value = SORNG.value –

+0

@ConnorHoward 'Set tmprng'行にブレークポイントを置き、ブレークポイントを打ち、'?cell.Address'と打ちます。エラーが発生しました。行番号に問題があります。 –

+1

番号。オフセットの2番目の値は行ではなく列を調整します。しかし、その最も近い列はZ(26) –

答えて

0

それを理由すべてSheet1の細胞、したがって、それも、それは「負の欄に」到達しようと思いますので、失敗するcell.Offset(28, -17)を起こし17に1列に属するセルをループセル

For Each cell In Sheet1.Cellsループさらに、あなたは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")を実際の "受注"ワークシートの列インデックスに変更する必要があります。 "WorkingSO"列の "L"値は

+0

ありがとうございます。これはトリックでした。私はこれには非常に新しいので、アクティブ/セレクトを避ける最もクリーンな方法を採用しようとしています。私はまだ列 "Y"の後に "cell.Value = SORNG.Value"のすべてのインスタンスが発生した場合、17以下の値で "cell.Offset(28、-17)"にどのようになったのか理解していません –

+0

私はあなたのデータを持っていないので、なぜそれがそのような列のインデックスになったのか言っていないでしょう。しかし、あなたは前のコード(F8キー)を実行して、即時ウィンドウ(?cell.Value、cell.Address、cell.Parent.Name)を照会して、実際に何が起こっているのかを見ることができます。 – user3598756

関連する問題