2016-04-05 13 views
0

ここでvbbaで初心者。私は単純なFor Eachループ(セル0を無効にする)を、別のFor Eachループ内にネストすることでブック内のすべてのワークシートに適用しようとしています。VBA:ネストされたFor Eachワークシートを変数として使用してループする

私は以下のコードを実行しようとするとエラーが発生し、Setステートメント内の変数としてワークシートを持つことと関係があるかどうかはわかりません。

これを理解して解決策を見つけることはできないようです。

おかげ

Sub deleteNegativeValue() 

Application.DisplayAlerts = False 
Dim lastRow As Long 
Dim ws As Worksheet 
Dim cell As Range 
Dim res As Range 

For Each ws In Workbooks(1).Worksheets 

Set res = ws.Range("1:1").Find("Value", lookat:=xlPart) 
lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row 

For Each cell In Range(ws.Cells(1, res.Column), ws.Cells(lastRow, res.Column)) 
If cell < 0 Then cell = "" 
Next 

Next 

End Sub 
+0

エラーとは何ですか? –

+0

実行時エラー '91':オブジェクト変数またはWithブロック変数が設定されていません。エラーは2番目のビットごとにあるようです – Kactus88

+0

以下の提案に加えて、 "値"が見つかったかどうかをテストする必要があります。おそらく何も含まれていない範囲オブジェクトを返しています。 –

答えて

1

これを試してみてください何かが見つかったことを確認してください

+0

ありがとうございました:) – Kactus88

+0

私は試しましたか? – Vityata

+1

Findのチェックが確実に必要でした。 – Kactus88

0

この方法のために、各秒を試してみてください:に、Findメソッドのチェックが必要である

Sub deleteNegativeValue() 

Dim lastRow As Long 
Dim ws As Worksheet 
Dim cell As Range 
Dim res As Range 

For Each ws In ThisWorkbook.Worksheets 

    Set res = ws.Range("1:1").Find("Value", lookat:=xlPart) 
    lastRow = ws.Range("A" & Rows.Count).End(xlUp).row 
    If Not res Is Nothing Then 
     For Each cell In ws.Range(ws.Cells(1, res.Column), ws.Cells(lastRow, res.Column)) 
      If cell < 0 Then cell = "" 
     Next 
    Else 
     MsgBox "No Value found on Sheet " & ws.Name 
    End If 

Next 

End Sub 

ws.Range(ws.Cells(1, res.Column), ws.Cells(lastRow, res.Column)) 
1

あなたはそれが各列のすべてのセルを反復処理し、代わりに行全体の使用1にFind方法の範囲を限定するものではないため、より高速に実行する必要があり、この

Option Explicit 

Sub deleteNegativeValue() 

Dim ws As Worksheet 
Dim res As Range 

For Each ws In ThisWorkbook.Worksheets 
    Set res = Intersect(ws.Rows(1), ws.UsedRange).Find("value", LookAt:=xlPart) 
    If Not res Is Nothing Then 
     ws.Columns(res.Column).SpecialCells(xlCellTypeConstants, xlNumbers).Replace What:="-*", Replacement:="", SearchOrder:=xlByColumns, MatchCase:=False, LookAt:=xlWhole 
    Else 
     MsgBox "No Value found on Sheet " & ws.Name 
    End If 
Next 

End Sub 

を試みることができます。

唯一の警告は、検索されたすべてのシートの最初の行が空であってはならないということです。

関連する問題